OpenAtomFoundation / xupercore

The kernel of xuperchain.
Apache License 2.0
61 stars 47 forks source link

p2p 区块同步兼容旧版本 #371

Open godeamon opened 2 years ago

godeamon commented 2 years ago

5.2 的节点 p2p 消息不兼容5.1以及之前版本,这样如果从5.1或者更早版本升级时,只能全部节点同时升级,不能逐个升级节点。

godeamon commented 2 years ago

【问题现象】 5.2版本程序的区块同步方案从广播方式改成了拉取方式,旧版本区块采用将区块广播到网络中,新版本不再广播,而是其他节点从网络中同步最新的区块,采用拉取方式。如果现在系统网络中都是旧版本的程序,如果将其中一个节点升级为5.2版本,那么此节点不能从网络中同步区块,高度不会增加。

【根本原因】 5.2版本增加了一系列p2p的消息类型: https://github.com/xuperchain/xupercore/commit/684e0aca543accb7b080cac10a1ae1e0fac6c3f2#diff-9898f5d59e04eeeac00a0cbde9fa0a5e2791a296204f12b8add062176064e307 同步区块时使用此类型进行同步,旧版本不会返回数据。

【解决方案】 在同步区块时进行旧版本兼容,使用两个版本进行最高区块查询,判断最高区块在哪个版本消息中,然后采用对应方案进行同步区块,这样即使网络中有旧版本和新版本两种节点,那么依然能同步成功。等所有节点都升级到最新版本后,只能使用最新版本的消息同步区块。