众所周知,Bitcoin是建立在p2p网络上的,但是具体的通信过程一直没有搞懂,所以特意去bitcoin的Developer Guid上去了解了一下。由于本人英文水平有限,理解难免有偏差的地方,希望大家多多指正。

参考网址:https://bitcoin.org/en/developer-guide#p2p-network

============================================================

关键字:

SPV: Simplified Payment Verification, A method for verifying if particular transactions are included in a block without downloading the entire block. The method is used by some lightweight Bitcoin clients, 例如比特币钱包节点.

BitcoinJ:

Bitcoin Core:

==============================================================

(1)p2p网络是一个overlay网络,依据特定的p2p协议构建在现有的物理网络之上,在Bitcoin中不是只有一层网络。

Consensus rules do not cover networking, so Bitcoin programs may use alternative networks and protocols, such as the high-speed block relay network used by some miners and the dedicated transaction information servers used by some wallets that provide SPV-level security.

ps: 所谓的high-speed block relay network 就是一些大型挖矿节点和交易平台之间传输消息的快速通道,专门给这些狗大户用的。 dedicated transaction information servers 就是给这些轻型客户端钱包节点用的,反正你又不挖矿,又不参与校验,没必要把不相关的交易传给你。说好的所有节点平等呢?

(2)不是所有的全节点都保留着所有的交易数据,全节点之间也有不同。

Full nodes download and verify every block and transaction prior to relaying them to other nodes. Archival nodes are full nodes which store the entire blockchain and can serve historical blocks to other nodes. Pruned nodes are full nodes which do not store the entire blockchain.

ps: Pruned nodes (阉割版全节点)能否挖矿?有待论证。

Peer Discovery

首先,无论在那种协议的网络中,通信的先决条件就是先找到对方。假设你是一个刚加入p2p网络中的新节点,人生地不熟的谁也不认识,你怎么去发现其他节点?又怎么让其他节点知道你?在Bitcoin的网络中,它是这样做的:

在Bitcoin 客户端 中硬编码进去几个DNS seeds的地址(跟传统的域名解析不一样,说白了就是节点地址索引服务器,而所谓的硬编码就是写死在代码里面),你能从这些种子节点获取其他节点的ip和端口,同时DNS seed 也会把你的地址记录进去。但总是从DNS seed中去获取地址访问压力太大,而且还存在着中间人攻击的危险,所以尽量避免从DNS seeds 去获取地址.

对于避免过度依赖DNS seeds,Bitcoin core 和 BitcoinJ 做法不同:

Bitcoin core: 由于在Bitcoin 的网络中 一个结点可以将自己的 peers list 发送给其他节点,这样就可以免去对与DNS的依赖。利用这一点,Bitcoin core以后每次启动的时候直接去链接这些节点就可以了,不用再次去DNS seed获取。Bitcoin core 为了避免因为对于DNS seed的依赖而造成问题会将已知的节点记录在peer list(存储在本地数据库中,不会因为节点重启而消失),在每次需要发送消息的时候,它会花费11s的时间尝试和peer list中的节点建立链接,如果有任何一个节点在超时之前可以链接上,就不用去DNS seed获取地址。

BitcoinJ:Bitcoin core 的方式虽然可以降低访问DNS seed的次数,但是peer list 的节点并不是时时刻刻都能访问的,它们可能因为网络故障无法通信,也可能因为地址变更而失效。如果你足够‘走运’,可能一个节点都链接不上而作无用功。这势必会给交易带来延迟,给用户很不好的体验。 专注于轻型钱包快捷支付的BitcoinJs为了避免延迟同时也为了避免中间人攻击 ,每次都会使用不同的DNS seed取获取当前运行的节点。

同时以上两种都会硬编码进去一些在版本发布期间长时间活跃而且稳定的节点地址(比如一些狗大户的),Bitcoin core 在DNS seed 60s内没有响应的时侯会尝试链接这些节点。

未完待续。

转载于:https://www.cnblogs.com/cnblogs-wangzhipeng/p/7201215.html

BitCoin p2p通信过程相关推荐

  1. ESFramework Demo -- P2P通信Demo(附源码)

    现在我们将在ESFramework Demo -- 文件传送Demo 的基础上,使用ESPlus提供的第四个武器,为其增加P2P通信的功能.在阅读本文之前,请务必先掌握ESFramework 开发手册 ...

  2. 穿越NAT的p2p通信方法研究

    穿越NAT的p2p通信方法研究 日期:2008-12-08 来源:P2P网  作者:未知 字体:大 中 小 <script src="http://www.ppcn.net/ads/b ...

  3. Android P2P 通信方案探索

    最近研究起了P2P网络,p2p网络其它很早就有了,但是用到的地方不多,以前最多用来p2p种子下载音乐视频这类的应用,对它的原理也一知半解,以p2p下载视频为例,大概原理:服务器里并不保存视频资源,只是 ...

  4. P2P通信中的NAT/FW穿越

    摘要:P2P(Peer-to-Peer)通信的发展极其迅速,形成了很大的影响.和传统通信一样,P2P通信同样受到NAT/FW穿越问题的制约,因此解决好其相关的NAT/FW穿越问题非常重要.和传统通信相 ...

  5. 内网穿透实现P2P通信

    P2P 通信最大的障碍就是 NAT(网络地址转换),NAT 使得局域网内的设备可以与公网进行通讯,但是不同 NAT 下的设备之间通讯将会变得很困难.UDP 打洞就是用来使得设备间绕过 NAT 进行通讯 ...

  6. 简单易懂的P2P通信原理

    P2P就是端到端 我发一条微信给你,这不是P2P.因为消息并不是直接从我手机发送到你的手机,而是从我手机先发送到微信的服务器,服务器再转发到你的手机上(当然,转发给你之前,还会把数据存到服务器),像下 ...

  7. P2P通信基本原理与实现

    本文转载自: https://www.pppan.net/blog/detail/2017-12-16-p2p-over-middle-box 如有侵权,通知删除 P2P通信基本原理与实现 #P2P ...

  8. P2P通信原理与实现(C++),NAT,网络穿透原理

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...

  9. TCP通信过程详解以及tcp长连接和短连接

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三 ...

  10. NGK独创匿名P2P通信网络可以保护使用者的隐私

    随着科技日新月异的快速发展,网络安全和隐私通信开始受到人们的关注和重视.尤其是在区块链网络中,由于区块链网络的完整性.可用性.真实性,无法满足有隐私保护需求场景,这就迫使目前市面上的项目加上匿名功能, ...

最新文章

  1. java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)
  2. cfa三级真题和mock_两年高分过CFA三级的女学霸:复习秘诀刷爆了朋友圈!
  3. mysql修改虚拟列属性失败_mysql虚拟列(Generated Columns)及JSON字段类型的使用
  4. 数学大师丘成桐:中国的科技至少要倒退20年
  5. 技术创作101训练营:从0到1教你搭建自己的技术品牌
  6. 如何在Ubuntu系统的顶部标题栏中增加CPU/内存/网速实时监控的小控件
  7. halcon标定后改变世界坐标系参考点方法
  8. matlab 判断鼠标按下_轻巧可爱,支持多设备——雷柏Ralemo Air1乐萌鼠标
  9. ASP.Net防止页面刷新重复提交
  10. 为什么要远程连接Linux
  11. 郑州大学c语言课程设计2000行,C语言课程设计大作业(1).pptx
  12. 我说我水平高,因为我CSDN博客排名前100
  13. php实现身份证号码获取归属地地址的实例
  14. 骚操作!快速创建JSON数据和解析JSON数据
  15. 动态规划入门(走楼梯问题 c++)
  16. allegro 问题
  17. 关于win10输入法导致电脑直接卡机无法动弹问题
  18. SRM供应商协同管理系统功能介绍
  19. C++【引用】——串讲
  20. 学编程,你不能学会了游泳再下水

热门文章

  1. 360全景视频panolens.js 实现代码
  2. java 生成word 分页_Java 插入分页符和分节符到Word文档
  3. js导出WORD设置分页
  4. d3.js学习10----折线图的制作
  5. 小马激活手动分配磁盘_不要成为“单把小马”手动测试仪
  6. 电脑怎么用计算机打开指令,命令提示符怎么用 命令提示符快捷键打开使用技巧详解...
  7. 解决windows server 2003安装dhcp服务器的问题
  8. 虚拟机2008安装DHPC服务器,Windows Server 2008 配置DHCP服务器
  9. 【verbs】IBV_WR API(3) Libibverbs Programmer’s Manual
  10. python贪吃蛇游戏手把手教学 第一课