diff options
author | Sonic <sonic@dexon.org> | 2019-01-03 17:04:10 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 13:50:00 +0800 |
commit | e935c7b0634aaa6254bf7e0a2ae4a9b382015702 (patch) | |
tree | f1325ed9e7520b42377c69569c4d5317144c38ac | |
parent | d9b1ce63e115ad86ebc390db1fe3d192ae601bc1 (diff) | |
download | dexon-e935c7b0634aaa6254bf7e0a2ae4a9b382015702.tar dexon-e935c7b0634aaa6254bf7e0a2ae4a9b382015702.tar.gz dexon-e935c7b0634aaa6254bf7e0a2ae4a9b382015702.tar.bz2 dexon-e935c7b0634aaa6254bf7e0a2ae4a9b382015702.tar.lz dexon-e935c7b0634aaa6254bf7e0a2ae4a9b382015702.tar.xz dexon-e935c7b0634aaa6254bf7e0a2ae4a9b382015702.tar.zst dexon-e935c7b0634aaa6254bf7e0a2ae4a9b382015702.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 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 |