diff options
author | Wei-Ning Huang <w@dexon.org> | 2018-10-23 14:12:10 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-03-12 12:19:09 +0800 |
commit | ed9544ce6c9c9525f9fcf9c10d11010734c9da13 (patch) | |
tree | e8fc1353051980b57d45586fd034040b90da529f /core | |
parent | 72d59f7d765607bd6aafeb836e6034c22a5eb877 (diff) | |
download | dexon-ed9544ce6c9c9525f9fcf9c10d11010734c9da13.tar.gz dexon-ed9544ce6c9c9525f9fcf9c10d11010734c9da13.tar.zst dexon-ed9544ce6c9c9525f9fcf9c10d11010734c9da13.zip |
dex: fix DKG round switching
Diffstat (limited to 'core')
-rw-r--r-- | core/vm/governance.go | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/core/vm/governance.go b/core/vm/governance.go index d30987b11..5c5822261 100644 --- a/core/vm/governance.go +++ b/core/vm/governance.go @@ -475,11 +475,11 @@ const abiJSON = ` "constant": false, "inputs": [ { - "name": "round", + "name": "Round", "type": "uint256" }, { - "name": "height", + "name": "Height", "type": "uint256" } ], @@ -493,6 +493,10 @@ const abiJSON = ` "constant": false, "inputs": [ { + "name": "Round", + "type": "uint256" + }, + { "name": "SignedCRS", "type": "bytes" } @@ -658,11 +662,14 @@ func RunGovernanceContract(evm *EVM, input []byte, contract *Contract) ( } return g.addDKGFinalize(args.Round, args.Finalize) case "proposeCRS": - var signedCRS []byte - if err := method.Inputs.Unpack(&signedCRS, arguments); err != nil { + args := struct { + Round *big.Int + SignedCRS []byte + }{} + if err := method.Inputs.Unpack(&args, arguments); err != nil { return nil, errExecutionReverted } - return g.proposeCRS(signedCRS) + return g.proposeCRS(args.Round, args.SignedCRS) case "stake": var publicKey []byte if err := method.Inputs.Unpack(&publicKey, arguments); err != nil { @@ -1548,8 +1555,13 @@ func (g *GovernanceContract) unstake() ([]byte, error) { return nil, nil } -func (g *GovernanceContract) proposeCRS(signedCRS []byte) ([]byte, error) { +func (g *GovernanceContract) proposeCRS(nextRound *big.Int, signedCRS []byte) ([]byte, error) { round := g.state.Round() + + if nextRound.Cmp(round) <= 0 { + return nil, errExecutionReverted + } + prevCRS := g.state.CRS(round) // Prepare DKGMasterPublicKeys. |