CPChain的私有交易的严重bug的修复过程记录

现象:当执行了私有交易之后,关闭区块链节点,再重新打开之后会出现系统崩溃的情况。

分析:

在节点启动的时候会调用loadLastState(),然后执行以下代码加载private state db,但是这里出现崩溃。

if _, err := state.New(GetPrivateStateRoot(bc.db, currentBlock.Root()), bc.privateStateCache); err != nil {

}

经过调试,发现GetPrivateStateRoot()函数返回了预期的结果,但是这个结果也就是Hash,在Trie里并没有找到。因此根本原因是private state trie没有持久化写到磁盘。

经查明,在区块链节点退出时会调用(*BlockChain)Stop() 函数,在该函数中会把blockchain.stackCache的内存中内容写入磁盘,这里漏掉了把blockchain.privateStateCache的内存中内容**也写入磁盘**。

因此,解决方法是修改(*BlockChain)Stop()函数,将内存中的private state trie写入磁盘。

log.Info("Writing private cached state to disk", "block", recent.Number(), "hash", recent.Hash(), "root", recent.Root())

if err :=privTriedb.Commit(GetPrivateStateRoot(bc.db, recent.Root()), true); err != nil {

   log.Error("Failed to commit recent private state trie", "err", err)

}

猜你喜欢

转载自blog.csdn.net/Ahxing1985/article/details/86605295
今日推荐