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,但还 ...
随机推荐
- MapReduce编程(一) Intellij Idea配置MapReduce编程环境
介绍怎样在Intellij Idea中通过创建mavenproject配置MapReduce的编程环境. 一.软件环境 我使用的软件版本号例如以下: Intellij Idea 2017.1 Mave ...
- 5. Effective Java 第三版——使用依赖注入取代硬连接资源
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Error updating database. Cause: java.sql.BatchUpdateException: Field 'id' doesn't have a default value
异常信息 ### Error updating database. Cause: java.sql.BatchUpdateException: Field 'id' doesn't have a de ...
- org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
异常信息 org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable represen ...
- signalr中Group 分组群发消息的简单使用
前一段时间写了几篇关于signalr的文章 1.MVC中使用signalR入门教程 2.mvc中signalr实现一对一的聊天 3.Xamarin android中使用signalr实现即时通讯 在平 ...
- ArcGIS API for JavaScript 4.2学习笔记[6] goTo()地图动画
这是个很有意思的例子,不过例子给的比较复杂,需要查很多API,我会在文章最后给出关键的类和属性解释. 同样发现一个很有意思的事儿:博客园似乎有爬虫,我4号发布的blogs,5号就在百度和google搜 ...
- 某次送温暖考试的 c题
题目大意: 给定n个点的无根树,树上每个点都有一个非负的点权. 树上的路径的价值定义为树上路径的点权和-树上路径的点权最大值; 现在给定一个参数P询问有多少条路径的价值是P的倍数(注意单点也算路径,路 ...
- ubuntu12.04destdrop删除不必要的软件
sudo apt-get -y --auto-remove purge unity unity-2d* sudo apt-get -y purge empathy sudo apt-get -y ...
- 安装Linux桌面后无法显示登录桌面
安装完图形后无法显示图形界面,只有命令行模式界面 . 猜测原因可能跟电脑位有关,在BIOS中开启虚拟化技术, 电脑开启设置F2 /Security/Virtualization, 选择Enable. ...
- Centos7解决图形界面卡死问题
经常会遇到图形界面卡死,搜了一搜,解决办法如下: killall -9 gnome-shell