p2p网络是一种在组网节点之间进行任务分配和工作负载的对等网络。节点之间地位相等、功能相同、无主次之分。没有中心节点,每一个节点既是服务的请求者又是服务的响应者。资源冗余存储,部分节点的故障不影响整体网络的运行。
p2p网络是一个天然的分布式、去中心化的信息存储和查询网络,是区块链网络层的标准解决方案,区块链网络的数据同步、状态更新、消息广播都是通过P2P网络进行的。
在区块链出现之前,p2p网络已经被电驴、BitTorrent所广泛采用,区块链P2P实现大多是对已有P2P网络的微小改进,以适应区块链自身的特点。
以太坊的P2P网络
以太坊的P2P网络由两部分组成:网络发现模块,数据传输模块。
网络发现模块主要包含ping/pong/findNode/sendNeighbours四个方法。
ping/pong方法用于节点发现;
findNode用于查询附近的节点;
sendNeighbours用于返回附近的节点,网络发现的细节参考了Kademlia协议。
整体结构是一个二叉树,每一个节点都是二叉树的一个叶结点,叶结点是一个256位的二进制值,是通过一个512位的公钥计算得到的。两个叶节点间的距离由叶结点进行异或运算得到。每一个节点都拥有一个由32个桶构成的路由表。表中由近及远存储了已经发现的节点,每个桶最多存储16个节点。
当一个节点A加入网络时,先通过外部机制,获取到初始路由表。A向路由表中距离自己最近的节点B发送ping消息,如果节点B存在则返回pong消息。A向B发送查询附近节点的请求findNode,B从自己的路由表中返回16个距A最近的节点。如果返回的节点中,C比B离A更近,则A向C发出ping请求,并重复以上步骤,直到找不到距离A更近的节点为止(如图一)。在一个拥有2^n个节点的网络中,最多需要n次就可以找到距离A最近的节点列表。实际项目中,可以通过并行查找提高效率,通常使用UDP协议。
(图一)
数据传输模块负责和已发现的节点进行数据交换。A节点给B节点发送一个hello消息,定义了相互之间数据交互的规则,然后通过send和receive对加密数据进行交换,获取到数据之后,先解密然后存储到本地数据库。
当节点需要广播消息时,则取出附近的节点,向附近节点发送消息,附近节点发现这是一个广播消息,也会向其他附近节点发送该消息,直至传遍整个网络。
多侧链的p2p网络
第三代区块链项目通常都具有多侧链功能。而常规的P2P网络无法很好的适应该需求。FairBlock区块链项目在实现过程中对现有的p2p网络进行了改进,使得单个P2P网络可以同时运行多个侧链。每一个节点都为自己关心的所有侧链单独维护一张路由表(如图二)。节点之前互相发现和消息传递时,都会增加额外的侧链编号字段,以唯一表示当前正在运行的侧链。同一节点可以同时运行多个侧链,而不会互相影响。
(图二)
在FB的基于CPOS的测试网络中,同时运行了100个侧链,平均3秒左右即可生成一个新的区块,在侧链增多的情况下,区块生成速度和传播速度几乎不受影响。
领取专属 10元无门槛券
私享最新 技术干货