BitCoin p2p通信过程
众所周知,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通信过程的更多相关文章
- [转]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 ...
- P2P通信标准协议(一)之STUN
前一段时间在P2P通信原理与实现中介绍了P2P打洞的基本原理和方法,我们可以根据其原理为自己的网络程序设计一套通信规则, 当然如果这套程序只有自己在使用是没什么问题的.可是在现实生活中,我们的程序往往 ...
- 实验六 CC2530平台上P2P通信的TinyOS编程
实验六 CC2530平台上P2P通信的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的掌握射频通信TinyOS编程方法 学生通过本实验应理解TinyOS中 ...
- P2P通信原理与实现(C++)
1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...
- p2p通信原理及实现(转)
1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...
- P2P通信标准协议(四)之SIP
在前面几篇文章中我们介绍了建立p2p通信的一般协议(簇),以及一种完整的NAT传输解决方案ICE, 但是对于多用户的通信情况,还有一些通用协议来实现标准化的管理,如之前讲过的SDP和SIP等,SIP( ...
- P2P通信标准协议(三)之ICE
在P2P通信标准协议(二)中,介绍了TURN的基本交互流程,在上篇结束部分也有说到,TURN作为STUN 协议的一个拓展,保持了STUN的工具性质,而不作为完整的NAT传输解决方案,只提供穿透NAT的 ...
- ESFramework Demo -- P2P通信Demo(附源码)
现在我们将在ESFramework Demo -- 文件传送Demo 的基础上,使用ESPlus提供的第四个武器,为其增加P2P通信的功能.在阅读本文之前,请务必先掌握ESFramework 开发手册 ...
- p2p通信原理及实现
1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...
随机推荐
- Linux已经全然统治了这个世界:反对开源社区愚不可及
原文来自:http://readwrite.jp/archives/9977 不管一个企业多强大,它都不存在和开源社区抗衡的实力 十年前.Unix占有最快的计算机世界排名前10位的五席,以及超级计算机 ...
- 基于MATLAB的人脸识别算法的研究
基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...
- java中websocket的应用
在上一篇文章中,笔者简要介绍了websocket的应用场景及优点,戳这里 这篇文章主要来介绍一下在java项目中,特别是java web项目中websocket的应用. 场景:我做了一个商城系统,跟大 ...
- Asp.Net Web API(一)
什么是Web API HTTP不仅仅服务于Web Pages.他也是一个创建展示服务和数据的API的强大平台.HTTP是简单的,灵活的,无处不在的.你能够想象到几乎任何的平台都会有HTTP服务库.HT ...
- ERROR: Java 1.7 or later is required to run Apache Drill.
问题 Apache 的 drill 执行启动命令 drill-embedded 报错: ERROR: Java 1.7 or later is required to run Apache Drill ...
- 【python】字符串、列表、元组间相互转化及函数len、max、min、sum、sorted、reversed、enumerate、zip用法示例
- JavaScript基础4——关于语句流程控制(分支语句、循环语句等)
分支语句 (1)if...else...语句,基本格式分三种,如下 <script type="text/javascript"> var i=50; //if语句 i ...
- sqlserver 存储过程 游标实例
if exists(select * from sysobjects where id = object_id(N'dbo.test_cursor') and type = 'P') drop PRO ...
- 探索C++对象模型
只说C++对象模型在内存中如何分配这是不现实的,所以这里选择VS 2013作为调试环境具体探讨object在内存中分配情况.目录给出了具体要探讨的所有模型,正文分标题依次讨论.水平有限,如有错误之处请 ...
- Mysql 备份恢复与xtrabackup备份