php发展

注册

 

发新话题 回复该主题

当你将文件添加到IPFS时会发生什么 [复制链接]

1#
北京治白癜风的哪家医院最好         http://baidianfeng.39.net/bdfby/yqyy/

作者简介:

Textile项目数据科学家

科罗拉多大学博尔德分校教授

加拿大不列颠哥伦比亚省维多利亚大学地理系学士、硕士

梅努斯大学国家地理计算中心博士

苏格兰圣安德鲁斯大学博士后

曾担任纽约城市大学亨特学院空间信息高级研究中心(CARSI)副主任和GIScience助理教授

开源软件和开放数据的坚定拥护者

爱好骑自行车、单板滑雪和收集机器人

当你将文件添加到IPFS时会发生什么

——从原始数据到MerkleDAGs和中间的一些步骤

照片来源于Unsplash的JohannesPlenio

当你问某人要他们最喜欢的猫咪视频,他们大概率不会说类似于“哈哈,是这个服务器上的,在这个子域名下,‘/令人捧腹的冲刺猫咪.MP4’这个文件路径”这样的话。然而,他们大概会描述这个视频的内容:“哦,哈哈,是一个猫咪把柜台上的玻璃瓶撞倒的视频,这莽撞的风格……太经典了”这对于人们来说显然是一种直观的思考内容的方式,但是这通常不是如今我们在网上获取内容的方式。话虽如此,像IPFS这样的分布式协议实际上确实使用了这类内容寻址的方法来在分布式网络上寻找内容。在这篇文章中,我们将探讨一下整个过程是如何运作的,透过现象看本质地找到当你在IPFS中添加一个文件时究竟会发生什么。当我们来了解这个过程时,我们会花很多时间学习星际文件系统的底层数据结构IPLD。

指纹

所以,首先,为了支持内容寻址,我们需要想一些办法来创建一个“指纹”或者摘要来供给我们引用。类似于找到一本书,在那里我们使用ISPN号码。在实践中,Web上的内容寻址系统(如IPFS)使用加密哈希函数来创建指纹。基本上,我们采用原始内容(比如猫咪照片),并通过一个哈希函数运行该数据,以产生摘要。此摘要保证对文件的内容(或图像或任何内容)具有唯一性,并且只针对这个文件。如果我改变那个文件,即使只改变了1比特,哈希值也会变得完全不同。

原始数据摘要CID

从原始图像到加密摘要到内容ID(多重哈希)

现在我们将这个图片哈希化(创建摘要),然后呢?我们将要做的是内容地址/标识符。所以我们现在需要使用摘要并将其转换成IPFS和其他系统可以用来定位它的东西…但是这一切并不是那么简单。如果将来发生了一些变化,我们想改变我们保存内容的方法呢?如果有人发明了更好的哈希函数呢?即使是我们现在使用的IP系统也是要不断升级。我们IPFS的伙伴们当然也想到了这一点!

多重哈希

IPFS的哈希值都是以Qm开头的,你注意到了吗?这是因为这些哈希值实际上是一种称为多重哈希的东西。这很酷,因为这种哈希本身表明了它使用的哈希函数是什么,以及在多重哈希前两个字节中所得的哈希长度。在大多数我们举的例子里,十六进制的第一部分是12,其中12表示这是SHA的哈希函数,以及输出长度为十六进制的20(即32字节)…这是当我们使用base58对所有文件进行编码时得到Qm的意义。你可能会问道,为什么用base58来编码整个文件?因为对相似的字母进行了省略:0(数字零)、O(大写字母O)、I(大写字母i)和l(小写字母L)和非字母数字的符号比如+(加号)、/(斜杆),它们都被删除了,使它对于人来说更具可读性。所有这一切,是因为我们想要一个未来的证明系统,允许多个不同的指纹机制共存。所以如果新的哈希函数真的被发明了,我们将简单地更改多重哈希的前几个字节,那么…IPFS的哈希将不再以Qm开头…但是因为我们使用的是多重哈希,之前的旧哈希依然能够使用,新的也同时存在…这太棒了!

MerkleDAG?IPLD

好的,我拿到了我的文件,我将其哈希化并进行编码。但这并不是全部。实际上发生的事情更像这样…

数据块摘要CID

大文件被分块、哈希,并组织成一个IPLD(Melder-Dag)对象。

内容被分成小块(每个大约K),每一个小块都进行哈希,为每个块创建CID,然后将这些块组合成分层数据结构,计算出单体的基本CID。

这种数据结构本质上称为MerkleDAG或者有向无环图(directedacyclicgraph)。

这是协议实验室的JuanBenet的一段精彩视频,其中解释了IPFS是如何将MerkleDAGs用作其核心数据结构…用于所谓的星际链接数据(InterplanetaryLinkedData(orIPLD))结构的。

链接数据

链接数据实际上是被分布式网络社区中的人们已经谈论了相当长的时间的一个话题。这是TimBernersLee多年来一直在从事的工作,他的新公司Solid正在围绕它开展业务。

本质上我们所讨论的都是将所有东西建模成一系列链接对象的结构。在IPLD世界中,是存在有对象的,每个对象都具有对应的数据(Data)和链接(Links)字段(其中Data可以是一小块非结构化、任意的二进制数据,而Links可以是一组链接结构,它们仅仅完成与其他IPFS对象的链接)。说到这里,每一个Link都有一个名字(Name),也就是对应的哈希值(或者CID),还有对应的大小(Size),它代表链接对象的大小。最后一点信息实际上只是为了我们可以估计对象/文件的大小,而不必预取太多的数据,这点是非常好的。

IPLD(对象)

·Data—小于KB的非结构化二进制数据

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

一个链接结构包含三个数据区

·Name—链接的名字

·Hash—被连接的IPFS对象的哈希值

·Size—被链接的IPFS对象的累积大小,包括被链接的对象的的链接

在操作中学习

实际上,我们可以使用IPFS命令行工具来开发IPLD对象。首先,确保你安装了IPFS,并且能够使用命令行。如果你需要入门教程,你可以查看Session1ofourTextileBuildSeries。一旦你准备好了,我们将快速查看不同的猫咪图像的对象结构(使用handydandyjq工具)。

从下面的命令开始,这些管道命令将从IPFS对象获取到jq命令。

ipfsobjectgetQmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ

jq

产生以下输出:

{"Links":[{"Name":"cat.jpg","Hash":"QmdK6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u","Size":}],"Data":"\b\u"}

注意,这个对象包含一个单一的链接,我们可以使用相同的命令进一步查询它。

ipfsobjectgetQmdK6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u

jq

相应地又产生了以下输出。注意,两个链接的大小都是K。

{"Links":[{"Name":"","Hash":"QmPEKipMh6LsXzvtLxunSPP7ZsBM8y9xQ2SQQwBXy5UY6e","Size":},{"Name":"","Hash":"QmT8onRUfPgvkoPMdMvCHPYxh98iKCfFkBYM1ufYpnkHJn","Size":}],"Data":"\b\u\u?\ub??\u0?\ub"}

这是相当厉害的,并且由于DAGs(简单的基于链接的图表)的灵活性质,我们可以用IPLD来表示我们想要的任何数据结构。例如,假设您拥有以下目录结构,并且您想将其添加到IPFS中,首先,这样做非常容易(参见下文),其次,使用DAG在IPFS中表示数据的好处显而易见,我们稍后将看到。

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

在这个例子中,假设所有带星号(*)的三个文件(*)—hello.txt,my_file.txt和testing.txx都包含相同的文本:“HelloWorld!/n”。现在让我把它们都添加进IPFS里。

ipfsadd-rtest_dir/

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

目录结构图,来源于FunSysBlog

最终你会得到一系列通过它们的CID进行链接的对象(这取决于目录中文件的实际内容)。在顶层,我们有实际的文件夹,没有名字,但有CID。从那里我们可以直接链接到bigfile.js、底层的my_dir和hello.txt。从my_dir(位于中间)里我们得到链接,从而抵达my_file.txt和testing.txt,这两者实际上都引用了相同的CID!这里有一点很酷的是,我们引用的都是内容(不是文件本身),可以“免费地”删除重复数据。最后,在左下角,我们有一个bigfile.js,它被分成了三个比较小的块,每一块都有它自己的CID,它们共同组成了一个更大的文件。如果你顺着哈希树去找齐全部这些CID,你会获得一个描述其下方内容的一个CID。这个概念非常关键…

事实上,我们有数据(data)和链接(links),这使得我们的IPFS对象集合是一个类似于图(或树)的结构。再次说明一下,DAG表示的是有向无环图,Merkle来自发明人RalphMerkle的名字,RalphMerkle实际上在年申请了哈希树的专利。无论如何,MerkleDAG给我们带来的是内容寻址,这样的话,包括它引用的内容链接,所有内容都由其加密哈希成唯一的标识。这使得其结构是防篡改的,因为所有内容都是用其哈希——正确的哈希,也就是正确的内容来验证的。而且,因为所有文件的内容都是经过哈希运算的,没有任何重复。因为在MerkleDAG的世界,所拥有相同内容的对应对象都被认为是一样的(比如:它们的哈希值是相同的),所以我们只需要储存他们一次。重复的数据就会按照设计好的代码被删除掉。

我们可以运用MerkleDAG的这个概念,然后我们自己用命令行来将大型对象进行程序分块。举个例子,现在我们用一个大的jpg文件来试试。你可以先将它ipfscat,或者你想的话直接从GitHub里下载:

ipfscatQmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9cosmos.jpg

现在你可以在本地添加(add)它。如果你在最开始的时候cat了它,请确保哈希值是匹配的(在这里我们将反馈的哈希值分配给env变量hash)

hash=`ipfsadd-qcosmos.jpg`echo$hash

你应该倒回去看看CID是否与此处完全一样(加一些进程)

QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9

现在,让我们看看那个特定图像的底层IPFS对象

ipfsls-v$hash

这里值得注意的是,每个链接的对象都大约是K。这些块结合在一起形成了整个图片。所以当从网络请求此文件时,我们实际是是从不同的节点里获取文件的比特,然后我们的节点会把它们组合一起并向我们提供我们要的文件。这是真正的去中心化!

HashSizeNameQmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRhQmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVsEUBrjhERRSRQmS7zrNSHEt5GpcaKrwdbnv1nckBreUxWnLaV4qivjaNr3QmQQhY1syuqo9Sq6wLFAupHBEeqfB8jNnzYUSgZGARJrYa

你也可以使用这个非常新奇有趣的工具来探查浏览器中的DAGs(IPLDObjcts)。看看这个有趣的Git的例子。你如果探查了上面的DAG对象就更棒了。

现在,为了证明给大家看上面的四个块真的组成了一个图像,你可以使用一下代码“手动地”将块连接在一起以创建图像文件——当你在引用基本CID时,实际上cat是在后台执行操作的。

ipfscat\QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh\QmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVsEUBrjhERRSR\QmS7zrNSHEt5GpcaKrwdbnv1nckBreUxWnLaV4qivjaNr3\QmQQhY1syuqo9Sq6wLFAupHBEeqfB8jNnzYUSgZGARJrYa\cat-cosmos.jpgopencat-cosmos.jpg

除此之外,你可以使用管道命令(pipes)更简洁地再一次执行这个操作。

ipfsrefs$hash

ipfscattest.jpg;opentest.jpg

开始运行,这都是直接“链”住的。最重要的是,我们已经学习了一些IPFS命令行工具来操作IPFSDAG对象。很方便吧!

复习

让我们来快速地复习一下。MerkleDAGs是IPFS的核心内容,但是他们同样也是许多其他技术的核心,比如git、bitcoin、dat等等。这些DAG基本上是由内容块组合成的哈希树,每个都对应唯一的哈希值。你可以引用该树中的任何数据块,这也意味着你可以将任意子块组合构建成一个树。从这里我们可以看到DAG的另一项趣事,特别是在处理大型文件时:若要引用大型数据文件,你只需要基本的CID,并且你真的对整个对象进行了验证。对于存储在网络上多个位置的大型文件,发送CID,然后从多个节点请求分散文件会让事情变得轻而易举,这意味着你只需要分享几个字节,而不是整个文件。

当然,您会很少与DAG或对象直接交互。大多数时候,友好的ipfsadd命令会直接从您指定的文件中的数据创建merkleDAG,为您创建底层的IPNS对象,然后您就可以继续进行愉快的工作了。“当你向IPFS添加文件时,会发生什么”的答案是:密码学、数学、网络和一些魔法!

这就是全部了,朋友们。你现在非常清楚当向IPFS添加文件时会发生什么了。接下来的话题是时空证明。同时,你可以查看我们其他的文章,或者在我们的TextilePhotos申请名单中注册,来看看我们在使用IPFS搭建什么。当你在做这些的时候,可以给我们写封信,告诉我们你正在从事什么酷炫的分布式网络项目——我们很乐意听到这些!

长按

分享 转发
TOP
发新话题 回复该主题