-
Notifications
You must be signed in to change notification settings - Fork 6
HPB主网P2P网络介绍
对等网络(P2P网络)是分布式系统和计算机网络相结合的产物。可以定义为:网络的参与者共享他们所拥有的一部分硬件资源(处理能力,存储能力,网络连接能力,打印机等),这些共享资源通过 网络提供服务和内容,能被其他对等节点直接访问而无需经过中间实体。在此网络中的参与者即是资源,服务和内容的提供者,又是资源,服务和内容的获取者。
在HPB主网网络中,是由运行HPB公链程序的计算机作为单个节点,这些节点通过网络连接在一起组成P2P网络,提供网络连接,数据库存储和处理能力(例如挖矿和共识,执行合约等)。
下面对HPB主网的网络结构图和组成网络的节点进行介绍。
P2P网络是对分布式概念的拓展,相较于传统方式下的集中式网络,其特点主要体现在以下几个方面
非中心化:网络中的资源和服务分散在所有节点上,信息的传输和服务器的实现都直接在节点之间进行,可以无需中间环节和服务器的介入。
可扩展性:在P2P网络中,节点可以很容易的接入和删除,随着节点的增加,系统整体的资源和服务能力也在同步的扩充,理论上其扩展性可以认为是无限的。
健壮性:P2P网络由于是由对等的网络节点组成的,服务也是分散在各个节点之间进行的,即使部分节点遭到破坏,对整个网络的影响也是很小的。
最终一致性:在共识算法的作用下,每个节点都要求自身的数据库与主网其他节点保持一致,因此,在不断的同步和转发过程中,各节点的数据库将最终保持一致。
下图是HPB主网的P2P网络的网络结构图。从图中可以看出,各个节点之间除了bootnode与bootnode之间,snode与snode不会相互连接之外,其他的节点之间都会进行连接。在HPB主网中根据共识算法将node节点区分为3种不同的类型,其中图中Bnode代表静态节点bootnode,hnode代表高性能节点,pnode代表候选节点,snode代表同步节点。关于3种节点类型的产生将在下节介绍。
在P2P网络中,从节点通信方式上看,可以分成两类:邻居节点和Peer节点
邻居节点
邻居节点是指通过了udp ping-pong通信的节点,udp ping-pong通信用于检测对方节点是否在线。
peer节点
peer是网络中通过了通信握手的节点,只有邻居节点才有可能称为peer节点。通信握手是为了确认对方节点的合法性。peer节点是相互的,A节点是B节点的peer,则B节点也会是A节点的peer。在P2P网络中,每一个新接入的节点都有可能节点的peer。
从共识角度看,节点可以分成3类:高性能节点(hpnode),候选节点(prenode),同步节点(synnode)
高性能节点(hpnode):从候选节点中选举出来的,用于生成区块,目前数量最大为31个。
候选节点(prenode):由社区投票产生。
同步节点(synnode):仅用于同步数据库,不参与选举和产生区块。
备注:高性能节点和候选节点都是带有boe的节点。
在P2P网络中,节点可以自由的加入或退出网络,这就需要各个节点能够管理其他的节点信息。包括节点是发现其他节点的,如何添加节点和删除节点的。
由于P2P网络本身并没有一个中心化的服务器用于连接,因此一个新节点想要加入到P2P网络中,必须知道P2P网络中的节点信息。因此,为了新节点能够接入到网络中,在节点启动的时候查找静态节点信息,并通过连接静态节点的方式接入网络,然后通过与静态节点(bootnode)的交互获取到网络中的其他节点信息。静态节点是指所有节点启动都要先连接的节点,节点信息是直接写入到代码里的。下面是节点发现的时序图:
上图中nodeA已与bootnode节点建立连接,连接过程与其他节点的连接是一样的,具体过程参考下一节。
在节点发现阶段,连接静态节点成功后,新节点会向bootnode请求bootnode自身的邻居节点信息,然后针对bootnode返回的节点信息,一一进行udp ping-pong请求。如果通信正常,则将该节点信息加入到邻居节点中。请参考下图
前文介绍了邻居节点是怎么来的,这个过程是持续不断的进行的。节点启动后,也会不断的检查bootnode列表与邻居节点列表,并将未连接的节点信息取出来,进行握手通信。连接成功后,将节点信息加入peers节点列表,使用admin.peers命令查看到的就是这里的peers节点列表。三次握手通信具体过程请参考下图,握手过程中只要出错,则此次连接就算失败,然后等待一段时间后重新发起握手通信。
第一次握手:节点生成认证信息发送给对方。
第二次握手:收到对方的认证信息使用boe进行签名(没有boe就不签名)并发送给对方,并校验对方发送过来的签名是否是使用boe签名。如果不是boe签名或者对方节点信息没在硬件信息表中,就可以认为对方是snode。
第三次握手:更新硬件信息表。
以上3步完成后,nodeA节点将nodeB节点添加到自己的peers列表中,同理,nodeB也同样将nodeA添加到自己的peers列表中。至此,nodeA与nodeB的连接成功,添加节点完成,
节点能添加就能删除。下面介绍下将对方节点会从peers中删除的几种情况。
1.校验genesis失败的时候。
2.同步数据的时候,对方发送的区块信息不合法的时候,会主动断开连接,删除peer。
3.在进行网络通信如发送数据失败的时候和读取数据失败的时候。
4.收到对方节点发来的断开连接的请求时。
在HPB主网的P2P网络中,由于每个节点都尽可能多的连接着其他的节点,为了保证数据的最终一致性,每个节点都有责任将自身产生或者接收到其他节点的数据转发给其他节点。
从数据的转发方式上又可以分为两种。一种是定向发送即一对一,一种是广播发送即一对多。
a.定向发送:例如节点的数据同步,请求节点和发送节点是一对一的。
b.广播发送:例如节点在校验新的交易和新的区块通过后,通过广播的方式发送给连接的所有节点。在HPB主网中为了节省带宽,降低数据冗余,提高公链性能,根据节点类型对转发规则进行了优化。规则如下:
针对新交易:
当前节点是snode:将交易广播给pnode节点和hnode节点
当前节点是pnode:将交易广播给pnode节点和hnode节点
当前节点是hnode:将交易广播给hnode节点。
针对新区块:
当前节点是snode:不需要广播新块出去。
当前节点是pnode:将新块广播给pnode节点和snode节点。
当前节点是hnode:将新块广播给hnode节点和pnode节点。
在以上规则中,主要是减少了高性能节点hnode产生的新块的转发量,来提高hnode的性能。
从上文了解到的信息,可以和其他公链的区块链做个比较,以以太坊为例,两者在P2P网络方面是大同小异,HPB在P2P网络方面主要有2个不同点,可以说是根据自身的节点特性做的调整:
1、节点类型的划分,通过在节点连接的三次握手环节,增加boe签名和验签,判断对方节点是否属于同步节点,如果自己也是同步节点,就可以减少无用的连接。
2、在区块广播方面,以太坊每次广播的节点是peers列表中前连接数的平方根个节点,最坏的情况下会出现区块只在小范围的节点之间传播,而HPB根据节点类型的广播则不会出现这种情况。
以上就是对HPB主网的P2P网络的简单介绍。
|中文(简体)版本 | |English Version|
Basics
R&D
- HPB-Consensus-Algorithm-Election-Mechanism
- HPB-BOE-Introduction
- HPB-Consensus-Algorithm--Compare
- HPB-Gas-Mechanism
- HPB-P2P-NetWork
- HPB-JSON-RPC-API-Index
- RLP-Agreement-Extended-Reading
- Interface-of-HPB-hardware-random-number-generator
- HPB-hardware-random-number-service
HPB Dapp Development
- Quick-Start-For-HPB-Developer
- HPB-Dapps-Introductions
- HPB-EVM-Contracts-Introductions
- HPB-Extended-Reading-on-EVM-Development
- An-Introduction-to-EVM-Virtual-Machines
- HPB-Smart-Contracts-Extended-Doc
- Best-Practice-of-Accessing-HPB-Main-Network-in-JS-version
- Best-Practice-of-HPB-Main-Network-Access-Java-Version
- Best-Practice-of-HPB-Smart-Contract
- Case-of-Transmission-from-Ethereum-DAPP-to-HPB-blockchain
- How-to-Write-a-Contract-Extended-Reading
- Development-Tool--Remix-Extended-Reading
- Solidity-Language-Extended-Reading
- Token-issuance-on-HPB-MainNet
- Migrating-a-Ethereum-DApp-to-the-HPB-MainNet
HPB Wallet Development
- An-Introduction-to-HPB-Wallet
- HPB-Wallet-for-Xcode-Integration
- Creating-the-HPB-Wallet
- Generating-Mnemonics-for-HPB Wallet
- HPB-Wallet-and-Middleware-Interface
HPB Mainnet/TestNet Entry
- HPB-Development-Node-Construction-Guild
- Guide-to-Server-Security-Reinforcement
- Build Node With Docker
- HPB-Private-Chain-Building-Guide
Developer Community