BitSwap协议
IPFS节点之间是如何进行数据交换的?本文来讲一下这个问题。
IPFS在BitTorrent的基础上实现了p2p数据交换协议:BitSwap协议
IPFS每一个节点都维护了两个列表:
- 已有的数据块(have_list)
- 想要的数据块(want_list)
当两个节点建立连接后,他们会根据hava_list和want_list互通有无。跟BitTorrent不一样的是:BitSwap获取数据块的时候不限于从同一个torrent里面。也就是说BitSwap可以从不属于本文件的其他文件获取数据块(只要数据块的哈希值一样,数据内容必然是一样的),从全局考虑,这使得BitSwap的效率相比于BitTorrent更高。
我们知道,对于p2p网络,有一个很重要的问题是:如何激励大家分享自己的数据?用过迅雷、BitTorrent、emule等p2p软件的读者应该都知道,如果只下载不上传的话,很快你的节点就无法下载数据了或者下载数据变得很慢。每一个p2p软件都实现了自己的数据分享策略。IPFS也不例外。
IPFS的策略体系由信用、策略、账单组成
BitSwap信用体系
BitSwap协议必须能够激励节点去乐于分享数据,即使这个节点暂时没有数据需求。IPFS根据节点的之间的数据收发建立了一个信用体系:有借有还,再借不难。
- 发送给其他节点数据可以增加信用值
- 从其他节点接受数据降低信用值
如果一个节点只接收数据而不分享数据,信用值就会降得很低而被其他节点忽略掉。简单来讲就是:你乐于分享数据,其它节点也乐于发送数据给你,如果你不愿意分享,那么其它节点也不愿意给你数据。
BitSwap策略
根据上面的信用体系,BitSwap可以采取不同的策略来实现,每一种策略都会对系统的整体性能产生不同的影响。策略的目标是:
- 节点数据交换的整体性能和效率最高
- 阻止“吃白食”(freeloaders)的现象。就是不能够只下载数据不上传数据
- 可以有效的防止一些攻击行为(比如:女巫攻击)
- 对信任节点建立宽松机制(lenient)
IPFS提供一个可参考的策略机制(实际的实现可以有所变化):
每个节点根据和其他节点的收发数据,计算负债率(debt ratio,r)
r = bytes_sent / (bytes_recv + 1) 节点根据负债率计算出来和这个节点的数据发送率(P) P (send|r) = 1− 1/(1+exp(6−3r))
根据这两个函数可以发现,当负债率达到某一个值的时候负债率会急剧下降。
这个模型表达的意义:如果一个节点只接受数据不分享数据,别人发送给它数据的概率会越来越低(到达某一个值后就会急剧降低接近0),如果节点持续保持分享数据,别的节点向你发送数据的概率就会越来越大。
IPFS的官方论文里面没有给出来曲线图(只放了一个空白的图),小编根据函数帮大家把曲线图画出来了。(小编一般是不愿意往文章里面放公式的,霍金说过:一本科普书中,每多一个公式,读者减少就会一半,但是这两个公式比较简单,小编就冒个险 )
P (send|r) = 1− 1/(1+exp(6−3r))BitSwap账单
BitSwap节点会记录下来和其他节点通信的账单(数据收发),可以保持节点间数据交换的历史和防止篡改。当两个节点之间建立连接的时候,BitSwap会相互交换账单信息,如果账单不匹配,则清除重新记账。恶意节点可能会故意“丢失”账单,以希望清除掉自己的债务。其它交互节点会把这些都记下来,如果总是发生,节点就会被拒绝。
BitSwap协议
IPFS节点之间的数据交换和激励体系大致就是这些内容。有想深入了解的读者,建议参考一下 BitTorrent协议,IPFS的p2p协议大部分都来自于BitTorrent:
https://en.wikipedia.org/wiki/BitTorrent
下次我们主要讲一下IPFS节点是如何找到彼此的?
本专栏的微信公众号IPFS指南(ipfs_guide),致力于IPFS的知识的普及,如果你对IFPS、Filecoin,挖矿感兴趣,敬请关注!
本专栏的文章允许转载,但请注明:原文来自于知乎专栏:IPFS指南(IPFS指南)作者:飞向未来