【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

本文由IPFS原力区收集译制,版权所属原作者 【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

当你向某人询问他们最喜欢的猫咪视频时,他们可能不会说“哦,哈哈,这个服务器上的那个,在这个子域中,在这个文件路径下,斜杠滑稽的dash cat . mp4”之类的话。相反,他们可能会描述视频的内容:“哦,哈哈,那个猫把柜台上的玻璃敲掉的视频,暴徒风格……经典”。对于人类来说,这显然是一种直观的思考内容的方式,但通常不是我们今天在web上访问内容的方式。尽管如此,诸如IPFS之类的分散协议实际上确实使用这种类型的内容寻址来查找分散web上的内容。在本文中,我们将探讨一下整个过程是如何工作的,深入了解一下将文件添加到IPFS时会发生什么。在此期间,我们将花费大量时间学习IPLD,即星际文件系统的底层数据结构。

指纹识别

所以,首先,为了支持内容寻址,我们需要想出一些方法来创建一个“指纹”或内容摘要,我们可以用它来引用这些内容。类似于找一本书,我们使用ISBN数字。在实践中,web上的内容寻址系统(如IPFS)使用加密哈希函数创建指纹。基本上,我们获取原始内容(在本例中是一张cat照片),并通过散列函数运行该数据,以生成摘要。此摘要保证对文件(或图像或其他内容)的内容具有密码惟一性,并且仅对该文件具有惟一性。如果我稍微改变一下文件,哈希值就会完全不同。

【IPFS相关】当您向IPFS添加文件时,实际发生了什么?      我们已经哈希了图像(创建了摘要),        现在呢?我们要找的是内容地址/标识符。所以我们现在需要把这个摘要转换成IPFS和其他系统可以用来定位它的东西……但这并不那么简单。如果将来发生了变化,而我们想要改变处理内容的方式,该怎么办?如果有人发明了一个更好的哈希函数呢?甚至我们现在的IP系统也不得不进行升级。我们IPFS的好人们也会想到这一点的!

Multihashing

您是否注意到IPFS散列似乎都是从Qm开始的?这是因为这些散列实际上是一种叫做多散列的东西。这很酷,因为哈希本身指定了它使用的哈希函数,以及在multihash的前两个字节中生成的哈希的长度。在我们的大多数例子中,十六进制的第一部分是12,其中12表示这是SHA256哈希函数,输出长度是20,十六进制(或32字节),这就是我们从base58编码整个东西时得到Qm的地方。那么你可能会问,为什么base58编码了整个东西?因为看起来相似的字母被省略了:0(0)、O(大写O)、I(大写I)和l(小写l),以及非字母数字字符+(加号)和/(斜杠)被省略,使其更易于阅读。这一切都是因为我们想要一个未来的系统,允许多种不同的指纹识别机制共存。因此,如果这个了不起的新哈希函数确实被发明出来了,我们将简单地更改multihash的前几个字节,就这样…

Merkle DAG➞IPLD

好了,我有了我的文件,我哈希并编码了它。但这并不是全部。实际发生的事情更像这样……

【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

       内容被分成更小的部分(每个部分约为256k),每个部分被散列,为每个块创建一个CID,然后这些块被组合成一个分层数据结构,计算一个单独的基本CID。

这种数据结构本质上称为Merkle DAG,或有向无环图。

       这里有一个协议实验室的Juan Benet的精彩视频,他解释了IPFS如何使用Merkle DAGs作为他们的核心数据结构……

关联数据

链接数据实际上是分散式web社区中的人们已经讨论了很长一段时间的东西。这是蒂姆·伯纳斯-李(Tim Berners-Lee)多年来一直在做的事情,他的新公司Solid正在围绕着它建立业务。

本质上,我们所谈论的是一个结构,它将所有事物建模为一系列相互关联的对象。在IPLD世界中,我们有对象,每个对象都有数据和链接字段(其中数据可以是一小块非结构化的任意二进制数据,而链接是链接结构的数组,这些结构只是指向其他IPFS对象的链接)。说到链接,每个链接都有一个链接对象的名称、散列(或CID)和一个Size, Size表示链接对象的大小。这最后一点信息实际上只是为了我们可以估计对象/文件大小,而不需要预先获取太多的数据,但是它非常有用。

IPLD(对象)

  • 数据-大小小于256 kB的非结构化二进制数据的blob。

  • 链接——链接结构的数组。这些是指向其他IPFS对象的链接。

  • 链接结构有三个数据字段

 Name -链接的名称

  • 哈希——链接IPFS对象的哈希

  • Size -链接IPFS对象的累积大小,包括跟随其链接的大小

在实践中学习

实际上,我们可以使用IPFS命令行工具来研究IPLD对象。因此,首先,确保您已经安装了IPFS,并且能够自如地使用命令行。如果您需要入门教程,请查看纺织构建系列的第1部分。准备好之后,我们将快速查看不同cat图像的对象结构(使用方便的dandy jq工具)。从下面的命令开始,该命令将IPFS对象的结果传递到jq命令。

ipfs object get QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ | jq

产生以下输出:

{ “Links”: [ { “Name”: “cat.jpg”, “Hash”: “Qmd286K6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u”, “Size”: 443362 } ], “Data”: “bu0001” } 注意,这个对象包含一个链接,我们可以使用相同的命令进一步探索: ipfs object get Qmd286K6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u | jq 然后,生成以下输出。注意,这两个链接的大小都小于256K: { “Links”: [ { “Name”: “”, “Hash”: “QmPEKipMh6LsXzvtLxunSPP7ZsBM8y9xQ2SQQwBXy5UY6e”, “Size”: 262158 }, { “Name”: “”, “Hash”: “QmT8onRUfPgvkoPMdMvCHPYxh98iKCfFkBYM1ufYpnkHJn”, “Size”: 181100 } ], “Data”: “bu0002u0018ކu001b ��u0010 ކu000b” }


这非常酷,由于DAGs(简单的基于链接的图)的灵活性,我们可以使用IPLD表示任何我们想要的数据结构。例如,假设您有以下目录结构,并且希望将其添加到IPFS。首先,这是非常容易做到的(见下文),其次,使用DAG在IPFS中表示数据的好处会立即显现出来,我们稍后将看到这一点。

test_dir/
├── bigfile.js
├── *hello.txt
└── my_dir
    ├── *my_file.txt
    └── *testing.txt

在本例中,假设所有三个文件都带有星号(*)- hello。txt, my_file。txt和测试。包含相同的文本:“Hello World!/n”。现在让我们将它们添加到IPFS中:

ipfs add -r test_dir/

当你这样做的时候,你会得到一个像这样的DAG:

【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

在这里(取决于目录中文件的实际内容),您将得到一系列对象,这些对象通过它们的cid链接。在顶层,我们有实际的文件夹,没有名称,但是有CID。从那里我们可以直接链接到bigfile。以及hello.txt。在my_dir(中间)中,我们有指向my_file.txt和test的链接。txt,它们实际上引用相同的CID!这很酷。因为我们引用内容(而不是文件本身),所以我们“免费”获得重复数据删除!最后,在左下角,我们有一个大文件。它被分成三个更小的部分,每个部分都有自己的CID,它们一起组成更大的文件。如果沿着所有这些CID向上树,就会得到一个CID,它描述了树下的内容。这是一个关键的概念……

我们拥有数据和链接,这一事实使我们的IPFS对象集合具有类似于图的结构(或树)。DAG的意思是有向无环图,Merkle来自于发明者Ralph Merkle的名字,他在1979年为哈希树申请了专利。无论如何,Merkle DAGs给我们的是内容寻址,这样所有的内容都由它的密码散列唯一标识,包括指向它引用的东西的链接。这使得结构具有防篡改性,因为所有的内容都是用它的散列验证的——右散列,右内容。同样,由于我们正在哈希文件的内容,所以没有重复,因为在Merkle DAG世界中,所有持有相同内容的对象都被认为是相等的(即它们的哈希值相同),所以我们只存储它们一次。重复数据删除的设计。

我们可以尝试使用Merkle DAGs的概念,并从命令行自己将大型对象分组。例如,让我们抓取一个漂亮的大jpg来玩。如果你想可以ipfs cat它,或者直接从GitHub下载:

ipfs cat QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9 > cosmos.jpg

现在,您可以在本地添加它,如果您最初对它进行了cat处理,请确保散列匹配(这里我们将返回的散列分配给env变量散列):

hash=`ipfs add -q cosmos.jpg`echo $hash
你应该得到一个CID哈希,看起来就像这个(加上一些进展):
QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9
现在,让我们来看看这个特定图像的底层ipfs对象:
ipfs ls -v $hash

注意,每个链接的对象大约是256k。这些块合在一起构成了整个图像。所以当我们从网络中请求这个文件时,我们可以从不同的对等点抓取数据,然后我们的对等点会把它们放在一起,然后给我们想要的文件。真正分散的!【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

您还可以使用这个超级有趣的新工具在浏览器中探索DAGs (IPLD obejcts)。查看git示例以获得一个有趣的示例。或者更好的方法是探索上面的DAG对象。

现在,只是为了告诉你,上面的四块确实构成了一张图片,您可以使用下面的代码来“手动”块联接在一起,从而创建图像文件——本质上是在后台的猫在做什么当你参考基础CID:

【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

或者,您也可以更简洁地使用管道:

【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

那就这样吧。它一直向下链接。除此之外,我们还学习了许多IPFS命令行工具来操作IPFS DAG对象。方便的!

回顾

让我们快速回顾一下。Merkle DAGs是IPFS的核心概念,也是git、bitcoin、dat等许多其他技术的核心。这些dag基本上是由内容块组成的散列“树”,每个内容块都有一个惟一的散列。您可以引用该树中的任何块,这意味着您可以从任何子块的组合构建树。这就引出了关于DAGs的另一件很棒的事情,尤其是在处理大型文件时:要引用大型数据文件,您只需要基本CID,并且您实际上有一个对整个对象的经过验证的引用。对于存储在网络中多个位置的大型流行文件,发送cid并向多个对等点请求位可以轻松实现文件共享,这意味着只需要共享几个字节,而不需要共享整个文件。

当然,您很少直接与DAGs或对象交互。大多数时候,您友好的ipfs add命令将简单地从您指定的文件中的数据创建merkle DAG,为您创建底层IPNS对象,然后您将继续您的愉快之路。所以,对于“当您向IPFS添加文件时,究竟发生了什么?”“是–密码学、数学、网络和一些魔法!”

这就是所有人。现在,您已经非常清楚地知道将文件添加到IPFS时会发生什么。接下来要做的是以后文章的主题。同时,为什么不看看我们的其他故事,或者注册我们的纺织品照片等待列表,看看我们正在用IPFS构建什么。当你在做的时候,给我们写封信,告诉我们你在做什么很酷的分布式网络项目——我们很想听一听!

【IPFS相关】当您向IPFS添加文件时,实际发生了什么?

【IPFS原力区】

总部位于上海,深耕IPFS社区发展与商业生态建设

Force系列产品布局IPFS商业应用,贯通视频娱乐、文件共享、浏览器入口、数据加密管理等服务,为企业与个人的使用提供一站式服务。

旗下IPFS原力区是IPFS顶级价值生态社区,聚集了众多技术大咖和IPFS爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,推动IPFS生态的健康发展。

 
【IPFS相关】当您向IPFS添加文件时,实际发生了什么?
 

原创文章,作者:IPFSforce,如若转载,请注明出处:http://ipfser.org/2019/04/16/%e5%bd%93%e6%82%a8%e5%90%91ipfs%e6%b7%bb%e5%8a%a0%e6%96%87%e4%bb%b6%e6%97%b6%ef%bc%8c%e5%ae%9e%e9%99%85%e5%8f%91%e7%94%9f%e4%ba%86%e4%bb%80%e4%b9%88/

发表评论

登录后才能评论

联系我们

在线咨询:点击这里给我发消息

邮件:ipfsforce@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code