【p2p、分布式,区块链笔记 IPFS】网关+多地址+HTTP RPC API+kubo-rpc-client

目录

  • CG

  • 在 IPFS 中,网关是提供公共访问接口的服务器,它们允许你通过 HTTP 协议访问 IPFS 网络中的内容,通常形式为 http://<gateway>/ipfs/<cid> 。网关扮演着桥梁的角色,其通过提供传统 HTTP 协议的入口,使得非 IPFS 用户也能够方便地访问存储在 IPFS 上的文件和数据。gateway为多地址(multiaddress)形式。

multiaddr API 多地址

  • IPFS 节点使用多地址(multiaddress)来指定不同的通信协议和网络层。
  • IPFS 支持多种类型的多地址(multiaddr)格式,支持多种协议(如 https, http, ws, wss 等),以及不同类型的连接方式(如通过 DNS、IP 地址、WebSocket 等)。例如:
    • DNS 地址 :/dns4/{hostname}/https/

    • IP 地址 :/ip4/{ip}/tcp/{port}

      • 例如:/ip4/192.168.1.100/tcp/5001,表示连接到 IP 地址 192.168.1.100 上的 IPFS 节点,使用 TCP 协议和 5001 端口。
    • WebSocket 连接 :/ip4/{ip}/tcp/{port}/ws

      • 如果你使用 WebSocket 协议与节点通信,可以使用这样的地址,例如 /ip4/127.0.0.1/tcp/5001/ws。
    • IPv6 地址 :/ip6/{ipv6_address}/tcp/{port}

      • 如果你希望通过 IPv6 地址连接到 IPFS 节点,可以使用类似 /ip6/2001:db8::/tcp/5001 这样的格式。

示例

  1. IPFS 提供商

    javascript 复制代码
    const API_MULTIADDR = "/dns4/ipfs.io/https/"; // 使用 ipfs.io 作为网关
    // 有些提供商(如 Pinata、Fleek、Infura 等)提供了专用的 IPFS API 端点:
    const API_MULTIADDR = "/dns4/ipfs.infura.io/https/";  // Infura 网关
    const API_MULTIADDR = "/dns4/ipfs.pinata.cloud/https/"; // Pinata 网关
  2. 使用本地运行的 IPFS 节点

    javascript 复制代码
    const API_MULTIADDR = "/ip4/127.0.0.1/tcp/5001"; // 本地节点
  3. 使用 WebSocket 连接

    javascript 复制代码
    const API_MULTIADDR = "/ip4/127.0.0.1/tcp/5001/ws"; // WebSocket 连接

kubo-rpc-client

  • 当 Kubo IPFS 节点作为守护进程运行时,它会公开一个 HTTP RPC API,kubo-rpc-client(npm i kubo-rpc-client)用于连接RPC API的服务地址,允许您控制节点并运行与命令行相同的命令。

连接服务 create(options)

cpp 复制代码
import { create } from 'kubo-rpc-client'

// connect to ipfs daemon API server
const ipfs = create('http://localhost:5001') // (the default in Node.js)

// or connect with multiaddr
const ipfs = create('/ip4/127.0.0.1/tcp/5001')

// or using options
const ipfs = create({ host: 'localhost', port: '5001', protocol: 'http' })

// or specifying a specific API path
const ipfs = create({ host: '1.1.1.1', port: '80', apiPath: '/ipfs/api/v0' })

添加数据

cpp 复制代码
const { cid } = await client.add('Hello world!')

读取数据

cpp 复制代码
const chunks = [];
for await (const chunk of ipfs.cat(cidToFetch)) {
  chunks.push(chunk);
}
const allChunks = new Uint8Array(chunks.reduce((acc, chunk) => [...acc, ...chunk], []));
const content = new TextDecoder().decode(allChunks);
  • 读取的chunk为Uint8Array数据(8 位无符号整数数组),CID的数据太长会分片,示例:Uint8Array(10) 72, 69, 76, 76, 79, 87, 79, 82, 76, 68, buffer: ArrayBuffer(10), byteLength: 10, byteOffset: 0, length: 10, Symbol(Symbol.toStringTag): 'Uint8Array'

使用示例

nodejs

js 复制代码
// sudo apt update && sudo apt install -y nodejs npm
// https://codesandbox.io/examples/package/kubo-rpc-client
// https://codesandbox.io/p/sandbox/ipfs-upload-and-fetch-v8-4cggs3
import { randomBytes } from "crypto";
import { create } from "kubo-rpc-client";

const DATA_SIZE = 512001;

//const DATA_SIZE = 1860000;
const API_MULTIADDR = "/dns4/ipfs-upload.v8-bellecour.iex.ec/https/";

const GATEWAYS = ["https://ipfs-gateway.v8-bellecour.iex.ec"];

const upload = async () => {
  try {
    const ipfs = create(API_MULTIADDR);
    const buffer = randomBytes(DATA_SIZE);
    console.log(`adding ${buffer.length} random bytes`);
    const result = await ipfs.add(buffer);
    console.log(`ipfs add ok`);
    const { cid } = result;
    console.log(`added ${cid.toString()}`);

    await Promise.all(
      GATEWAYS.map((gateway) =>
        fetch(`${gateway}/ipfs/${cid.toString()}`)
          .then((res) => {
            if (!res.ok) {
              throw Error(`${gateway} bad response: ${res.status}`);
            } else {
              console.log(`found ${cid.toString()} on ${gateway}`);
            }
          })
          .catch((e) => console.error(e.message))
      )
    );
  } catch (e) {
    console.error(e.message);
  }
};

const upload_cid = async () => {
  try {
    const { cid } = "QmWp48QrabA75rUF86iEkiEMLq222YiE37D76gTtoJocxS";
    console.log(`try to download ${cid}`);

    await Promise.all(
      GATEWAYS.map((gateway) =>
        fetch(`${gateway}/ipfs/${cid}`)
          .then((res) => {
            if (!res.ok) {
              throw Error(`${gateway} bad response: ${res.status}`);
            } else {
              console.log(`found ${cid.toString()} on ${gateway}`);
            }
          })
          .catch((e) => console.error(e.message))
      )
    );
  } catch (e) {
    console.error(e.message);
  }
};

const button = document.getElementById("upload-button");
const button2 = document.getElementById("upload-cid");

button.addEventListener("click", () => upload());
button2.addEventListener("click", () => upload());

button.disabled = false;
button2.disabled = false;

浏览器直接使用

复制代码
<script src="https://unpkg.com/kubo-rpc-client/dist/index.min.js"></script> // https://github.com/ipfs/js-kubo-rpc-client

CG

相关推荐
海棠Flower未眠3 小时前
下单请求处理流程:商品维度分布式锁与 Redis 预扣库存
redis·分布式·junit
罗四强4 小时前
第10篇:打包上架:签名、打包 HAP、发布到华为应用市场
分布式·操作系统·harmonyos·arkts·鸿蒙系统
秋饼4 小时前
Redis 全面解析:从数据结构到主从/哨兵/集群、分布式锁与面试高频考点,代码到原理一次讲透
数据库·redis·分布式·面试·后端开发
二月夜4 小时前
Redis 高频面试题全解:缓存三大问题、大 key 治理与分布式锁之争(2026 招聘 JD 真题复盘)
redis·分布式·后端·缓存
樱花落木兰4 小时前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
2301_776045235 小时前
山寨币与比特币之间的关系
大数据·人工智能·区块链
真上帝的左手7 小时前
12. 消息队列-Kafka进阶
分布式·中间件·kafka
JF_Ma19 小时前
1000个量化策略第29例:经典红利低波策略
区块链
AlanAshley1 天前
实时湖仓与区块链:数据架构的信任革命
架构·区块链
Thanks_ks1 天前
Cookie 和 Session 到底是什么关系——登录态是怎么维持的
分布式·http·jwt·cookie·session·后端开发·登录态