From 4efc1cf485200000420bd79638139eb5383641ae Mon Sep 17 00:00:00 2001 From: Jimmy Hu Date: Thu, 28 Mar 2019 18:21:00 +0800 Subject: dex: rebuild connection if dkg reset, core/vm: fix gov (#308) * dex: rebuild connection if dkg reset * core: vm: fix governance contract --- core/governance.go | 4 ++++ core/vm/oracle_contracts.go | 12 ++++++++++++ dex/handler.go | 13 +++++++++++-- dex/helper_test.go | 6 ++++++ dex/protocol.go | 4 ++++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/core/governance.go b/core/governance.go index 28f0a41fe..b7dbba722 100644 --- a/core/governance.go +++ b/core/governance.go @@ -170,6 +170,10 @@ func (d *Governance) NodeSet(round uint64) []coreCrypto.PublicKey { return pks } +func (d *Governance) PurgeNotarySet(round uint64) { + d.nodeSetCache.Purge(round) +} + func (d *Governance) NotarySet(round uint64) (map[string]struct{}, error) { notarySet, err := d.nodeSetCache.GetNotarySet(round) if err != nil { diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go index 843b23d18..55bf38b2b 100644 --- a/core/vm/oracle_contracts.go +++ b/core/vm/oracle_contracts.go @@ -2347,6 +2347,18 @@ func (g *GovernanceContract) Run(evm *EVM, input []byte, contract *Contract) (re return nil, errExecutionReverted } return res, nil + case "notaryParamAlpha": + res, err := method.Outputs.Pack(g.state.NotaryParamAlpha()) + if err != nil { + return nil, errExecutionReverted + } + return res, nil + case "notaryParamBeta": + res, err := method.Outputs.Pack(g.state.NotaryParamBeta()) + if err != nil { + return nil, errExecutionReverted + } + return res, nil case "owner": res, err := method.Outputs.Pack(g.state.Owner()) if err != nil { diff --git a/dex/handler.go b/dex/handler.go index 8971ad500..6d0746d2f 100644 --- a/dex/handler.go +++ b/dex/handler.go @@ -1320,6 +1320,7 @@ func (pm *ProtocolManager) peerSetLoop() { pm.peers.BuildConnection(CRSRound) round = CRSRound } + resetCount := uint64(0) for { select { @@ -1334,9 +1335,12 @@ func (pm *ProtocolManager) peerSetLoop() { if newRound == 0 { break } + reset := pm.gov.DKGResetCount(round) - log.Debug("ProtocolManager: new round", "round", newRound) - if newRound <= round { + log.Debug("ProtocolManager: new round", + "round", newRound, + "reset", reset) + if newRound <= round && resetCount == reset { break } @@ -1345,6 +1349,10 @@ func (pm *ProtocolManager) peerSetLoop() { if round >= 1 { pm.peers.ForgetConnection(round - 1) } + } else if newRound == round && resetCount+1 == reset { + pm.peers.ForgetConnection(newRound) + pm.gov.PurgeNotarySet(newRound) + pm.peers.BuildConnection(newRound) } else { // just forget all network connection and rebuild. pm.peers.ForgetConnection(round) @@ -1355,6 +1363,7 @@ func (pm *ProtocolManager) peerSetLoop() { pm.peers.BuildConnection(newRound) } round = newRound + resetCount = reset case <-pm.chainHeadSub.Err(): return } diff --git a/dex/helper_test.go b/dex/helper_test.go index 1d903a907..1d267d9ae 100644 --- a/dex/helper_test.go +++ b/dex/helper_test.go @@ -221,6 +221,12 @@ func (g *testGovernance) CRSRound() uint64 { return g.lenCRSFunc() } +func (g *testGovernance) DKGResetCount(uint64) uint64 { + return 0 +} + +func (g *testGovernance) PurgeNotarySet(uint64) {} + func (g *testGovernance) NotarySet( round uint64) (map[string]struct{}, error) { return g.notarySetFunc(round) diff --git a/dex/protocol.go b/dex/protocol.go index 2bcb57506..4da64b604 100644 --- a/dex/protocol.go +++ b/dex/protocol.go @@ -156,6 +156,10 @@ type governance interface { CRSRound() uint64 NotarySet(uint64) (map[string]struct{}, error) + + PurgeNotarySet(uint64) + + DKGResetCount(uint64) uint64 } type dexconApp interface { -- cgit