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

Pas*_*cht 6 ipfs

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

$ echo Hello World | ipfs add
Run Code Online (Sandbox Code Playgroud)

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

将其转换为Base16,告诉我IPFS添加的哈希摘要是SHA2-256哈希:

12 - 20 - 74410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca
<hash-type> - <hash-length> - <hash-digest>
Run Code Online (Sandbox Code Playgroud)

我知道IPFS不仅会散列数据,而且实际上会先将其序列化为Unixfs protobuf,然后再将其放入dag中。

我想揭开神秘的面纱,但该如何解决这个问题,74410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca但我不太确定如何掌握已创建的数据,该数据将Unixfs protobuf与数据一起保存。

例如,我可以将序列化的原始数据写入磁盘并使用protobuf解码器进行检查:

$ ipfs block get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u > /tmp/block.raw
$ protoc --decode_raw < /tmp/block.raw
Run Code Online (Sandbox Code Playgroud)

这将使我获得可读格式的序列化数据:

1 {
  1: 2
  2: "Hello World\n"
  3: 12
}
Run Code Online (Sandbox Code Playgroud)

但是,通过SHA-256进行管道传递仍然会给我带来不同的哈希值,这是有道理的,因为IPFS会将protobuf置于dag中并对其进行多次哈希处理。

$ protoc --decode_raw < /tmp/block.raw | shasum -a 256
Run Code Online (Sandbox Code Playgroud)

因此,我决定弄清楚如何掌握该dag节点,自己对其进行哈希处理,以获取所需的哈希值。

我希望使用它ipfs dag get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u可以给我提供一个多哈希,然后可以对其进行解码,但是事实证明,它会返回一些我不知道如何检查的其他数据哈希:

$ ipfs dag get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u
$ {"data":"CAISDEhlbGxvIFdvcmxkChgM","links":[]}
Run Code Online (Sandbox Code Playgroud)

关于如何data从此处解码的任何想法?

更新

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

Ste*_*ven 7

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

而不是运行:

protoc --decode_raw < /tmp/block.raw | shasum -a 256
Run Code Online (Sandbox Code Playgroud)

赶紧跑:

shasum -a 256 < /tmp/block.raw
Run Code Online (Sandbox Code Playgroud)

但事实证明它返回了一些我不知道如何检查的其他数据哈希

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

在:

1 {
  1: 2
  2: "Hello World\n"
  3: 12
}
Run Code Online (Sandbox Code Playgroud)

所述1 { ... }部分是数据外的protobuf的字段。但是,protoc --decode_raw *recursively* decodes this object so it decodes theData` 字段为:

  • 字段 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;
}
Run Code Online (Sandbox Code Playgroud)

内:

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;
}
Run Code Online (Sandbox Code Playgroud)