摘要:为什么区块链会选择作为网络基础上面介绍的时候说过,他是无中心服务器的,中心服务器就意味着,当受到攻击的时候,中心服务器一旦宕机,整个网络和服务就会出现问题。区块链的核心是去中心化,这和网络的观念不约而同,所以选择的理由也就很充分。
区块链中P2P介绍
p2p是什么
为什么区块链需要P2P
比特币、以太坊、超级账本和EOS的P2P对比
P2P作为区块链网络中去中心化的标识
P2P全称对等式网络(peer-to-peer),又称点对点技术,是无中心服务器、依靠用户群(peers)交换信息的互联网体系;与有中心服务器的中央网络系统不同,对等网络的每个用户端既是一个节点,也有服务器的功能,任何一个节点无法直接找到其他节点,必须依靠其户群进行信息交流。
优势
可在网络的中央及边缘区域共享内容和资源。在客户端/服务器网络中,通常只能在网络的中央区域共享内
由对等方组成的网络易于扩展,而且比单台服务器更加可靠。单台服务器会受制于单点故障,或者会在网络使用率偏高时,形为瓶颈。
由对等方组成的网络可共享处理器,整合计算资源以执行分布式计算任务,而不只是单纯依赖一台计算机,如一台超级计算机。
用户可直接访问对等计算机上的共享资源。网络中的对等方可直接在本地存储器上共享文件,而不必在中央服务器上进行共享。
p2p网络的三个特性
离散性:构成系统的节点并没有任何中央式的协调机制。
伸缩性:即使有成千上万个节点,系统仍然应该十分有效率。
容错性:即使节点不断地加入、离开或是停止工作,系统仍然必须达到一定的可靠度。
上面介绍P2P的时候说过,他是无中心服务器的,中心服务器就意味着,当受到攻击的时候,中心服务器一旦宕机,整个网络和服务就会出现问题。而P2P网络的优势在于,每个节点既是客户端又是服务端,所以当受到攻击时,任何一台机器垮掉,也不会影响整体的服务。
区块链的核心是去中心化,这和P2P网络的观念不约而同,所以选择P2P的理由也就很充分。
首先看一下P2P的整体技术点:
首先是如何发现peers,在P2P网络中,发现节点是最开始、最重要和最难的一部分;
节点之间建立链接;发现节点之后,就要进行握手链接,确定节点之间的通信协议等
节点之间的通信;链接建立之后,就可以正常的进行通信了;
以上三点解决之后,基本就可以实现一个简单的P2P网络。如果想要实现一个比较完整的P2P网络,当然还有很多的细节需要考虑,比如说,节点发现协议,快速定位节点,安全性,节点的加入和退出机制,节点的心跳保活等。我们主要介绍的是DHT分布式哈希表的知识点;
比特币、以太坊、超级账本和EOS都使用了DHT的具体实现;
链类型 | 使用的P2P协议 |
---|---|
区块链 | Gossip协议 |
超级账本 | Gossip协议 |
以太坊 | Kademlia协议 |
EOS | 自己实现的P2P协议 (待研究) |
比特币
节点发现
新节点启动后,想要参与协同运作,必须发现其他的比特币节点,也就是至少需要发现一个比特币网络中的节点,并建立联系。新节点找到对等体的方法:
- 种子节点:使用多个DNS服务器(比特币节点专用)来解析比特币节点的IP。
- 节点引荐:如果不知道DNS,则必须知道至少一个比特币节点的IP。节点链接
节点向peer节点发送version消息开始握手,peer节点需要检验版本,秘钥等数据,验证通过,会返回verack消息。
握手消息完成,节点发送包含自己IP地址和addr的消息给peer节点,对等节点收到,继续向它的对等节点发出addr消息,这样新节点的IP地址就会在P2P网络中广播出去(Gossip协议的Rumor-Mongering);因为网络中,节点可以随时加入和离开,所以所有的节点必须在一个节点退出的时候,寻找新节点,并且在其他节点启动的时候,对其进行帮组。
超级账本
以太坊
以太坊使用的是kademlia协议,简称Kad协议,具体的Kad协议在其他的文章中介绍。本文我们只需要知道Kad使用UDP进行节点间消息通信,每个节点根据与邻居节点距离之间的距离(NodeID的差距),分别放到不同的桶(bucket)中,且有4种消息ping - 用于探测其他节点是否还存在
store - 接收者受到后,将信息中key/value对存储在本节点
findnode - 接受者向发送者返回 k 个它知道的与目标结点距离最近的节点
findvalue - 和findnode 差不多,区别是如果接收者本地存在与目标结点对应的value,那么就回复这个值给发送者。
以太坊中的P2P网络是比较完整的,很值得学习,有发现、子协议和Nat映射等模块。我们主要讲解的是发现模块;
整体结构:
结构名 | 作用 |
---|---|
Server | 本地客户端服务 |
Node | 节点的信息 |
table | 存储peer节点的结构 |
udp | 底层节点的通讯协议 |
当本地启动一个客户端,并配置好静态peer节点的配置信息之后,启动的Server会进行三个操作
主动发现邻居
ECDH密钥建立,确认身份并进行身份验证
链接已经建立,确认生层交换协议,并运行这些协议
Node节点唯一的表示网络中的一个以太坊节点,并且Node节点有如下的信息:
IP地址
连接使用的UDP/TCP端口号
ID:以太坊网络中唯一标识一个节点,本质上是一个椭圆曲线公钥(PublicKey),与Server的PrivateKey对应。一个节点的IP地址不一定是固定的,但ID是唯一的。
用于节点间的距离计算的sha
Table主要用来管理与本节点与其他节点的连接的建立更新删除:
bucket - 所有peer按与本节点的距离远近放在不同的桶(bucket)中
refreshReq - 更新Table请求通道
Table会循环的监控并对peer节点进行刷新
定时(30s)启动Peer刷新过程的定时器
接收其他线程投递到Table的刷新Peer连接的通知,当收到该通知时启动更新
定时重新检查以连接节点的有效性的定时器
udp的底层接受数据包循环,负责接收其他节点的packet,并将解析后的信息交给另一个循环处理,这个循环处理负责控制消息的向上递交和收发控制
节点发现的流程:
邻居初始化
当一个节点启动后,它会首先向配置的静态节点发起连接,发起连接的过程称为Dial,此时的Dial需要知道IP地址,如果不知道需要有一个解析IP的过程(根据ID来解析)
建立连接,下面两个都成功则加入table中:
秘钥链接和确认
上层协议确认
探活检测(Revalidate)
有效性检测就是利用ping消息进行探活操作。Table启动了一个定时器(0~10s),定期随机选择一个bucket,向其末尾的节点发送ping消息,如果对方回应了pong,则探活成功。
更新邻居关系
定期(定时器超时)或不定期(收到refreshReq)地进行更新邻居关系(发现新邻居),两者都调用doRefresh()方法,该方法对在网络上查找离自身和三个随机节点最近的若干个节点。
EOS
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/24626.html
摘要:本文首发于深入浅出区块链社区原文链接分析比特币网络一种去中心化点对点的网络架构原文已更新,请读者前往原文阅读比特币采用了基于互联网的点对点分布式网络架构。比特币网络可以认为是按照比特币协议运行的一系列节点的集合。 本文首发于深入浅出区块链社区原文链接:分析比特币网络:一种去中心化、点对点的网络架构原文已更新,请读者前往原文阅读 比特币采用了基于互联网的点对点(P2P:peer-to-p...
摘要:和比特币网络传输协议的一系列优化使得比特币的新区块几乎可以在瞬间被全世界的矿工接收,非常有效的降低了孤块率,保证了网络安全。 这篇文章试图讨论全节点对于区块链的意义。 角色 我们都知道,区块链网络中的节点有不同的角色。例如: 出块节点 出块节点负责打包交易,生产区块。出块节点在不同的地方有不同的名字,例如比特币和以太坊中的矿工/矿池,Bitshares的Delegator,EOS的Pr...
阅读 880·2021-11-15 11:38
阅读 1601·2021-09-24 09:48
阅读 840·2021-09-24 09:47
阅读 2271·2021-08-26 14:15
阅读 3499·2019-08-30 11:09
阅读 2605·2019-08-29 16:55
阅读 1585·2019-08-26 14:01
阅读 3033·2019-08-23 16:47