diff options
author | Sonic <sonic@dexon.org> | 2019-01-03 17:04:10 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 21:32:55 +0800 |
commit | bfa5a27d0034ab25785d80ad20a9e0559ee78dcd (patch) | |
tree | 453e85d83eb8149083ccf7c7961eaeb14619da39 /core | |
parent | 30c733a74b90a8b42dc0120cb0bb6149df76da88 (diff) | |
download | dexon-bfa5a27d0034ab25785d80ad20a9e0559ee78dcd.tar.gz dexon-bfa5a27d0034ab25785d80ad20a9e0559ee78dcd.tar.zst dexon-bfa5a27d0034ab25785d80ad20a9e0559ee78dcd.zip |
core: fix vm wrong round height context (#124)
Let roundHeightMap be corret whenever we starting a bp node.
Diffstat (limited to 'core')
-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 0e87360c3..72837e324 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 |