首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IPFS 底层原理入门(一)

IPFS联盟

区块链/IPFS/Filecoin

关注

“When you have IPFS, you can start looking at everything elsein one specific way and you realize that you can replace it all” — Juan Benet

原作:An Introduction to IPFS

作者:Dr. Christian Lundkvist, Director of Engineering, andJohn Lilic, ConsenSys Enterprise

翻译:伏神

原文地址:https://medium.com/@ConsenSys/an-introduction-to-ipfs-9bba4860abd0

走近 IPFS

这一节我将尝试对IPFS做概况性描述,为我的同事Christian Lundkvist博士后面的深入技术总结提供铺垫。IPFS源于Juan Benet当初的一项工作尝试,其目的是建立一个系统能够快速移动版本化科学数据。版本控制使您能够跟踪软件的状态如何随时间变化(如Git)。自那时起,IPFS就被认为是分布式的、永久性的网络;“IPFS是一个分布式文件系统,它试图以同一个的文件系统将所有的计算设备连接起来。在某些方面,这类似于Web的原始目标,但是IPFS实际上更类似于一个的bittorrent集群,并在内部交换git对象。IPFS可以成为互联网的一个新的主要子系统。如果构建正确,它可以补充甚至替代HTTP。你没听错,它可以补充或替代更多东西。感觉像在吹牛B?它就是这么NB!”

IPFS本质上是一个版本化的文件系统,可以接收文件并管理、存储它们,随着时间的推移还能跟踪版本变化。IPFS也记录了这些文件是如何在网络中移动的,所以它也是一个分布式文件系统。

IPFS中的数据和内容在网络上移动的规则的与bittorrent相似。文件系统层提供了非常有趣的属性,例如:

- 完全分布式的网站。

- 没有源服务器的网站。

- 可以完全在客户端浏览器上运行的网站。

- 网站不必和任何服务器有联系。

内容寻址

IPFS不是引用存储在特定服务器上的对象(图片、文章、视频),而是通过文件内容对应hash值引用文件。可以这样理解,如果在你的浏览器中你想访问一个特定的页面,那么IPFS会问整个网络“有人有这个文件对应这个hash吗?”在IPFS就会有节点返回文件,此时你就访问到了它。

IPFS在HTTP层使用内容寻址。这是一项用以代替位置标识符寻址文件的实践,我们通过文件内容本身的特征来定位它。也就是说内容将决定地址。它的机制是用加密算法计算文件的hash值,这样就可以安全地将文件用很小数据量进行表示,这个hash值作为文件的地址,不会发生地址相同文件数据不同的情况。IPFS中文件的地址通常以一个散列开头,该散列标识某个根对象,然后沿着一条路径向下走(注:类似目录层次)。不同于传统服务器上的文件寻址操作,IPFS是先获得特定的对象,然后查看的是这个对象记录的路径。

HTTP VS IPFS 查找并获取文件

HTTP有一个很好的特性,在标识符中包含了位置信息,所以很容易找到托管文件的计算机并访问他们。这在通常的应用场景下很好用,但不包括离线情况,或是在用到了大型分布式系统,希望将通过整个网络分散负载的场景。

在IPFS中,只需要两步就能解决问题:

通过内容寻址识别文件;查找文件——有了哈希,就可以向接入的网络询问“谁有这个内容? (哈希) ”,然后连接到相应的节点并下载它;最终的效果就是通过点到点的覆盖(译者:图论中的覆盖?),获得高速的路由。

例说 IPFS

IPFS(星际文件系统)是一种经过良好测试和技术检验的互联网技术的综合体,包含了如DHTs、Git版本控制系统和Bittorrent等技术。它创建了一个允许交换IPFS对象的P2P集群。IPFS对象的总体构成了一个被称为Merkle DAG的密码验证数据结构,这个数据结构可以用来建模许多其他数据结构。我们将在本文中介绍IPFS对象和Merkle DAG,并给出可以使用IPFS建模的结构示例。

IPFS 对象

IPFS本质上是一个用于检索和共享IPFS对象的P2P系统。一个IPFS对象是一个具有两个字段的数据结构:

Data—大小小于256 kB的非结构化数据块(blob)

Links — 一个Link结构体的数组。其中包含的Link指向其他IPFS对象。

Link结构有三个数据字段:

Name — Link的名字

Hash — Link指向的IPFS对象的hash

Size — Link指向对象的累计大小,计算Link指向的对象大小,需要计入这个被指对象所指向所有对象的大小(注:除了被指向对象自身的size,如果它里面有link,那么还要把link中的size加进来)

Size字段主要用于优化P2P网络,因为它不影响逻辑结构的概念表达我们将在这里忽略它。

IPFS对象通常采用经Base58编码的散列引用。

例如,观察hash为QmarHSr9aSNaPSR6G9KFPbuLV9aEqJfTk1y9B8pdwqK4Rq的IPFS对象,可以使用命令行估计执行如下指令(需要读者亲自实践一下):

> ipfs object get QmarHSr9aSNaPSR6G9KFPbuLV9aEqJfTk1y9B8pdwqK4Rq

{“Links”: [{

“Name”:“AnotherName”,

“Hash”:“QmVtYjNij3KeyGmcgg7yVXWskLaBtov3UYL9pgcGK3MCWu”,

“Size”: 18},

{“Name”:“SomeName”,

“Hash”:“QmbUSy8HCn8J4TMDRRdxCbK2uCCtkQyZtY6XYv3y7kLgDC”,

“Size”: 58}],

“Data”: “Hello World!”}

读者可能会注意到,所有的散列都是以“Qm”开头的。这是因为它实际上是一个multihash,前两个字节用于指定哈希函数和哈希长度。在上面的例子中,前两个字节的十六进制是1220,其中12表示这是SHA256哈希函数,20代表哈希函数选择32字节长度计算。

数据和命名链接构成的IPFS对象的集合即是Merkle DAG结构。顾名思义,DAG表明了这一种有向无环图,而Merkle说明这是一个密码验证的数据结构,使用加密哈希来寻址内容。读者可以思考为什么在这个图中不可能有环。

为了直观显示结构关系,我们将通过图表示IPFS对象关系,图的节点代表数据对象中的数据,图的边表示指向其他IPFS对象的链接,链接的名称是图的一条边上的标签。上面的示例可视化表示如下:

现在我们将给出可以由IPFS对象表示的各种数据结构的示例。

剩下的我们下期再讲~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180426G1ULBL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券