aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorSonic <sonic@dexon.org>2019-01-03 17:04:10 +0800
committerWei-Ning Huang <w@dexon.org>2019-04-09 21:32:55 +0800
commitbfa5a27d0034ab25785d80ad20a9e0559ee78dcd (patch)
tree453e85d83eb8149083ccf7c7961eaeb14619da39 /core
parent30c733a74b90a8b42dc0120cb0bb6149df76da88 (diff)
downloaddexon-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.go45
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