diff options
author | Wei-Ning Huang <w@dexon.org> | 2019-03-24 00:03:11 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 21:32:58 +0800 |
commit | 7065f0d194c0eea5f08d835e15308f957cb1c7eb (patch) | |
tree | dd933fac0a7ed3501448a7774ec3e4444db9a24d /core | |
parent | 30978cea5aa86a00d640bec0076daf73a130abbf (diff) | |
download | dexon-7065f0d194c0eea5f08d835e15308f957cb1c7eb.tar dexon-7065f0d194c0eea5f08d835e15308f957cb1c7eb.tar.gz dexon-7065f0d194c0eea5f08d835e15308f957cb1c7eb.tar.bz2 dexon-7065f0d194c0eea5f08d835e15308f957cb1c7eb.tar.lz dexon-7065f0d194c0eea5f08d835e15308f957cb1c7eb.tar.xz dexon-7065f0d194c0eea5f08d835e15308f957cb1c7eb.tar.zst dexon-7065f0d194c0eea5f08d835e15308f957cb1c7eb.zip |
core: vm: fix DKG reset (#296)
Diffstat (limited to 'core')
-rw-r--r-- | core/vm/oracle_contracts.go | 45 | ||||
-rw-r--r-- | core/vm/oracle_contracts_test.go | 4 |
2 files changed, 26 insertions, 23 deletions
diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go index 8c10a98e8..155b3ea95 100644 --- a/core/vm/oracle_contracts.go +++ b/core/vm/oracle_contracts.go @@ -1230,8 +1230,7 @@ func getConfigState(evm *EVM, round *big.Int) (*GovernanceState, error) { } type coreDKGUtils interface { - SetState(GovernanceState) - NewGroupPublicKey(*big.Int, int) (tsigVerifierIntf, error) + NewGroupPublicKey(*GovernanceState, *big.Int, int) (tsigVerifierIntf, error) } type tsigVerifierIntf interface { VerifySignature(coreCommon.Hash, coreCrypto.Signature) bool @@ -1247,20 +1246,17 @@ type GovernanceContract struct { // defaultCoreDKGUtils implements coreDKGUtils. type defaultCoreDKGUtils struct { - state GovernanceState } -func (c *defaultCoreDKGUtils) SetState(state GovernanceState) { - c.state = state -} +func (c *defaultCoreDKGUtils) NewGroupPublicKey( + state *GovernanceState, round *big.Int, threshold int) (tsigVerifierIntf, error) { -func (c *defaultCoreDKGUtils) NewGroupPublicKey(round *big.Int, threshold int) (tsigVerifierIntf, error) { // Prepare DKGMasterPublicKeys. - mpks := c.state.UniqueDKGMasterPublicKeys() + mpks := state.UniqueDKGMasterPublicKeys() // Prepare DKGComplaints. var complaints []*dkgTypes.Complaint - for _, comp := range c.state.DKGComplaints() { + for _, comp := range state.DKGComplaints() { x := new(dkgTypes.Complaint) if err := rlp.DecodeBytes(comp, x); err != nil { panic(err) @@ -1806,8 +1802,9 @@ func (g *GovernanceContract) proposeCRS(nextRound *big.Int, signedCRS []byte) ([ } } - threshold := coreUtils.GetDKGThreshold(&coreTypes.Config{DKGSetSize: uint32(g.state.DKGSetSize().Uint64())}) - dkgGPK, err := g.coreDKGUtils.NewGroupPublicKey(nextRound, threshold) + threshold := coreUtils.GetDKGThreshold(&coreTypes.Config{ + DKGSetSize: uint32(g.state.DKGSetSize().Uint64())}) + dkgGPK, err := g.coreDKGUtils.NewGroupPublicKey(&g.state, nextRound, threshold) if err != nil { return nil, errExecutionReverted } @@ -1922,7 +1919,7 @@ func (g *GovernanceContract) resetDKG(newSignedCRS []byte) ([]byte, error) { round := g.evm.Round nextRound := new(big.Int).Add(round, big.NewInt(1)) - resetCount := g.state.DKGResetCount(round) + resetCount := g.state.DKGResetCount(nextRound) // Just restart DEXON if failed at round 0. if round.Cmp(big.NewInt(0)) == 0 { @@ -1958,11 +1955,12 @@ func (g *GovernanceContract) resetDKG(newSignedCRS []byte) ([]byte, error) { threshold := new(big.Int).Mul( big.NewInt(2), new(big.Int).Div(g.state.DKGSetSize(), big.NewInt(3))) - tsigThreshold := coreUtils.GetDKGThreshold(&coreTypes.Config{DKGSetSize: uint32(g.state.DKGSetSize().Uint64())}) + tsigThreshold := coreUtils.GetDKGThreshold(&coreTypes.Config{ + DKGSetSize: uint32(g.state.DKGSetSize().Uint64())}) // If 2f + 1 of DKG set is finalized, check if DKG succeeded. if g.state.DKGFinalizedsCount().Cmp(threshold) > 0 { - _, err := g.coreDKGUtils.NewGroupPublicKey(nextRound, tsigThreshold) + _, err := g.coreDKGUtils.NewGroupPublicKey(&g.state, nextRound, tsigThreshold) // DKG success. if err == nil { return nil, errExecutionReverted @@ -1975,16 +1973,24 @@ func (g *GovernanceContract) resetDKG(newSignedCRS []byte) ([]byte, error) { } // Update CRS. - headState, err := getRoundState(g.evm, round) + state, err := getRoundState(g.evm, round) if err != nil { return nil, errExecutionReverted } - prevCRS := headState.CRS() + prevCRS := state.CRS() + + // CRS(n) = hash(CRS(n-1)) if n <= core.DKGRoundDelay + if round.Uint64() == dexCore.DKGDelayRound { + for i := uint64(0); i < dexCore.DKGDelayRound; i++ { + prevCRS = crypto.Keccak256Hash(prevCRS[:]) + } + } + for i := uint64(0); i < resetCount.Uint64()+1; i++ { prevCRS = crypto.Keccak256Hash(prevCRS[:]) } - dkgGPK, err := g.coreDKGUtils.NewGroupPublicKey(round, tsigThreshold) + dkgGPK, err := g.coreDKGUtils.NewGroupPublicKey(state, round, tsigThreshold) if err != nil { return nil, errExecutionReverted } @@ -2011,9 +2017,9 @@ func (g *GovernanceContract) resetDKG(newSignedCRS []byte) ([]byte, error) { g.state.emitCRSProposed(newRound, crs) // Increase reset count. - g.state.IncDKGResetCount(new(big.Int).Add(round, big.NewInt(1))) - + g.state.IncDKGResetCount(nextRound) g.state.emitDKGReset(round, blockHeight) + return nil, nil } @@ -2027,7 +2033,6 @@ func (g *GovernanceContract) Run(evm *EVM, input []byte, contract *Contract) (re g.evm = evm g.state = GovernanceState{evm.StateDB} g.contract = contract - g.coreDKGUtils.SetState(g.state) // Parse input. method, exists := GovernanceABI.Sig2Method[string(input[:4])] diff --git a/core/vm/oracle_contracts_test.go b/core/vm/oracle_contracts_test.go index 5a9250ee5..80bc9a73f 100644 --- a/core/vm/oracle_contracts_test.go +++ b/core/vm/oracle_contracts_test.go @@ -918,9 +918,7 @@ type testCoreMock struct { tsigReturn bool } -func (m *testCoreMock) SetState(GovernanceState) {} - -func (m *testCoreMock) NewGroupPublicKey(*big.Int, int) (tsigVerifierIntf, error) { +func (m *testCoreMock) NewGroupPublicKey(*GovernanceState, *big.Int, int) (tsigVerifierIntf, error) { if m.newDKGGPKError != nil { return nil, m.newDKGGPKError } |