解析IPFS白皮书(1)

IPFS中国社区
人人都是节点
加密货币/区块链世界对白皮书都情有独钟,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 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?
IPFS是一个分布式的存储项目,与激励层Filecoin形成了一个有效的市场闭环,构建出一个去中心化存储网络系统。
Filecoin是2017年最大的私募项目,短短时间募集了2.57亿美元。
目前期货价格约85元左右,按照20亿枚Token计算,未上线已市值1700亿人民币。
我们是IPFS的中国社区,垂直专注于IPFS领域,努力提供客观的、第三方的IPFS、Filecoin、矿机、挖矿等最新资讯,共同推进IPFS相关应用的发展,建立一个良好的IPFS生态圈。
丨热门阅读
Filecoin有望击败亚马逊的存储服务
最清晰明了的IPFS 与 FileCoin介绍(技术篇)
IPFS是如何挑战网络协议霸主HTTP的?
IPFS布道者董天一:未来不可预测 下一代互联网或将由此诞生 | 金色财经独家专访
_________________________
公众号后台回复【社群】
加入IPFS中国官方社群哦~