当大于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 refs 、 ipfs 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 statwill tell you the exact size of a given block (without its children)ipfs refswill 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 lsoripfs object linkswill 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 DAG 是 IPFS核心概念。
Merkle DAG同样也是 git, bitcoin 和 dat 的核心技术。
哈希树是由内容块组成的、其中的内容块通过各自唯一的加密哈希值标识。
我们可以通过具体的哈希值引用某个内容块、通过哈希值我们也可以构建出一个哈希树。
ipfs add 命令会创建一个哈希树用于对应并标识具体文件中的数据。在构建哈希树的过程中:
ipfs add命令遵从单元数据格式、执行数据文件的切割操作生产子块。- 这意味着文件被切割成
子块、不同块之间通过链接方式以节点的形态生成一个哈希树。 - 每个数据文件的哈希值作为这个哈希树的
根节点构成一个DAG。 - 对于一个 给定的
DAG,我们可以通过ipfs ls便捷查看这个DAG中的子节点(即子块)。