P2P网络
设计目标
FISCO BCOS P2P模块提供高效、通用和安全的网络通信基础功能,支持区块链消息的单播、组播和广播,支持区块链节点状态同步,支持多种协议。
P2P主要功能
- 区块链节点标识
通过区块链节点标识唯一标识一个区块链节点,在区块链网络上通过区块链节点标识对区块链节点进行寻址
- 管理网络连接
维持区块链网络上区块链节点间的TCP长连接,自动断开异常连接,自动发起重连
- 消息收发
在区块链网络的区块链节点间,进行消息的单播、组播或广播
- 状态同步
在区块链节点间同步状态
区块链节点标识
区块链节点标识由ECC算法的公钥生成,每个区块链节点必须有唯一的ECC密钥对,区块链节点标识在区块链网络中唯一标识一个区块链节点
通常情况下,一个节点要加入区块链网络,至少要准备三个文件:
- node.key 节点密钥,ECC格式
- node.crt 节点证书,由CA颁发
- ca.crt CA证书,CA机构提供
区块链节点除了有唯一区块链节点标识,还能关注Topic,供寻址使用
区块链节点寻址:
- 区块链节点标识寻址
通过区块链节点标识,在区块链网络中定位唯一的区块链节点
- Topic寻址
通过Topic,在区块链网络中定位一组关注该Topic的节点
管理网络连接
区块链节点间,会自动发起和维持TCP长连接,在系统故障、网络异常时,主动发起重连
区块链节点间建立连接时,会使用CA证书进行认证
连接建立流程
sequenceDiagram participant 区块链节点A participant 区块链节点B 区块链节点A->>区块链节点A: 加载密钥和证书 区块链节点B->>区块链节点B: 加载密钥和证书 区块链节点A->>区块链节点B: 发起连接 区块链节点B->>区块链节点A: 连接成功 区块链节点B->区块链节点A: 发起SSL握手 区块链节点A->>区块链节点A: 从证书获取公钥,作为节点ID 区块链节点B->>区块链节点B: 从证书获取公钥,作为节点ID 区块链节点B->区块链节点A: 握手成功,建立SSL连接
消息收发
区块链节点间消息支持单播、组播和广播
- 单播,单个区块链节点向单个区块链节点发送消息,通过区块链节点标识寻址
- 组播,单个区块链节点向一组区块链节点发送消息,通过Topic寻址
- 广播,单个区块链节点向所有区块链节点发送消息
单播流程
sequenceDiagram participant 区块链节点A participant 区块链节点B 区块链节点A->>区块链节点A: 根据节点ID,筛选在线节点 区块链节点A->>区块链节点B: 发送消息 区块链节点B->>区块链节点A: 消息回包
组播流程
sequenceDiagram participant 区块链节点A participant 区块链节点B participant 区块链节点C participant 区块链节点D 区块链节点A->>区块链节点A: 根据Topic 1,选择节点B、C 区块链节点A->>区块链节点B: 发送消息 区块链节点A->>区块链节点C: 发送消息 区块链节点B->>区块链节点B: 根据Topic 2,选择节点C、D 区块链节点B->>区块链节点C: 发送消息 区块链节点B->>区块链节点D: 发送消息 区块链节点C->>区块链节点C: 根据Topic 3,选择节点D 区块链节点C->>区块链节点D: 发送消息
广播流程
sequenceDiagram participant 区块链节点A participant 区块链节点B participant 区块链节点C participant 区块链节点D 区块链节点A->>区块链节点A: 遍历所有节点ID 区块链节点A->>区块链节点B: 发送消息 区块链节点A->>区块链节点C: 发送消息 区块链节点A->>区块链节点D: 发送消息 区块链节点B->>区块链节点B: 遍历所有节点ID 区块链节点B->>区块链节点C: 发送消息 区块链节点B->>区块链节点D: 发送消息 区块链节点C->>区块链节点C: 遍历所有节点ID 区块链节点C->>区块链节点D: 发送消息
状态同步
每个节点会维护自身的状态,并将状态的Seq在全网定时广播,与其它节点同步
sequenceDiagram participant 区块链节点A participant 区块链节点B 区块链节点A->区块链节点B: 广播seq 区块链节点A->>区块链节点A: 判断节点B的seq是否变化 区块链节点A->>区块链节点B: seq变化,发起状态查询请求 区块链节点B->>区块链节点A: 返回节点状态 区块链节点A->>区块链节点A: 更新节点B的状态和seq