aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSonic <sonic@dexon.org>2019-01-03 17:04:10 +0800
committerWei-Ning Huang <w@dexon.org>2019-03-12 12:19:09 +0800
commit9f0fe7967af4b8d300ece5e9a406d75287dd964c (patch)
tree11b38c97e11dbb80c1275e7c5c50d79490aee52c
parent3a78d3774ecbdc02f6fd590405810b4364172ba0 (diff)
downloaddexon-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.go45
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