IPFS 数据切分(默克尔DAG)

926 阅读2分钟

当大于256K的一个数据被添加到IPFS网络时,数据会被自动切分成以256K为单位的多个block。

这个过程是默克尔树DAG生成的过程。

Step 1:使用ipfs add命令


添加 "tree-in-cosmos.jpg" 到 IPFS网络:

$ ipfs add tree-in-cosmos.jpg
added QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9

Step 2:使用 ipfs ls 命令


然后我们使用 ipfs ls 命令查看这"tree-in-cosmos.jpg"的哈希值的详细信息:

ipfs ls -v QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9
Hash                                           Size   Name
QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh 262158
QmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVsEUBrjhERRSR 262158
QmS7zrNSHEt5GpcaKrwdbnv1nckBreUxWnLaV4qivjaNr3 262158
QmQQhY1syuqo9Sq6wLFAupHBEeqfB8jNnzYUSgZGARJrYa 76151

我们发现:这个哈希值是由多个不同哈希值构成的。 对于大小低于256K的数据,不会出现这样现象,大小低于256K的数据的哈希值是一个哈希值构成的。

出现多个哈希值构成一个哈希值,表示当前数据是由一个哈希树表示的。

IPFS hash tree 就是 Merkle DAG

Step 3: Hash Tree


同样,我们可以通过 ipfs refsipfs object links 命令查看指定哈希树中的子块(sub-blocks) 。

$ ipfs refs QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9
ipfs object links -v QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9

如果子块(sub-blocks)中继续包含子块(sub-blocks),那么使用这样的命令可以继续查看更详细的子块信息(sub-blocks):

$ ipfs object links -v QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh

不过,这时候上述命令并不会有输出信息。

Step 4: 从IPFS网络中读取数据


使用 ipfs cat 读取数据的过程:但目标数据是由子块构成的时候,该命令会根据目标数据所对应的哈希树(默克尔DAG),重新组装、并生成目标数据。

最终生产的目标数据是一个完整的数据文件。

$ ipfs cat QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9 > copy-of-tree-in-cosmos.jpg

Step 5: 分别检查块数据


使用下面的命令可以检查哈希树(默克尔DAG)中的块数据:

  • ipfs block stat will tell you the exact size of a given block (without its children)
  • ipfs refs will tell you all the children of that block. This is a more suitable command for scripting something to run on each child block of a given object.
  • ipfs ls or ipfs object links will show you all children and their sizes.

Step 6: 读取子块(sub-block)的内容


有时候可能会希望获得子块数据,这时候可以使用 ipfs cat 命令,不过通常这样做并没有实际的意义:

$ ipfs cat QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh

输出以下数据内容:

<FF><D8><FF><E0>^@^PJFIF^@^A^A^@^@^A^@^A^@^@<FF><FE>^@;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 95
<FF><DB>^@C^@^B^A^A^A^A^A^B^A^A^A^B^B^B^B^B^D^C^B^B^B^B^E^D^D^C^D^F^E^F^F^F^E^F^F^F^G  ^F^G     ^G^F^F^H^K^H   


???w!1AQaq"2B????    #3R?br?
$4?%?&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????
,?y?ՠ|ѿiMgᦧk?_?WN??W????F!%T 8?W???I$uZ?????K?\?olng?H|?????@?#8?En?1??;

Step 7: 手动组装数据片

ipfs cat 命令可以用来手动组装数据(数据还原),例如:

ipfs cat QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh QmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVipfs cat QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh QmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVss

不过,通常没有必要这样做。

解释


Merkle DAGIPFS核心概念。

Merkle DAG同样也是 git, bitcoindat 的核心技术。

哈希树是由内容块组成的、其中的内容块通过各自唯一的加密哈希值标识。

我们可以通过具体的哈希值引用某个内容块、通过哈希值我们也可以构建出一个哈希树

ipfs add 命令会创建一个哈希树用于对应并标识具体文件中的数据。在构建哈希树的过程中:

  1. ipfs add 命令遵从单元数据格式、执行数据文件的切割操作生产子块
  2. 这意味着文件被切割成子块、不同块之间通过链接方式以节点的形态生成一个哈希树
  3. 每个数据文件的哈希值作为这个哈希树的根节点构成一个 DAG
  4. 对于一个 给定的DAG,我们可以通过 ipfs ls便捷查看这个DAG中的子节点(即子块)。

参考


flyingzumwalt.gitbooks.io/decentraliz…