aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-11-16 17:26:50 +0800
committerWei-Ning Huang <w@dexon.org>2018-12-19 20:54:27 +0800
commit618b38d6cf2703b2425a55561489cbe1af5f8f53 (patch)
tree66d3523a33a05e356c47d314018a69d4dc73f78f
parent2c179f34f8ec99ef2b877604470a185fb4c3ae67 (diff)
downloaddexon-618b38d6cf2703b2425a55561489cbe1af5f8f53.tar.gz
dexon-618b38d6cf2703b2425a55561489cbe1af5f8f53.tar.zst
dexon-618b38d6cf2703b2425a55561489cbe1af5f8f53.zip
core: fix light node synchronization issue (#30)
InsertChain() need to record the correct roundHeight mapping in order to process snapshotRoundHeight() governance method correctly.
-rw-r--r--core/blockchain.go1
-rw-r--r--core/vm/evm.go3
-rw-r--r--core/vm/governance.go20
-rw-r--r--core/vm/interpreter.go3
-rw-r--r--dex/backend.go1
-rw-r--r--dex/handler.go4
6 files changed, 23 insertions, 9 deletions
diff --git a/core/blockchain.go b/core/blockchain.go
index 4aedc24fb..577c05295 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -1373,6 +1373,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, []
"txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()),
"root", block.Root())
events = append(events, ChainSideEvent{block})
+ panic("fork found")
}
blockInsertTimer.UpdateSince(start)
stats.processed++
diff --git a/core/vm/evm.go b/core/vm/evm.go
index 865ab0d5b..64f71e530 100644
--- a/core/vm/evm.go
+++ b/core/vm/evm.go
@@ -479,3 +479,6 @@ func (evm *EVM) Create2(caller ContractRef, code []byte, gas uint64, endowment *
// ChainConfig returns the environment's chain configuration
func (evm *EVM) ChainConfig() *params.ChainConfig { return evm.chainConfig }
+
+// IsBlockProposer returns whether or not we are a block proposer.
+func (evm *EVM) IsBlockProposer() bool { return evm.vmConfig.IsBlockProposer }
diff --git a/core/vm/governance.go b/core/vm/governance.go
index b38733e1a..f406294d2 100644
--- a/core/vm/governance.go
+++ b/core/vm/governance.go
@@ -1767,16 +1767,18 @@ func (g *GovernanceContract) transferOwnership(newOwner common.Address) ([]byte,
}
func (g *GovernanceContract) snapshotRound(round, height *big.Int) ([]byte, error) {
- // Validate if this mapping is correct.
- realHeight, ok := g.evm.Context.GetRoundHeight(round.Uint64())
- if !ok {
- g.penalize()
- return nil, errExecutionReverted
- }
+ // Validate if this mapping is correct. Only block proposer need to verify this.
+ if g.evm.IsBlockProposer() {
+ realHeight, ok := g.evm.Context.GetRoundHeight(round.Uint64())
+ if !ok {
+ g.penalize()
+ return nil, errExecutionReverted
+ }
- if height.Cmp(new(big.Int).SetUint64(realHeight)) != 0 {
- g.penalize()
- return nil, errExecutionReverted
+ if height.Cmp(new(big.Int).SetUint64(realHeight)) != 0 {
+ g.penalize()
+ return nil, errExecutionReverted
+ }
}
// Only allow updating the next round.
diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go
index b5e35f1a4..ffe5ff626 100644
--- a/core/vm/interpreter.go
+++ b/core/vm/interpreter.go
@@ -46,6 +46,9 @@ type Config struct {
EWASMInterpreter string
// Type of the EVM interpreter
EVMInterpreter string
+
+ // Whether or not we are a block proposer.
+ IsBlockProposer bool
}
// Interpreter is used to run Ethereum based contracts and will utilise the
diff --git a/dex/backend.go b/dex/backend.go
index 79b97b4ba..a16c891e1 100644
--- a/dex/backend.go
+++ b/dex/backend.go
@@ -131,6 +131,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Dexon, error) {
EnablePreimageRecording: config.EnablePreimageRecording,
EWASMInterpreter: config.EWASMInterpreter,
EVMInterpreter: config.EVMInterpreter,
+ IsBlockProposer: config.BlockProposerEnabled,
}
cacheConfig = &core.CacheConfig{Disabled: config.NoPruning, TrieCleanLimit: config.TrieCleanCache, TrieDirtyLimit: config.TrieDirtyCache, TrieTimeLimit: config.TrieTimeout}
)
diff --git a/dex/handler.go b/dex/handler.go
index 074d42249..1d84c82a8 100644
--- a/dex/handler.go
+++ b/dex/handler.go
@@ -1084,6 +1084,10 @@ func (pm *ProtocolManager) peerSetLoop() {
pm.BroadcastBlock(event.Block, true) // First propagate block to peers
pm.BroadcastBlock(event.Block, false) // Only then announce to the rest
+ if !pm.isBlockProposer {
+ break
+ }
+
newRound := pm.gov.LenCRS() - 1
log.Trace("new round", "round", newRound)
if newRound == round {