众所周知,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内没有响应的时侯会尝试链接这些节点。

未完待续。

BitCoin p2p通信过程的更多相关文章

  1. [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)

     [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching) http://www.360doc.com/content/12/0428/17/6187784 ...

  2. P2P通信标准协议(一)之STUN

    前一段时间在P2P通信原理与实现中介绍了P2P打洞的基本原理和方法,我们可以根据其原理为自己的网络程序设计一套通信规则, 当然如果这套程序只有自己在使用是没什么问题的.可是在现实生活中,我们的程序往往 ...

  3. 实验六 CC2530平台上P2P通信的TinyOS编程

    实验六 CC2530平台上P2P通信的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的掌握射频通信TinyOS编程方法 学生通过本实验应理解TinyOS中 ...

  4. P2P通信原理与实现(C++)

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

  5. p2p通信原理及实现(转)

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

  6. P2P通信标准协议(四)之SIP

    在前面几篇文章中我们介绍了建立p2p通信的一般协议(簇),以及一种完整的NAT传输解决方案ICE, 但是对于多用户的通信情况,还有一些通用协议来实现标准化的管理,如之前讲过的SDP和SIP等,SIP( ...

  7. P2P通信标准协议(三)之ICE

    在P2P通信标准协议(二)中,介绍了TURN的基本交互流程,在上篇结束部分也有说到,TURN作为STUN 协议的一个拓展,保持了STUN的工具性质,而不作为完整的NAT传输解决方案,只提供穿透NAT的 ...

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

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

  9. p2p通信原理及实现

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

随机推荐

  1. Effective Java 第三版——2. 当构造方法参数过多时使用builder模式

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  2. JavaScript面向对象编程(9)高速构建继承关系之整合原型链

    前面我们铺垫了非常多细节.是为了让大家更加明晰prototype的使用细节: 如今能够将前面的知识整合起来,写一个函数用于高速构建基于原型链的继承关系了: function extend(Child, ...

  3. Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

    ※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...

  4. Android使用XUtils框架上传照片(一张或多张)和文本,server接收照片和文字(无乱码)

    Android上传图片,这里我使用了如今比較流行的XUtils框架.该框架能够实现文件上传.文件下载.图片缓存等等,有待研究. 以下是Android端上传的代码: xUtils.jar下载 Strin ...

  5. Eclipse 使用小结

    代码智能提示 Java智能提示 Window -> Preferences -> Java -> Editor -> Content Assist -> Auto Act ...

  6. 《程序员修炼之道:从小工到专家》【PDF】下载

    <程序员修炼之道:从小工到专家>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196340 内容简介 <程序员修炼之道> ...

  7. 小白的Python之路 day1 表达式if ... else ,while循环,for循环

    表达式if ... else 一.用户登陆验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 提示输入用户名和密码    # 验 ...

  8. Java Mac电脑配置java环境,JAVA IDE eclipse开发svn使用

    .SELECT TOP 规定返回记录的数目(对于大型数据库很有用的) SELECT TOP number|percent column--name FROM table; 1.2 SELECT LIM ...

  9. 4.Nginx的URL重写应用

    Nginx的URL重写应用 nginx的URL重写模块是用得比较多的模块之一,所以我们需要好好地掌握运用.常用的URL重写模块命令有if,rewrite,set,break等. if命令 if用于判断 ...

  10. java之自动过滤提交文本中的html代码script代码

    public class test { public static String Html2Text(String inputString) { String htmlStr = inputStrin ...