阅读大概需要10分钟
前言
上两篇文章中我们聊了共识机制,今天我们聊一下区块链技术中的另外一个核心技术点:P2P网络(Peer to peer networking)。首先澄清一点的是这里讲的P2P这个概念跟平时我们在互联网金融圈提及的P2P概念不一样,这里聊的区块链技术P2P是指点对点的对等网络,它是区块链系统技术中的重要组成部分,而并非是互联网金融的网络借贷P2P。从当前p2p技术应用领域来看,它的应用已经非常成熟,也非常广泛,从文件共享到协助处理,从流媒体到点对点通信技术,像VoIP,BT,电驴 等等。
P2P网络主要的特点:
去中心化
可扩展性
健壮性
高性价比
隐私保护
负载均衡
什么是区块链P2P网络
区块链P2P网络是一个去中心化的点对点网络,这意味着跟传统网络C/S结构模式不一样,它是没有服务端,客户端的概念,它是由多个节点成员组成的网络结构,每个节点都是安全的网络成员,彼此节点之间处于对等的地位,相互节点之间共享资源,它既是资源的提供者(客户端)也可以资源的接受者(服务端),节点之间的通信一般采用socket 编程方式进行通信。
P2P网络结构是扁平化的拓扑结构,相互节点之间没有层次之分,如图示。
区块链P2P网络中的节点功能主要有:钱包交易功能、挖矿功能、区块链数据库功能、网络路由功能。
钱包交易功能:发起转账交易、查看账户余额、管理用户钱包地址的公钥、私钥。
挖矿功能:将用户的交易打包产生新的区块,与其它挖矿节点具有竟争性。
区块链数据库功能:存储所有区块交易数据信息,一个完整的区块链数据库容量是比较大,像比特币来讲它的Size 大于140G。
网络路由功能:每个节点必须具备的,寻找附近节点的连接;比如比特币网络中使用硬编码DNS-seed方式来做初始节点发现,以太坊采用Kademlia(Kad)算法实现节点间路由,定位连接。
区块链P2P网络的节点
全节点:全节点需要参与区块的校验,对交易进行确认,以及交易信息的广播,因此全节点必须包含完整的区块链数据库副本,包括所有交易的数据信息,另外全节点也必须具备执行路由的操作,帮助节点与节点之间的连接发现,全节点越多就直接影响整个网络交易的效率,因为它们执行决策功能,决定了一个区块和一笔交易的是否有有效性。
矿工节点: 矿工节点一般是运行在性能比较高的硬件上(上一篇文章有提到“PoW挖矿机的进化史”),目标是通过解决工作量证明(PoW)算法问题,与其它矿工节点抢夺记账权。如果挖矿节点同时也存储了完整的区块链数据库,这样它属于是全节点,这种节点也称为独立矿工(Solo Miner)。另外有一部分矿工节点是由多个单独节点联合组成连接到矿池,参与集体挖矿的,这种节点叫矿池矿工(Pool Miner)。这种矿池矿工节点,一般是由一个内部矿池网络搭建,中心节点是矿池服务器,然后由分散的矿工通过矿池内部协议连接到矿池服务器,然后再由矿池服务器作为一个全节点方式与其它区块链节点通过主网方式进行通信连接。
SPV(Simplified Payment Verification)节点:也叫轻节点,简单支付验证,这类节点它不会存储完整的区块链数据库,只存储其中一部分,而不会存储所有交易数据,例如它只存储区块头的Hash数据。SPV节点主要完成支付交易的校验,不过它不是验证所有的交易,而只是一个交易子集,例如,转账到某个指定地址的交易。一个SPV节点依赖于全节点来获得数据,允许多个SPV节点连接到一个全节点。钱包应用就是采用SPV节点方式,个人不需要下载完整的区块链数据库,也可以完成交易验证。
区块链中P2P节点交易过程
通过中心节点创建区块链数据结构。
中心节点创建一个创世钱包地址,并创建创世区块,同时生成一个钱包地址数据库表和一个区块链数据库表。
中心节点备份一个只包创世区块的区块链数据库genesis.db。
启动钱包节点连接到中心节点,并请求下载区块链数据库表。
启动矿工节点连接到中心节点,并请求下载区块链数据表。
钱包节点创建多个新的用户钱包地址。
矿工节点创建矿工钱包地址。
用户发起转账交易,由钱包节点确认一笔新交易发起。
矿工节点接收到新交易,并先将一笔新交易存放到内存池。
当矿工节点交易内存池达到一定数量,即发起打包一个新区块确认,并广播给全网节点。
中心节点校验确认新区块完成,修改区块链数据表,并广播给所有钱包节点。
钱包节点收到新区块交易确认广播后,与中心节点进行数据同步。
用户基于钱包节点查询交易是否成功。
节点交互逻辑
节点之间的交互必须遵循特定的协议指令,这些指令包含有消息头和消息体,消息头主要是包含发送的协议指令,消息体是传递的实际内容。
一般指令分为两大类,一类是请求指令,一类是数据交互指令。
交互指令-版本号Version
当节点连接上以后首先是通过交互【版本号】来实现握手的操作,握手完毕后建立长连接。如在比特币系统上采用PING/PONG的消息协议,但在以太坊上将PING/PONG协议提前放在节点发现的逻辑上。
发送版本号格式比如: sendVersion(“主节点ip”, Version序列化结构值) 【12个字节长度 + 一个Version 序列化后的结构体数据】
版本号的代码结构:
节点之间的版本号请求及数据同步
发送版本号
版本命令处理器
请求指令-inv
Inv 向其他节点展示当前节点拥有什么块和那些交易数据,但它没有包含完整的区块链和交易,只有哈希值。
Inv结构
sendInv(主节点发送所有区块信息给钱包节点)
handleInv 接收处理器(钱包节点接收来自主节点的所有区块信息)
请求指令-getData
用于某个块或交易的请求。
Block 区块同步
当接收到一个新块时,把它添加到区块链里,如果还有更多的区块需要下载,即继续从上一个下载的块的节点中继续发出请求,直到把所有块都下载完成后,才对UTXO 集进行重新索引。
总结
本篇主要讲述了区块链技术中的核心技术点P2P网络的概念及特点,同时也介绍了区块链P2P网络的几大节点功能特征,以及相互节点之间的消息交互逻辑实现。