解析IPFS白皮书(1)

解析IPFS白皮书(1)

IPFS中国社区

人人都是节点

解析IPFS白皮书(1)

 

加密货币/区块链世界对白皮书都情有独钟,IPFS也不例外。它的白皮书来源于比特币: Satoshi Nakamoto的点对点电子现金系统白皮书(这份文件又引用了另一篇你不想知道的白皮书),当未来我们深入研究加密货币的时候,你将会看到比特币白皮书。

 

在解读白皮书之前,你需要了解:


1. 白皮书都时候以PDF格式发布(因为这样更加难串改);

2. 白皮书上的内容都很难、很深奥,至少含有一个复杂的数学公式;

 

IPFS白皮书地址:

https://ipfs.io/ipfs/QmR7GSQM93Cx5eAg6a6yRzNde1FQv7uL6X1o4k7zrJa3LX/ipfs.draft3.pdf

 

想理解IPFS是如何工作的,你最好一步一步地阅读这篇白皮书。


我会把这篇文章的内容限制在白皮书的第2章,其中涉及了以下这些技术:


1.Distributed Hash Tables(分布式哈希表)

2.Block Exchanges - BitTorrent(块交换 - BitTorrent)

3.Version Control Systems - Git(版本控制系统 - Git)

4.Self-Certified Filesystems - SFS(自我认证的文件系统 - SFS)

 

解析IPFS白皮书(1)


分布式哈希表(DHT)

 

DHT就像Python dict或Perl hash(如果你有密钥,你可以去检索值),它的数据分布在多个节点上。维基百科上的解释很好,地址:

https://en.wikipedia.org/wiki/Distributed_hash_table

 

在IPFS的系统中,它的密钥指的是内容上的 hash。因此,向IPFS节点询问具有hash:QmcPx9ZQboyHw8T7Afe4DbWFcJYocef5Pe4H3u7eK1osnQ

的内容时候,IPFS节点将在DHT中查找哪些节点具有该内容。

 

对于现有的各种DHT实现方法来说,如何高效地找到特定的值(快速地,使用尽可能少的网络请求),以及如何管理DHT,以方便改变(进入/离开网络的节点,或表中新的条目),不同的DHT是不同的。

 

其中一个实例称为Pastry,这里有两个视频很好的解释了如何查找值和如何处理节点添加/删除:

 


Kademlia 


回到白皮书。明确地提及了三个DHT实施方式,第一个是Kademlia。Kademlia有一份自己的白皮书,不过我们不用去阅读它…

 

Kademlia是DHT协议,几乎在所有流行的P2P系统中都使用,维基百科上关于Kedemlia的介绍很好,地址。

 

简而言之,Kedemlia使用节点的ID一步步接近所需的hash(来自Wikipedia)

 

在搜索某些值时,算法需要知道相关的密钥并分几步探索网络。每个步骤都会找到更靠近密钥的节点,直到联系的节点返回该值或找不到更近的节点。这非常有效:与许多其他DHT一样,Kademlia在搜索系统中的总共n个节点期间仅联系O(log(n))节点。

 

这之间的细节可能会变得非常复杂,我认为它不会增加我们理解IPFS,所以我们就介绍到这里。如果你想更加深入了解Kedemlia,这里有一个视频:很好的介绍,你也可以去阅读它的白皮书。

 

IPFS还提到了另外两种DHT实现,它们被添加到Kedemlia中:

 

1.Coral DSHT(这提高了查找性能,减少了资源使用);

 

2.S/Kademlia(使Kademlia对恶意攻击更具抵抗力);

 

白皮书指出:


小值(等于或小于1KB)直接存储在DHT上。对于更大的值,DHT存储使用引用,它们是可以为块提供服务的对等节点。


那么让我们来看看我们是否可以直接访问DHT并添加和检索小数据块。

 

$ ipfs daemon # make sure this runs (and install/setup ipfs first)

 

$ echo 'my tiny text' | ipfs add # add content to the node, smaller than 1KB

QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF

 

$ ipfs cat QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF # just check

my tiny text

 

$ ipfs dht get /ipfs/QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF# returns not found

 

现在,我们有了文本,我们想从DHT访问它,但显而易见的是,唯一支持的ipfs dht get请求是针对从/ipns/开始的键。

 

然后,所以我们创建了一个IPNS,看看我们是否可以直接查询:

 

$ ipfs name publish QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF # point a IPNS address to our content

Published to QmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6: /ipfs/QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF

 

$ ipfs resolve QmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6 # check it# never returns, hmm IPNS doesn't seem to be ready for production

 

$ ipfs dht get /ipns/QmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6# same thing but directly# does return binary data starting with 4/ipfs/QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF

 

这是可行的,但目前看来仅限于IPNS。

 

对于DHT我们还能做什么?

 

使用DHT查找哪些节点可以提供一些数据:


$ ipfs dht findprovs QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF

QmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6

QmRf4ERGvYpVo6HRa2VueZT8pWi8YvyLS3rW6ad2y83tdN


# ^^^ there are both my nodes, so that works# Now ask the DHT for the address of the first peer that was returned

$ ipfs dht findpeer QmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6

/ip4/176.92.234.78/tcp/4001

/ip4/85.74.239.218/tcp/38689

/ip4/127.0.0.1/tcp/4001

/ip4/192.168.1.30/tcp/4001

/ip6/::1/tcp/4001

/ip4/192.168.1.3/tcp/4001

/ip4/176.92.234.78/tcp/40443


# Oooh nice! We will visit this address notation in the next episode.


总之,我们看到了一些DHT的作用,但没有我希望的那样直观和功能。

 

现在,我们来谈谈IPFS应用的下一个令人兴奋的技术。



BitTorrent


我们都知道BitTorrent,但我们中的一些人(是的,我也是)需要深入挖掘才能真正得到它。本演讲是一个很好的介绍:Feross Aboukhadijeh:WebTorrent - JSConf.Asia 2014。(https://www.youtube.com/watch?t=961&v=kxHRATfvnlw)。


演讲者讨论了他如何实现可以在浏览器中运行的BitTorrent客户端,这要归功于WebRTC(这是一种很酷的技术,可能会在以后为我们的项目派上用场)。

 

 使用BitTorrent进行点对点联网(PDF)

 点对点内容交付 - BitTorrent(视频)+ 幻灯片(PDF)

 BitTorrent协议规范v2(规范,不难读)



BitTorrent和IPFS


IPFS中的数据(块)交换受BitTorrent的启发,但不是100%BitTorrent。白皮书提到了IPFS使用的两个BitTorrent功能:


针锋相对的策略(如果你不分享,你也不会收到)

首先获得稀有物品(提高性能等等,请参阅上面的第一个PDF)

 

一个值得注意的区别是,在BitTorrent中,每个文件都有一组独立的对等体(彼此形成一个P2P网络),其中IPFS是所有数据的一大群对等体。IPFS BitTorrent版本被称为BitSwap,我将在下一章中讨论它。

 

如果我们来试试吧。


# Make sure you have the daemon running

$ ipfs swarm peers

/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ

/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx

/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu

/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3


当您刚启动后台进程时,您会连接到“种子节点”。过了一段时间,节点的数量迅速增长。


另一个查询swarm的命令:


$ ipfs swarm addrs

QmNRuQrwtGgeVQgndTny4A4Rukg7GR7vzDJrVJxUBfqevk (4)

        /ip4/127.0.0.1/tcp/4001

        /ip4/172.31.41.39/tcp/4001

        /ip4/35.167.26.28/tcp/4001

        /ip6/::1/tcp/4001

QmNSJohkvvBVmHeN7KUZnm4X84GA6Znbv6ZmvsTAjbw3AB (5)

        /ip4/10.0.1.8/tcp/4001

        /ip4/127.0.0.1/tcp/4001

        /ip4/174.44.163.74/tcp/16012

        /ip6/::1/tcp/4001

        /ip6/fd15:462e:f8fd:695e:9161:27dd:7f78:d242/tcp/4001

QmNTJyhCYcbv5GdnqtdEwTfJCgY6pV4PJiNTtAmuoxnQak (3)

        /ip4/127.0.0.1/tcp/4001

        /ip4/94.176.232.68/tcp/4001

        /ip6/::1/tcp/4001

QmNTZy7TfXvsHczwwV3EYbxRZN5gthgicG9GiroD7C4ZrP (4)

        /ip4/127.0.0.1/tcp/4001

        /ip4/172.20.255.127/tcp/4001

        /ip4/54.229.227.53/tcp/4001

        /ip6/::1/tcp/4001

        .

        .

        .


这些是节点知道的群集中的地址,上面的散列是peerId。

 

有了这些信息,您就可以连接到类似的对等点


$ ipfs swarm connect /ip4/114.91.202.180/tcp/34746/ipfs/QmfTgdg6GkqJtUrWAYo69GjcLrjQq9LjTjgW3KZ1ux1X6U

connect QmfTgdg6GkqJtUrWAYo69GjcLrjQq9LjTjgW3KZ1ux1X6U success

 


版本控制系统 - Git

 

白皮书关于版本控制系统的整个部分在此处转载:


版本控制系统提供了模拟文件的工具,可以随时间变化并有效地分发不同版本

流行的版本控制系统Git提供了一个功能强大的Merkle DAG对象模型,它以分布式友好的方式捕获文件系统树的变化。

1. 不可变对象表示文件(blob),目录(树)和更改(提交)。

2. 对象通过其内容的加密哈希进行内容寻址。

3. 嵌入其他对象的链接,形成Merkle DAG。这提供了许多有用的完整性和工作流属性

4. 大多数版本控制元数据(分支,标签等)只是指针引用,因此创建和更新成本低廉。

5. 版本更改仅更新引用或添加对象。

6. 将版本更改分发给其他用户只是传输对象和更新远程引用。


让我们一步一步地理解它:


1.不可变对象表示文件(blob),目录(tree)和更改(commit)。


Git只添加数据。所以blob,tree和commit是不可变的。其中任何一个的最后版本是由特殊参考决定的(见第4和第5点)。


2.对象通过其内容的加密哈希进行内容寻址。


在git中,引用它们时不使用文件或目录名。Git使用SHA1 hash内容( listing or commit)并在其数据库中使用这些hash。这篇文章让人非常有见地了解它是如何工作的:Git under the hood(开始阅读“现在让我们来看看Git如何做到这一切”)


3.嵌入其他对象的链接,形成Merkle DAG。这提供了许多有用的完整性和工作流程属性。


Merkle树是一个二叉树,其中父节点包含两个子节点的hash的hash。这解释了完整性属性:数据块中的任何更改都会导致根节点的更改。只要有一点元数据(叔叔和家长,这是不可信的)和可信的根节点,我们就可以验证块的有效性。

 

现在,Merkle DAG与Merkle树不同。不同之处在于解释:Merkle DAG和JRFC 20 - Merkle DAG


简而言之:Merkle DAG更通用,因为它不是二叉树而是图形,任何节点都可以包含数据,而不仅仅是Merkle树中的叶节点。


虽然它仍然有点模糊不清,但是当我遇到IPFS Merkle DAG时,我会再次讨论它。

 

4和5.大多数版本控制元数据(分支,标签等)只是指针引用,因此创建和更新成本不高。版本更改仅更新引用或添加对象。

 

这在这里是可视化的:Git for Computer Scientists,其中分支,HEAD和标签仅仅是对提交的引用。

 

6. 向其他用户分发版本更改只是简单地转移对象和更新远程引用。

 

 

自我认证的文件系统 - SFS

 

这用于实现IPFS的IPNS名称系统。它允许我们为远程文件系统生成地址,用户可以在其中验证地址的有效性。

 

从白皮书:


SFS引入了一种用于构建自我认证文件系统的技术:使用以下方案寻址远程文件系统

/ SFS / <位置><主机ID>


其中Location是服务器网络地址,并且:


HostID = hash(public_key || Location)


因此,SFS文件系统的名称会对其服务器进行认证。

 

我认为这说明了一切,我们将在下一集中看到它的实际应用:理解IPFS白皮书第2部分

解析IPFS白皮书(1)

什么是IPFS?

IPFS是一个分布式的存储项目,与激励层Filecoin形成了一个有效的市场闭环,构建出一个去中心化存储网络系统。

Filecoin是2017年最大的私募项目,短短时间募集了2.57亿美元。


目前期货价格约85元左右,按照20亿枚Token计算,未上线已市值1700亿人民币。


我们是IPFS的中国社区,垂直专注于IPFS领域,努力提供客观的、第三方的IPFS、Filecoin、矿机、挖矿等最新资讯,共同推进IPFS相关应用的发展,建立一个良好的IPFS生态圈。 


热门阅读

IPFS:互联网民主化

破纪录的顶级风险投资Filecoin ICO

Filecoin有望击败亚马逊的存储服务

最清晰明了的IPFS 与 FileCoin介绍(技术篇)

IPFS是如何挑战网络协议霸主HTTP的?

IPFS布道者董天一:未来不可预测 下一代互联网或将由此诞生 | 金色财经独家专访


_________________________

解析IPFS白皮书(1)


公众号后台回复【社群】

加入IPFS中国官方社群哦~

本文由 Ipfs币 作者:ipfs币 发表,其版权均为 Ipfs币 所有,文章内容系作者个人观点,不代表 Ipfs币 对观点赞同或支持。如需转载,请注明文章来源。
42

发表评论