【问题标题】:Node-less way to generate a CID that matches IPFS-Desktop CID生成与 IPFS-Desktop CID 匹配的 CID 的无节点方式
【发布时间】:2020-05-19 15:28:08
【问题描述】:

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

【问题讨论】:

  • 鉴于js-cid 是开源的:你有没有问过为什么他们的CID 与ipfs-desktopgithub.com/multiformats/js-cid/issues 上产生的不匹配?也许这是一个错误,你在这里而不是在正确的地方发帖意味着它永远不会得到修复。或者,也许您只是使用错误的论据来调用它,在这种情况下,维护该软件的人是向您指出这一点的最佳人选。
  • @Mike'Pomax'Kamermans 我知道它不应该只使用 js-cid 工作,因为 IPFS 生成的 CID 是(据我了解)文件的 256KB 大小的块的 DAG 的 CID。我在 ipfs-only-hash 中打开了一个问题,因为这个 repo 似乎应该提供与 ipfs 节点相同的 CID。

标签: javascript sha256 ipfs


【解决方案1】:

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)
})

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

我是 IPFS 桌面的维护者之一,在后台,该应用程序在 http api 上为本地 IPFS 守护进程调用 ipfs.add here

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

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

要深入了解 IPFS 如何对文件进行分块和哈希处理,您可以查看ipfs-only-hash 的作者和js-ipfs 的维护者在此处解释https://www.youtube.com/watch?v=Z5zNPwMDYGg

【讨论】:

    【解决方案2】:

    为了后代,这里是如何将通过 fetch 下载的图像的 CID 与从 ipfs-desktop 为同一图像生成的 CID 匹配(作为文件从本地驱动器添加)。您必须删除前缀 data:*/*;base64, 附加到图像的 base64 字符串并将字符串解码为缓冲区数组。然后你得到匹配的 CID。

    async testHashes() {
      const url = "https://raw.githubusercontent.com/IanPhilips/jst-cids-test/master/src/23196210.jpg";
      fetch(url)
        .then(response => response.blob())
        .then(blob => new Promise((resolve, reject) => {
            const reader = new FileReader();
            reader.onloadend = () => resolve(reader.result);
            reader.readAsDataURL(blob)
    
        })).then(async dataUrl =>{
    
            const strData = dataUrl as string;
            // remove "data:*/*;base64," from dataUrl
            const endOfPrefix = strData.indexOf(",");
            const cleanStrData = strData.slice(endOfPrefix+1);
            const data = Buffer.from(cleanStrData, "base64");
            const hash = await Hash.of(data);
            console.log("fetch data CID: " + hash); // QmYHzA8euDgUpNy3fh7JRwpPwt6jCgF35YTutYkyGGyr8f
        });
    
      console.log("ipfs-desktop CID: QmYHzA8euDgUpNy3fh7JRwpPwt6jCgF35YTutYkyGGyr8f");
    }
    

    【讨论】:

      猜你喜欢
      • 2022-06-30
      • 1970-01-01
      • 2021-11-01
      • 2021-12-02
      • 2012-09-11
      • 2019-05-13
      • 2017-04-27
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多