diff options
author | Sonic <sonic@dexon.org> | 2019-01-03 17:04:10 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-01-14 15:26:26 +0800 |
commit | e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3 (patch) | |
tree | f9137d2dbd1645e9925bb84f45a61c329f386896 | |
parent | cb96fc7b079bf0e4611cb643f860ed90f707ff3a (diff) | |
download | dexon-e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3.tar dexon-e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3.tar.gz dexon-e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3.tar.bz2 dexon-e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3.tar.lz dexon-e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3.tar.xz dexon-e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3.tar.zst dexon-e6442ffcabb4c5cb2f7bc97f9dff7c95ef1527c3.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 b00f24d4f..0f190a21b 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 |