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可以采取不同的策略来实现,每一种策略都会对系统的整体性能产生不同的影响。策略的目标是:

  1. 节点数据交换的整体性能和效率最高
  2. 阻止“吃白食”(freeloaders)的现象。就是不能够只下载数据不上传数据
  3. 可以有效的防止一些攻击行为(比如:女巫攻击)
  4. 对信任节点建立宽松机制(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指南)作者:飞向未来

IPFS: BitSwap协议(数据块交换)相关推荐

  1. 计算机网络之物理层:5、数据的交换方式(电路交换、报文交换、分组交换)

    物理层:5.数据的交换方式 思维导图: 为什么要进行数据交换: 数据交换方式: 电路交换: 报文交换: 分组交换: 分组交换的数据报交换方式: 分组交换的虚电路交换方式: 分组交换的虚电路与数据报方式 ...

  2. 基于STM32的RC522模块读写数据块以及电子钱包充值扣款系统的设计

    目录 前言 STM32F103ZET6单片机 RC522 相关引脚连接 准备工作 Mifare卡 读卡过程 最终实现功能 代码 RC522.C代码 RC522.H main.c led.h 前言 本人 ...

  3. 【车载IoT】国标《电动汽车远程服务与管理系统技术规范》:协议数据包结构及定义(重点)

    国标<电动汽车远程服务与管理系统技术规范>解读三部曲: 系统架构及协议概述: https://blog.csdn.net/XiuHua_Wu/article/details/1135301 ...

  4. 协议数据的发送与解析

    协议数据的发送与解析 对于C,C++等语言而言,我们常见各种各样的基本数据类型,比如char,int,float,double等等.为了回顾一一下具体的数据类型,下面我们看下面的一张表来回顾一下. 类 ...

  5. 共享内存实现进程间大数据的交换

    引言 进程间的数据交换和共享是一种非常重要和实用的技术.大.中型软件的开发设计多是由众多程序设计人员的合作完成,通常一个程序设计人员只负责其中一个或几个模块的开发,这些模块可以是动态链接库也可以是应用 ...

  6. 关于 RMAN 备份 数据块 一致性的讨论

    今天和 杭州恒生 的一个朋友讨论一个RMAN 在备份时数据块一致性的问题. 关于RMAN 的备份原理参考blog: RMAN 系列(一)---- RMAN 体系结构概述 http://blog.csd ...

  7. 拆分命令_在MongoDB分片集群中拆分数据块chunks

    MongoDB Manual (Version 4.2)> Sharding > Data Partitioning with Chunks > Split Chunks in a ...

  8. oracle+块头csc,数据块转储及RDBA的转换

    数据块转储及RDBA的转换 很多时候我们在进行进一步研究时需要转储(dump)Oracle的数据块,以研究其内容,Oracle提供了很好的方式,我们通过以下例子简单说明一下: [oracle@jump ...

  9. 索引块与数据块的区别

    一.索引块与数据块的区别 大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块.让我们来算一道数学题:如果表中的一条记录在磁盘上占用 1000字节的话,我们对其中10字节 ...

最新文章

  1. discuz x2.5插件开发傻瓜图文教程,用demo说话
  2. java ioutils_java – 无法解析符号’IOUtils’
  3. golang mysql封装_golang如何封装路由
  4. Android SDK上手指南:项目清单
  5. Linux用户与组命令之groupadd
  6. oracle 表空间 归档,oracle数据库表空间及归档
  7. Java 11:字符串类中的新方法
  8. html5双日期时间选择控件,bootstrap daterangepicker双日历时间段选择控件详解
  9. 储存程序是现代计算机的,A、信息论B、存储程序原理C、现代计算机理论D.DOC
  10. 幼儿识字软件测试自学,十大儿童识字APP排行,看看有你知道的吗?
  11. 代码规范及html5+css3基础知识
  12. tomcat常见漏洞
  13. 数据库在一对一、一对多、多对多怎么设计表关系
  14. Python之基础详解(九):关于VisualMapOpts视觉映射配置项详解
  15. 你知道什么浊化现象吗?
  16. Oracle FND - 用户API fnd_user_pkg的常用用法
  17. pamac 安装 ros-noetic-desktop-full(AUR) 失败后如何清理残留的问题
  18. 从0构建AI推荐系统demo(数据准备)
  19. 技术控,看这里,一款支持断点调试的数据科学工具
  20. canvas 动画库 CreateJs 之 EaselJS(下篇)

热门文章

  1. 'vt100': unknown terminal type.
  2. 一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(4)--控件属性功能区...
  3. 谈Tensorflow的Batch Normalization
  4. linux yum及yum仓库
  5. Win10:tensorflow 学习笔记(1)
  6. 2016年春季计算机应用基础,东北师范2016年春季《计算机应用基础》期末考核
  7. caffe源码分析:layer.hpp分析
  8. 在表格中批量显示图片
  9. Jupyter notebook入门教程(上)
  10. C++Primer:Break、Continue、Goto、Try/异常处理