区块链
挖矿,比特币,EOS,以太坊

IPFS白皮书解析(1)

514

加密货币/区块链世界对白皮书都情有独钟,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)

分布式哈希表(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 1KBQmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF $ ipfs cat QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFF # just checkmy 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 contentPublished 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 QmfQKcXMLGvCxx6opNDwb1ptD1LJER6MPHdsMHCB1CXpFFQmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6QmRf4ERGvYpVo6HRa2VueZT8pWi8YvyLS3rW6ad2y83tdN
# ^^^ 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 addrsQmNRuQrwtGgeVQgndTny4A4Rukg7GR7vzDJrVJxUBfqevk (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/4001QmNSJohkvvBVmHeN7KUZnm4X84GA6Znbv6ZmvsTAjbw3AB (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/4001QmNTJyhCYcbv5GdnqtdEwTfJCgY6pV4PJiNTtAmuoxnQak (3)        /ip4/127.0.0.1/tcp/4001        /ip4/94.176.232.68/tcp/4001        /ip6/::1/tcp/4001QmNTZy7TfXvsHczwwV3EYbxRZN5gthgicG9GiroD7C4ZrP (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/QmfTgdg6GkqJtUrWAYo69GjcLrjQq9LjTjgW3KZ1ux1X6Uconnect 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部分

赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址