近期发现了一个在底层存储上的问题,可以简单描述为:如果合约中有不同的key对应的value是相同值(这里包括同一个合约或不同的合约)底层在存储时为节省存储空间做了优化,即只存了一个value,而当其中一个key的value发生变更时,底层可能会将旧value删除(这是个bug,已经在最新版本修复)
这个问题就是近期个别节点出现bad block并停止出块的原因(部分节点还为此被惩罚移出验证人),我们在最新版本已经将可能出问题的合约屏蔽,但目前看不能完全屏蔽,一些系统内置的合约(例如锁仓合约)是没办法屏蔽的, 所以此问题在一段时间内会继续出现
以昨天我们对部分节点bad block问题的分析来看,近期导致该问题的合约就是锁仓合约,我们对发生问题的区块分析发现近期对 0xbb516ef5fc5d3a920d42142118f311a279a58268账户的锁仓将在3246500高度释放,这个高度大概在2天左右时间释放(4-4或4-5),由于出现问题是具有一定随机性的,所以在3246500这个区块高度是有可能出问题的,有2中可能:
- 少数节点value被清理掉了,这将导致个别节点区块停止增长,目前只能通过清除数据然后做fast同步来恢复
- 极端情况,如果网络中25个验证人节点有超过8个节点找不到value,将导致链停止出块,这种情况只能通过找出异常节点,然后与正常节点同步,或者直接取正常节点数据的方式恢复了
注:这个问题我们已经在最新版本修复并验证通过了,到时请大家到新版本或新链上体验