星鉴网>IPFS技术>IPFS入门教程:将文件转换为Merkle树

IPFS入门教程:将文件转换为Merkle树

2019/1/7 17:42:20 1813人阅读

【导读】 本课程将解释IPFS如何将文件表示为Merkle树,探索构成IPFS文件的Merkle树块。

目标

解释IPFS如何将文件表示为Merkle树

探索构成IPFS文件的Merkle树块

脚本

步骤1:下载示例文件并将其添加到IPFS

在本课中,我们需要一个大于256kb的文件。保存下图:



将其保存为“tree-in-cosmos.jpg”,然后将其添加到IPFS

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

第2步:

让我们看一下IPFS如何通过将内容的哈希值传递给ipfs ls命令来在内部表示该文件:

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

这返回了一堆哈希。这与在向ipfs添加文件内容的课程中发生的情况不同,在ipfs中只有一个哈希值。这是因为ipfs将文件分成大约256kb的内容块,然后使用哈希树来表示它们如何组合在一起。

这是IPFS如何使用散列树(也称为Merkle DAG)来表示信息的一个示例。

这种哈希树正式称为Merkle DAG - 这是因为这种数据结构的技术术语是有向无环图或DAG,而一位名叫Ralph Merkle的数学家发明了它们。因此:Merkle DAG,或merkledag。



在这种情况下,我们文件QmWNj1pTS...的哈希是包含4个子块的DAG中根块的哈希。输出ipfs ls列出了这些子块及其大小。

有时子块具有自己的子块。那是Merkle DAG开始看起来像一棵树的时候。该图显示了具有三层子块的Merkle DAG:



具有3层子块的Merkle DAG图(看起来像倒置的树)

你认为它看起来像一棵颠倒的树吗?

第3步:探索哈希树

该ipfs refs和ipfs object links命令等方式来获得在树子块的上市。

试试这些:

$ ipfs refs QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9
ipfs object links -v QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9

如果子块中有更多的子块,您可以使用这些命令来获取这些子子块的哈希值。例如:

$ ipfs object links -v QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh

但这并没有返回任何东西,因为里面没有子块 QmPHPs1P...

第4步:从IPFS中读取内容

如果您使用ipfs cat从ipfs中读取内容,它会处理从哈希树重新组装文件。例如,以下命令将从ipfs中读取我们的示例图像,并将内容写入名为“copy-of-tree-in-cosmos.jpg”的新文件中。运行该命令,然后打开新文件以确认图像仍然完好无损。

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

步骤5:分别检查块

使用这些命令检查哈希树中的块:

ipfs block stat 会告诉你给定块的确切大小(没有子节点)

ipfs refs会告诉你那个街区的所有孩子。这是一个更合适的命令,用于编写在给定对象的每个子块上运行的脚本。

ipfs ls或者ipfs object links会告诉你所有的孩子和他们的大小。

步骤6:读取子块的内容

在某些情况下,您希望从树中检索子块。你可以ipfs cat用来做那件事。您可以使用我们图像中的子块进行测试。

$ ipfs cat QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh

输出看起来与此类似,因为它是图像内容,而不是文本:



第7步:手动组装件

ipfs cat允许您读取每个块的内容,它还允许您连接多个输入。这意味着我们可以通过ipfs cat将所有子块的哈希值传递给该命令来重新构建我们的图像。

ipfs cat QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh QmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVsEUBrjhERRSR QmS7zrNSHEt5GpcaKrwdbnv1nckBreUxWnLaV4qivjaNr3 QmQQhY1syuqo9Sq6wLFAupHBEeqfB8jNnzYUSgZGARJrYa > manually-rebuilt-tree-in-cosmos.jpg

说明

Merkle DAG是IPFS的核心概念。Merkle DAG也是git、bitcoin和dat等技术的核心。

散列树由内容块组成,每个内容块由其加密散列标识。您可以使用其哈希引用任何这些块,这允许您使用这些子块的哈希构建引用其“子块”的块树。

该ipfs add命令将从您指定的文件中的数据中创建Merkle DAG。执行此操作时,它遵循unixfs数据格式。这意味着您的文件被分解为块,然后使用“链接节点”将它们绑定在一起,以树状结构排列。给定文件的“散列”实际上是DAG中根(最上面)节点的散列。对于给定的DAG,您可以轻松查看其下的子块ipfs ls。

13

参与讨论

登录后参加评论......

全部评论 0

作者

返回顶部