gpt4 book ai didi

ipfs - 如何在 IPFS 中重新创建多哈希的哈希摘要

转载 作者:行者123 更新时间:2023-12-04 14:38:27 25 4
gpt4 key购买 nike

假设我像这样向 IPFS 添加数据:

$ echo Hello World | ipfs add

这会给我 QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u - 一个 CID,它是一个 Base58 编码的 Multihash。

将其转换为 Base16,告诉我 IPFS 添加的哈希摘要是 SHA2-256 哈希:
12 - 20 - 74410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca
<hash-type> - <hash-length> - <hash-digest>

我知道 IPFS 不仅对数据进行哈希处理,而且实际上首先将其序列化为 Unixfs protobuf,然后将其放入 dag 中。

我想揭开神秘面纱,如何获得 74410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca,但我不确定如何获得包含数据的 Unixfs protobuf 的已创建 dag。

例如,我可以将序列化的原始数据写入磁盘并使用 protobuf 解码器检查它:
$ ipfs block get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u > /tmp/block.raw
$ protoc --decode_raw < /tmp/block.raw

这将为我提供可读格式的序列化数据:
1 {
1: 2
2: "Hello World\n"
3: 12
}

但是,通过 SHA-256 进行管道传输仍然会给我一个不同的哈希值,这是有道理的,因为 IPFS 将 protobuf 放在一个 dag 中并对其进行多重哈希处理。
$ protoc --decode_raw < /tmp/block.raw | shasum -a 256

所以我决定弄清楚如何获得那个 dag 节点,自己对它进行散列以获得我正在寻找的散列。

我希望使用 ipfs dag get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u 会给我一个可以解码的多散列,但事实证明它返回了一些我不知道如何检查的其他数据散列:
$ ipfs dag get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u
$ {"data":"CAISDEhlbGxvIFdvcmxkChgM","links":[]}

关于如何从这里解码 data 的任何想法?

更新
data 是原始数据的 Base64 表示: https://github.com/ipfs/go-ipfs/issues/4115

最佳答案

您要查找的哈希值是 ipfs block get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u 的输出的哈希值。 . IPFS 对编码值进行哈希处理。

而不是运行:

protoc --decode_raw < /tmp/block.raw | shasum -a 256

赶紧跑:
shasum -a 256 < /tmp/block.raw

but it turns out it returns some other data hash that I don't know how to inspect



那是因为我们目前在 protobuf 中使用 protobuf。外层protobuf的结构是 {Data: DATA, Links: [{Name: ..., Size: ..., Hash: ...}]} .

在:
1 {
1: 2
2: "Hello World\n"
3: 12
}
1 { ... } part是外层protobuf的Data字段。然而, protoc --decode_raw *recursively* decodes this object so it decodes the数据`字段到:
  • 字段 1(数据类型):2(文件)
  • 字段 2(数据):“Hello World\n”
  • 字段 3(文件大小):12(字节)

  • 对于上下文,相关的 protobuf 定义是:

    外:
    // An IPFS MerkleDAG Link
    message PBLink {

    // multihash of the target object
    optional bytes Hash = 1;

    // utf string name. should be unique per object
    optional string Name = 2;

    // cumulative size of target object
    optional uint64 Tsize = 3;
    }

    // An IPFS MerkleDAG Node
    message PBNode {

    // refs to other objects
    repeated PBLink Links = 2;

    // opaque user data
    optional bytes Data = 1;
    }

    内:
    message Data {
    enum DataType {
    Raw = 0;
    Directory = 1;
    File = 2;
    Metadata = 3;
    Symlink = 4;
    HAMTShard = 5;
    }

    required DataType Type = 1;
    optional bytes Data = 2;
    optional uint64 filesize = 3;
    repeated uint64 blocksizes = 4;

    optional uint64 hashType = 5;
    optional uint64 fanout = 6;
    }

    message Metadata {
    optional string MimeType = 1;
    }

    关于ipfs - 如何在 IPFS 中重新创建多哈希的哈希摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51655352/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com