diff options
author | Sonic <sonic@dexon.org> | 2019-01-03 17:04:10 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-03-12 12:19:09 +0800 |
commit | 9f0fe7967af4b8d300ece5e9a406d75287dd964c (patch) | |
tree | 11b38c97e11dbb80c1275e7c5c50d79490aee52c | |
parent | 3a78d3774ecbdc02f6fd590405810b4364172ba0 (diff) | |
download | dexon-9f0fe7967af4b8d300ece5e9a406d75287dd964c.tar.gz dexon-9f0fe7967af4b8d300ece5e9a406d75287dd964c.tar.zst dexon-9f0fe7967af4b8d300ece5e9a406d75287dd964c.zip |
core: fix vm wrong round height context (#124)
Let roundHeightMap be corret whenever we starting a bp node.
-rw-r--r-- | core/blockchain.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/core/blockchain.go b/core/blockchain.go index 8ceb1186c..c5e2f6bf4 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -237,6 +237,51 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par gov := NewGovernance(NewGovernanceStateDB(bc)) bc.verifierCache = dexCore.NewTSigVerifierCache(gov, 5) + // Init round height map + curblock := bc.CurrentBlock() + r := curblock.Round() + + // Blocks will interleave during round change, so we need to init current + // and previous round. + if r == 0 { + // No previous round. + log.Debug("Init round height", "height", curblock.NumberU64(), "round", curblock.Round()) + bc.storeRoundHeight(uint64(0), uint64(0)) + } else { + prevh := gov.GetRoundHeight(r - 1) + if prevh == uint64(0) { + // Previous round height should be already snapshoted + // in governance state at this moment. + panic("can not init previous round height map") + } + log.Debug("Init previous round height", "height", prevh, "round", r-1) + bc.storeRoundHeight(r-1, prevh) + + curh := gov.GetRoundHeight(r) + + // Current round height is not snapshoted in governance state yet, + if curh == uint64(0) { + // Linear search the first block of current round + // from previous round height. + h := prevh + for h <= curblock.NumberU64() { + b := bc.GetBlockByNumber(h) + if b.Round() == r { + curh = h + break + } + } + + // This case is impossible. + if curh == uint64(0) { + panic("can find current round height") + } + } + + log.Debug("Init current round height", "height", curh, "round", r) + bc.storeRoundHeight(r, curh) + } + // Take ownership of this particular state go bc.update() return bc, nil |