生成与 IPFS-Desktop CID 匹配的 CID 的无节点方法

pal*_*one 2 javascript sha256 ipfs

我想在 javascript 中为文件生成 CID(内容标识符),而无需访问 IPFS 节点或互联网。我尝试使用js-multihashing-async首先对文件进行散列,然后使用js-cid从散列生成 CID,但是我得到的 CID 与将文件添加到ipfs-desktop 不同。看起来问题出在 IPFS 节点数据块上,而 CID 用于链接文件块的 DAG。我已经尝试过这个库,但它不会产生与 ipfs-desktop 为同一个文件所做的相同的 CID。这个问题与我的问题基本相同,但没有一个答案给出与 ipfs-desktop-generated CID 匹配的 CID。

小智 5

ipfs-only-hash是用于从文件或缓冲区创建 IPFS CID 的正确模块,而无需启动 IPFS 守护程序。对于相同的输入文件和相同的选项,它应该产生相同的 CID。

这个例子来自ipfs-only-hash测试,它验证它是否将相同的缓冲区散列到与 js-ipfs 节点相同的 CID。

test('should produce the same hash as IPFS', async t => {
  const data = Buffer.from('TEST' + Date.now())
  const ipfs = new Ipfs({ repo: path.join(os.tmpdir(), `${Date.now()}`) })

  await new Promise((resolve, reject) => {
    ipfs.on('ready', resolve).on('error', reject)
  })

  const files = await ipfs.add(data)
  const hash = await Hash.of(data)

  t.is(files[0].hash, hash)
})
Run Code Online (Sandbox Code Playgroud)

https://github.com/alanshaw/ipfs-only-hash/blob/dbb72ccfff45ffca5fbea6a7b1704222f6aa4354/test.js#L21-L33

我IPFS桌面的维护者之一,并在引擎盖下,该应用程序调用ipfs.add上的HTTP API为当地IPFS守护进程在这里

通过 api 手动添加或散列文件时,可以选择更改文件如何分块成块、这些块如何链接在一起以及如何散列块。如果任何选项值不同,则生成的散列和包含它的 CID 将不同,即使输入文件相同。

您可以尝试这些选项,并在此处查看生成的 DAG(有向无环图)结构的可视化:https : //dag.ipfs.io/

要深入了解 IPFS 块和哈希文件的方式,您可以在此处查看解释的作者ipfs-only-hash和维护者https://www.youtube.com/watch?v=Z5zNPwMDYGgjs-ipfs