设计目标

Simplechain P2P模块提供高效、通用和安全的网络通信基础功能,支持区块链消息的单播、组播和广播,支持区块链节点状态同步,支持多种协议。

P2P主要功能

  • 区块链节点标识: 通过区块链节点标识唯一标识一个区块链节点,在区块链网络上通过区块链节点标识对区块链节点进行寻址

  • 管理网络连接: 维持区块链网络上区块链节点间的TCP长连接,自动断开异常连接,自动发起重连

  • 消息收发: 在区块链网络的区块链节点间,进行消息的单播、组播或广播

  • 状态同步: 在区块链节点间同步状态

Simplechain节点标识

Simplechain的节点标识由ECC算法的公钥生成,每个区块链节点必须有唯一的ECC密钥对,节点标识在区块链网络中唯一标识一个区块链节点。通常情况下,一个节点要加入区块链网络,需要ECC格式的节点密钥node.key文件。

Simplechain节点除了有唯一区块链节点标识,还能关注Topic,供寻址使用。Simplechain节点寻址:

  • 区块链节点标识寻址: 通过区块链节点标识,在区块链网络中定位唯一的区块链节点。
  • Topic寻址: 通过Topic,在区块链网络中定位一组关注该Topic的节点。

管理网络连接

Simplechain节点之间,会自动发起和维持TCP长连接,在系统故障、网络异常时,主动发起重连。节点间建立连接时,会使用CA证书进行认证

连接建立流程

participant 节点A
participant 节点B

节点A->>节点A: 加载密钥
节点B->>节点B: 加载密钥
节点A->>节点B: 发起连接
节点B->>节点A: 连接成功
节点B->节点A: 发起SSL握手
节点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

results matching ""

    No results matching ""