背景
在多节点的区块链网络中,通常节点是来自多个不同的组织。在区块链网络升级时,会出现无法将所有共识节点同时升级的情况。 因此,需要共识模块支持部分节点升级,不同版本的共识节点可以同时存在,不会影响链的运行。
现状
部分节点升级后,就会导致升级后的节点共识版本
与未升级的节点共识版本
不一致。共识版本不一致的情况下,节点间共识数据通信无法相互解析和逻辑处理,就会导致以下情况。
情况一: 升级大部分节点
情况一: 升级小部分节点
需求
共识模块版本之间兼容,支持不同版本的节点之间通信,不影响链的运行。
方案设计
版本号
共识节点之间的通信,需要带有版本号,用于识别节点之间的共识版本。
版本号设计
在网络层增加版本号的消息。
- 网络层修改*netpb.NetMsg的Type,第一个字节涉及到符号位丢弃不用,第二个字节预留,第三个字节保存共识内部版本号,最后一个字节是网络模块的.
- 共识内部可以通过message.Payload.(*netpb.NetMsg)解析版本号