diff options
-rw-r--r-- | core/governance.go | 2 | ||||
-rw-r--r-- | core/vm/oracle_contracts.go | 2 | ||||
-rw-r--r-- | core/vm/utils.go | 40 |
3 files changed, 35 insertions, 9 deletions
diff --git a/core/governance.go b/core/governance.go index 8bad0ca98..8cfed5e13 100644 --- a/core/governance.go +++ b/core/governance.go @@ -110,7 +110,7 @@ func (g *Governance) GetStateForDKGAtRound(round uint64) (*vm.GovernanceState, e if round == dkgRound { return gs, nil } - return g.util.GetStateAtRound(round) + return g.util.GetRoundState(round) } func (g *Governance) CRSRound() uint64 { diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go index a2c7d7814..e1408d8d2 100644 --- a/core/vm/oracle_contracts.go +++ b/core/vm/oracle_contracts.go @@ -2172,7 +2172,7 @@ func (g *GovernanceContract) resetDKG(newSignedCRS []byte) ([]byte, error) { g.fineFailStopDKG(tsigThreshold) // Update CRS. - state, err := g.util.GetStateAtRound(round.Uint64()) + state, err := g.util.GetRoundState(round.Uint64()) if err != nil { return nil, errExecutionReverted } diff --git a/core/vm/utils.go b/core/vm/utils.go index 0cc6343cc..5ccc47867 100644 --- a/core/vm/utils.go +++ b/core/vm/utils.go @@ -28,7 +28,7 @@ func (g GovUtil) GetRoundHeight(round uint64) uint64 { return gs.RoundHeight(big.NewInt(int64(round))).Uint64() } -func (g GovUtil) GetStateAtRound(round uint64) (*GovernanceState, error) { +func (g GovUtil) GetRoundState(round uint64) (*GovernanceState, error) { height := g.GetRoundHeight(round) if round != 0 && height == 0 { @@ -44,12 +44,38 @@ func (g GovUtil) GetStateAtRound(round uint64) (*GovernanceState, error) { } func (g GovUtil) GetConfigState(round uint64) (*GovernanceState, error) { + headState, err := g.Intf.GetHeadGovState() + if err != nil { + return nil, err + } + if round < dexCore.ConfigRoundShift { - round = 0 - } else { - round -= dexCore.ConfigRoundShift + return g.GetRoundState(0) } - return g.GetStateAtRound(round) + + resetCount := headState.DKGResetCount(new(big.Int).SetUint64(round)).Uint64() + + // If we are resetting more round then ConfigRoundShift, we need to get the + // state of (resetCount - ConfigRoundShift) instead. + if resetCount >= dexCore.ConfigRoundShift { + shift := resetCount - dexCore.ConfigRoundShift + + prevConfigState, err := g.GetConfigState(round - 1) + if err != nil { + log.Error("Failed to get previous round config state", "round", round-1) + return nil, err + } + + height := g.GetRoundHeight(round-1) + shift*prevConfigState.RoundLength().Uint64() + s, err := g.Intf.StateAt(height) + if err != nil { + log.Error("Failed to get state", "height", height) + return nil, err + } + return &GovernanceState{StateDB: s}, nil + } + + return g.GetRoundState(round - dexCore.ConfigRoundShift) } func (g *GovUtil) CRSRound() uint64 { @@ -62,7 +88,7 @@ func (g *GovUtil) CRSRound() uint64 { func (g GovUtil) CRS(round uint64) common.Hash { if round <= dexCore.DKGDelayRound { - s, err := g.GetStateAtRound(0) + s, err := g.GetRoundState(0) if err != nil { return common.Hash{} } @@ -83,7 +109,7 @@ func (g GovUtil) CRS(round uint64) common.Hash { return common.Hash{} } } else { - s, err = g.GetStateAtRound(round) + s, err = g.GetRoundState(round) if err != nil { return common.Hash{} } |