美文网首页
CPChain的私有交易的严重bug的修复过程记录

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

作者: 疾风2018 | 来源:发表于2018-09-30 09:13 被阅读0次

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

    分析:

    在节点启动的时候会调用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)

    }

    相关文章

      网友评论

          本文标题:CPChain的私有交易的严重bug的修复过程记录

          本文链接:https://www.haomeiwen.com/subject/tabioftx.html