假设我像这样向 IPFS 添加数据:
$ echo Hello World | ipfs add
这会给我QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u
- CID,它是 Base58 编码的多重哈希。
将其转换为 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
从这里?
UPDATE
data
是原始数据的 Base64 表示:https://github.com/ipfs/go-ipfs/issues/4115