ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

js-ipfs Bitswap API 完全指南:wantlist、unwant 与 stat 的实战用法与底层原理

js-ipfs Bitswap API 完全指南:wantlist、unwant 与 stat 的实战用法与底层原理 存储网络通信【免费下载链接】js-ipfsIPFS implementation in JavaScript项目地址https://gitcode.com/gh_mirrors/js/js-ipfs点击查看免费下载本篇技术指南聚焦 js-ipfsIPFS 的 JavaScript 实现中ipfs.bitswap.*这一组核心 API系统讲解如何读取本节点与对等节点的 wantlist需求列表、如何主动撤销对某个块的请求unwant以及如何获取 Bitswap 引擎的诊断统计信息。读者将掌握四个方法wantlist、wantlistForPeer、unwant、stat的参数、返回值、代码示例与 CLI/HTTP 两种调用形态并能结合源码理解其底层实现链路。Bitswap 与 wantlist 机制简介Bitswap 是 IPFS 的数据交换block 传输协议当一个节点需要某个 block 时会把它对应的 CID 加入自己的wantlist并向网络中广播我想要这些块的意愿持有该 block 的对等节点收到后便会通过 Bitswap 协议把数据发送过来。因此wantlist 直观反映了节点当前正在向网络索要哪些数据块。在 js-ipfs 中Bitswap 的全部对外能力被收敛在ipfs.bitswap命名空间下共包含四个方法方法作用ipfs.bitswap.wantlist([options])返回本节点当前的 wantlistipfs.bitswap.wantlistForPeer(peerId, [options])返回某个已连接对等节点的 wantlistipfs.bitswap.unwant(cids, [options])从 wantlist 中移除一个或多个 CIDipfs.bitswap.stat([options])返回 Bitswap 引擎的诊断统计信息所有方法都遵循同一个模式接收可选的 options 对象timeout与signal返回 Promise。这一接口签名由 ipfs-core-types/src/bitswap/index.ts 中的API接口统一定义js-ipfs 的进程内实现ipfs-core、HTTP 客户端ipfs-http-client以及 gRPC 客户端都遵循同一套类型契约。ipfs.bitswap.wantlist([options])获取本节点 wantlist参数与选项Parameters无。Options可选对象支持以下键NameTypeDefaultDescriptiontimeoutNumberundefined超时时间单位毫秒signalAbortSignalundefined用于取消本次调用触发的任何长时间运行请求返回值TypeDescriptionPromiseCID[]当前 wantlist 中的 CID 数组示例const list await ipfs.bitswap.wantlist() console.log(list) // [ CID(QmHash) ]源码实现原理进程内实现位于 packages/ipfs-core/src/components/bitswap/wantlist.js核心逻辑只有两步async function wantlist (options {}) { const { bitswap } await network.use(options) const list bitswap.getWantlist() return Array.from(list).map(e e[1].cid) }其中network.use(options)负责按需启动/接入网络服务并取出底层的ipfs-bitswap引擎实例bitswap.getWantlist()返回的是一个 Map键为 peer值为 entryentry 内含cid因此外层通过Array.from(list).map(e e[1].cid)提取出 CID 数组。最终整个方法被withTimeoutOption包装从而获得统一的timeout支持该包装器来自 ipfs-core-utils/src/with-timeout-option.js。值得注意的一个行为细节离线offline节点无法执行此调用。在 interface-ipfs-core/src/bitswap/wantlist.js 的测试中it(should not get the wantlist when offline)先 spawn 一个节点再node.stop()停掉它随后断言node.api.bitswap.stat()会被 reject——同理离线时wantlist也会因无法使用网络服务而失败。测试验证接口测试套件位于 interface-ipfs-core/src/bitswap/wantlist.js覆盖了以下关键场景should respect timeout option when getting bitswap wantlist验证timeout选项生效should get the wantlist通过ipfsB.block.get(cid)触发对某个块的请求再等待该 CID 出现在ipfsB的 wantlist 中should remove blocks from the wantlist when requests are cancelled用AbortController中止一个dag.get请求验证被中止的请求对应的 CID 会从 wantlist 中移除should keep blocks in the wantlist when only one request is cancelled同一 CID 有两个并发请求时仅中止其中一个该 CID 仍应保留在 wantlist 中直到最后一个请求也被中止。这些测试直观展示了signal选项与 wantlist 生命周期之间的联动wantlist 条目是按引用计数管理的只有所有请求都被取消或完成条目才会真正被移除。ipfs.bitswap.wantlistForPeer(peerId, [options])获取对等节点 wantlist参数与选项NameTypeDefaultDescriptionpeerIdPeerId—要查询其 wantlist 的对等节点 ID必填Options与wantlist相同支持timeout毫秒与signalAbortSignal默认均为undefined。返回值TypeDescriptionPromiseCID[]该对等节点当前 wantlist 中的 CID 数组示例const list await ipfs.bitswap.wantlistForPeer(peerId) console.log(list) // [ CID(QmHash) ]源码实现原理实现位于 packages/ipfs-core/src/components/bitswap/wantlist-for-peer.js逻辑与wantlist几乎一致区别在于底层调用改为bitswap.wantlistForPeer(peerId)async function wantlistForPeer (peerId, options {}) { const { bitswap } await network.use(options) const list bitswap.wantlistForPeer(peerId) return Array.from(list).map(e e[1].cid) }这一方法可以用于观察某个对等节点正从我这里或从网络上要什么是分析数据流动方向、排查对方为何迟迟不收到某个块的重要诊断手段。ipfs.bitswap.unwant(cids, [options])从 wantlist 移除 CID参数与选项NameTypeDescriptioncids一个 CID 或 CID 数组要从 wantlist 中移除的 CIDOptions同样支持timeout毫秒与signalAbortSignal。返回值TypeDescriptionPromisevoid请求完成后 resolve 的 Promise示例let list await ipfs.bitswap.wantlist() console.log(list) // [ CID(QmHash) ] await ipfs.bitswap.unwant(cid) list await ipfs.bitswap.wantlist() console.log(list) // []源码实现原理实现位于 packages/ipfs-core/src/components/bitswap/unwant.js。源码内部做了一个便捷归一化处理当传入单个 CID 而非数组时会自动包装成数组再交给底层引擎async function unwant (cids, options {}) { const { bitswap } await network.use(options) if (!Array.isArray(cids)) { cids [cids] } return bitswap.unwant(cids) }unwant的典型应用场景包括取消不再需要的数据下载、释放 wantlist 空间、或在请求被AbortController中止后做显式清理尽管如测试所示中止请求本身通常会自动触发条目移除。ipfs.bitswap.stat([options])Bitswap 诊断统计注意bitswap.stat与stats.bitswap可以互换使用。参数与选项Parameters无。Options支持timeout毫秒与signalAbortSignal。返回值TypeDescriptionPromiseObject包含 Bitswap 引擎信息的对象返回对象包含以下键provideBufLen整数待提供的块缓冲区长度wantlistCID 数组peersPeerId 数组blocksReceivedBigInt收到的块数量dataReceivedBigInt收到的数据字节数blocksSentBigInt发送的块数量dataSentBigInt发送的数据字节数dupBlksReceivedBigInt收到的重复块数量dupDataReceivedBigInt收到的重复数据字节数。注文档与实现中除provideBufLen外均为BigInt类型因此在大数值场景下需要调用Number()或.toString()转换后才能直接参与普通数值运算。示例const stats await ipfs.bitswap.stat() console.log(stats) // { // provideBufLen: 0, // wantlist: [ CID(QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM) ], // peers: // [ QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM, // QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu, // QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd ], // blocksReceived: 0, // dataReceived: 0, // blocksSent: 0, // dataSent: 0, // dupBlksReceived: 0, // dupDataReceived: 0 // }源码实现原理实现位于 packages/ipfs-core/src/components/bitswap/stat.js。它调用底层ipfs-bitswap引擎的bitswap.stat().snapshot快照并把引擎的内部计数转换为 Core API 定义的结构const snapshot bitswap.stat().snapshot return { provideBufLen: parseInt(snapshot.providesBufferLength.toString()), blocksReceived: BigInt(snapshot.blocksReceived.toString()), wantlist: Array.from(bitswap.getWantlist()).map(e e[1].cid), peers: bitswap.peers(), dupBlksReceived: BigInt(snapshot.dupBlksReceived.toString()), dupDataReceived: BigInt(snapshot.dupDataReceived.toString()), dataReceived: BigInt(snapshot.dataReceived.toString()), blocksSent: BigInt(snapshot.blocksSent.toString()), dataSent: BigInt(snapshot.dataSent.toString()) }其中dupBlksReceived/dupDataReceived统计的是重复收到的数据——在正常网络抖动或对等节点重复推送时该值会增长它是评估传输效率与网络质量的重要指标。类型定义可参考 ipfs-core-types/src/bitswap/index.ts 中的Stats接口。底层实现BitswapAPI类的组装以上四个方法并不是零散散落在ipfs-core各处的而是统一在 packages/ipfs-core/src/components/bitswap/index.js 的BitswapAPI类中完成组装。该类只依赖一个network服务NetworkService构造时把四个工厂函数注入为实例方法export class BitswapAPI { constructor ({ network }) { this.wantlist createWantlist({ network }) this.wantlistForPeer createWantlistForPeer({ network }) this.unwant createUnwant({ network }) this.stat createStat({ network }) } }这种组件 工厂函数的写法是 js-ipfs 各功能模块block、dag、files 等的统一组织模式每个 API 方法都是独立可测试的工厂函数通过依赖注入获得所需的网络能力便于在浏览器、Node.js 等不同环境复用。CLI 与 HTTP API 形态CLI 命令js-ipfs 的 CLIipfs-cli将上述 API 暴露为子命令源文件位于 packages/ipfs-cli/src/commands/bitswap/ipfs bitswap wantlist [peer]打印本节点或指定对等节点的 wantlist。不传peer时等价于ipfs.bitswap.wantlist()传入peer或-p时等价于ipfs.bitswap.wantlistForPeer(peer)。实现见 wantlist.jsipfs bitswap unwant key从 wantlist 移除指定 keyCID实现见 unwant.jsipfs bitswap stat打印 Bitswap 诊断信息实现见 stat.js。三个命令都支持两个公共选项选项说明--cid-base展示 CID 所使用的进制默认base58btc注意对 v0 CID 指定进制无效--timeout超时时间字符串形式如10s内部通过parse-duration解析为毫秒bitswap stat还额外支持--human标志开启后字节数会通过pretty-bytes格式化为人类可读形式如KB/MBwantlist 显示为[N keys]其余数值转为普通 Number输出示例bitswap status provides buffer: 0 blocks received: 0 blocks sent: 0 data received: 0B data sent: 0B dup blocks received: 0 dup data received: 0B wantlist [0 keys] partners [0]HTTP APIipfs-http-client提供了完全等价的远程调用能力端点定义在 packages/ipfs-http-server/src/api/routes/bitswap.jsHTTP 端点POST对应 API/api/v0/bitswap/wantlistwantlist/wantlistForPeer带peer查询参数时/api/v0/bitswap/statstat/api/v0/bitswap/unwantunwant查询参数arg或cidHTTP 服务端通过 Hapi 路由与 Joi 校验参数wantlist与stat端点都接受peer仅 wantlist、cid-base默认base58btc与timeout查询参数详见 resources/bitswap.js。HTTP 客户端的实现位于 packages/ipfs-http-client/src/bitswap/例如wantlist发 POST 请求并把响应中的Keys反序列化为CID[]const res await (await api.post(bitswap/wantlist, { signal: options.signal, searchParams: toUrlSearchParams(options), headers: options.headers })).json() return (res.Keys || []).map(k CID.parse(k[/]))而stat客户端在拿到响应后会把 HTTP 网关返回的 PascalCase 字段ProvideBufLen、BlocksReceived、Wantlist、Peers等统一映射回 Core API 的 camelCase 结构provideBufLen、blocksReceived、wantlist、peers…并完成BigInt与PeerId的转换见 stat.js。这也解释了为何无论通过进程内 API 还是 HTTP 远程调用开发者拿到的返回对象结构完全一致。实战建议监控数据流动定期调用ipfs.bitswap.stat()重点观察blocksReceived/dataReceived与dupDataReceived的比值——重复数据占比过高通常意味着网络拓扑中存在冗余传输控制下载行为当某个大文件不再需要时及时用ipfs.bitswap.unwant(cid)清理 wantlist避免节点继续向网络索要数据、浪费带宽善用 signal 取消所有四个方法都接受AbortSignal。结合AbortController可以优雅地中止长时间未完成的请求且如测试所示被中止请求对应的 wantlist 条目会自动清理引用计数归零时离线节点不可用wantlist/stat 依赖网络服务离线节点调用会 reject请在调用前用ipfs.isOnline()或 try/catch 做保护CLI 快速排查在调试环境直接运行ipfs bitswap stat --human与ipfs bitswap wantlist可快速掌握节点当前的数据交换状态。更多接口测试示例可在 interface-ipfs-core/src/bitswap/ 目录下找到它覆盖了wantlist、wantlistForPeer、unwant、stat四个方法的完整行为契约是编写依赖 Bitswap API 的应用时最权威的行为参考。赞分享存储网络通信【免费下载链接】js-ipfsIPFS implementation in JavaScript项目地址https://gitcode.com/gh_mirrors/js/js-ipfs点击查看免费下载相关推荐为什么Etcher正在改变操作系统镜像烧录的工作方式为什么Etcher正在改变操作系统镜像烧录的工作方式 想象一下这样的场景你刚刚下载了最新的树莓派操作系统镜像准备为你的物联网项目创建一个启动盘。传统的方法需存储网络通信Cytoscape.js 元素动画完全指南eles.animate() 的 API 用法与底层实现原理Cytoscape.js 元素动画完全指南eles.animate 的 API 用法与底层实现原理 本文聚焦 Cytoscape.js 图库中 元素集合co数据可视化pylibcudf 字符串 API 实战指南capitalize / title / is_title 的用法与底层原理pylibcudf 字符串 API 实战指南capitalize / title / is_title 的用法与底层原理 cuDF 的 pylibcudf 是数据分析数据工程机器学习上一篇2025视觉生成新范式VAR如何突破扩散模型效率瓶颈下一篇如何用sentence-transformers构建烟草行业质量检测报告智能分析系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表