同步

同步,作为节点共识的辅助,是区块链系统的重要特性之一,包括区块同步和交易同步。

区块同步

区块同步是为了让区块链各节点的区块保持在群组的最新数据。只有拥有最新区块的节点,才能正常参与群组的共识。

如下列举一些常见的同步场景:

  1. 新组员同步:新组员加入到群组后,自身块高为0,跟其他组员块高比较后开始区块同步,同步结束后切换自身状态,开启交易同步,开启共识。

  2. 老节点异常,新扩容节点向老节点同步数据。

  3. 区块树状同步:如4共识节点+3观察节点环境,观察节点1仅与共识节点1连接,观察节点2仅与观察节点1连接,观察节点3仅与观察节点2连接,各个观察节点区块同步正确,叶子节点同步会有稍许延迟。

  4. 同步时各节点负载均衡:节点A区块落后,节点A会向组内所有正常节点发送区块下载请求包,确保各节点负载均衡。可以在节点日志中搜索如下关键字统计:cat log_2021042210.40.log |grep -w ‘Batch blocks for sending’|grep ‘g:2’ | wc -l。

  5. 不同存储类型的节点之间同步:
    • RocksDB–>RocksDB,RocksDB–>MySQL,RocksDB–>Scalable
    • MySQL–>RocksDB,MySQL–>MySQL,MySQL–>Scalable
    • Scalable–>RocksDB,Scalable–>MySQL,Scalable–>Scalable

  6. 大数据量同步。

  7. 多群组:
    • 节点A有g1、g2群组,节点A在2个群组均同步其他节点数据,互不干扰。
    • 节点A有g1、g2群组,节点A在g1正常工作,在g2同步其他节点数据,互不干扰。

  8. 升级后,节点可以成功同步升级前的历史数据。

  9. 手工删除节点数据,重启节点后,节点能成功同步链上数据。

  10. 节点同步过程中因为一些异常原因(网络、服务器、人为停止进程等)终止运行了,节点进程恢复后,能继续同步。

  11. 节点同步过程中该节点频繁退网、入网操作。

  12. 节点同步过程中链异常,节点停止同步,链恢复后,节点能继续同步。

  13. 节点A仅跟节点B有连接,节点A同步数据时只会从节点B请求下载区块。如果节点B异常,节点A的数据同步会被中断。

  14. 节点异常不能参与共识,节点恢复后,能成功同步异常期间的所有交易。

交易同步

交易同步,是让区块链的上的交易尽可能的到达群组内所有的节点,为共识中将交易打包成区块提供基础。

下面列举一些常见的交易同步验证场景:

  1. 直连节点是共识节点,直连节点收到SDK的交易后,会发送给3个共识子节点(可在直连节点日志中搜索关键字Send transaction to peer查看);共识子节点收到交易后,再继续发送给自身的共识子节点(可在日志中搜索forward transaction关键字)。

  2. 直连节点是观察节点,直连节点收到SDK的交易后,会发送给1个共识子节点;该共识子节点收到交易后,再发送给它的3个共识子节点;子节点收到交易后,再发给自身的共识子节点。

  3. 直连节点是观察节点,仅跟1个共识节点有网络连接,交易能正常到达链上各节点,业务处理成功。

  4. 直连节点是共识节点,仅跟1个共识节点有网络连接,交易能正常到达链上各节点,业务处理成功。

  5. 多群组架构(星形组网、并行组网等),各个群组之间的交易同步互不干扰。

  6. 压测时,交易同步正常,业务成功率不受影响。

  7. 非直连节点A仅跟一个非直连节点B有网络连接(CA黑白名单、网络限制等),客户端的交易能到达链上各个节点,业务处理成功。

  8. 直连节点A仅跟1个共识节点B有网络连接,压测时停止B节点:
    • 交易发送到直连节点A后存储到交易池,启动B节点后,业务能处理成功。
    • 发送到直连节点A的交易数量超过节点侧配置的tx_pool_limit,启动B节点后,仅tx_pool_limit范围内的业务能处理成功。
    • 发送到直连节点A的交易占用内存大小超过节点侧配置的memory_limit,启动B节点后,仅memory_limit范围内的业务能处理成功。

  9. 链异常,直连节点状态正常:
    • 交易发送到直连节点后存储到交易池,链恢复后,业务能处理成功。
    • 发送到直连节点的交易数量超过直连节点侧配置的tx_pool_limit,链恢复后,tx_pool_limit范围内的业务能处理成功。
    • 发送到直连节点的交易占用内存大小超过直连节点侧配置的memory_limit,链恢复后,memory_limit范围内的业务能处理成功。
    • 客户端1、2先后向直连节点发送交易,客户端1发送的交易数量<tx_pool_limit,客户端1+客户端2总共发送的交易数量>tx_pool_limit。链恢复后,客户端1发送的交易处理成功,客户端2发送的交易部分成功,成功的交易总数为tx_pool_limit。
    • 客户端1、2先后向直连节点发送交易,客户端1发送的交易占用内存<memory_limit,客户端1+客户端2总共发送的交易占用内存>memory_limit。链恢复后,客户端1发送的交易处理成功,客户端2发送的交易部分成功。