diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-11-05 12:13:12 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-05 12:13:12 +0800 |
commit | 62a00d3cf89330073df381caa7d913deeb01822d (patch) | |
tree | cf5541769084c49844dd0731a4ef3a6c9734f5b6 /core/configuration-chain.go | |
parent | 900643e2ac8c953d10fd3f8f56b9d49ad5b825f6 (diff) | |
download | tangerine-consensus-62a00d3cf89330073df381caa7d913deeb01822d.tar tangerine-consensus-62a00d3cf89330073df381caa7d913deeb01822d.tar.gz tangerine-consensus-62a00d3cf89330073df381caa7d913deeb01822d.tar.bz2 tangerine-consensus-62a00d3cf89330073df381caa7d913deeb01822d.tar.lz tangerine-consensus-62a00d3cf89330073df381caa7d913deeb01822d.tar.xz tangerine-consensus-62a00d3cf89330073df381caa7d913deeb01822d.tar.zst tangerine-consensus-62a00d3cf89330073df381caa7d913deeb01822d.zip |
core: Fix dkg and CRS signature (#294)
Diffstat (limited to 'core/configuration-chain.go')
-rw-r--r-- | core/configuration-chain.go | 63 |
1 files changed, 51 insertions, 12 deletions
diff --git a/core/configuration-chain.go b/core/configuration-chain.go index 5e5a587..bda2fdf 100644 --- a/core/configuration-chain.go +++ b/core/configuration-chain.go @@ -39,18 +39,22 @@ var ( ) type configurationChain struct { - ID types.NodeID - recv dkgReceiver - gov Governance - dkg *dkgProtocol - logger common.Logger - dkgLock sync.RWMutex - dkgSigner map[uint64]*dkgShareSecret - gpk map[uint64]*DKGGroupPublicKey - dkgResult sync.RWMutex - tsig map[common.Hash]*tsigProtocol - tsigTouched map[common.Hash]struct{} - tsigReady *sync.Cond + ID types.NodeID + recv dkgReceiver + gov Governance + dkg *dkgProtocol + logger common.Logger + dkgLock sync.RWMutex + dkgSigner map[uint64]*dkgShareSecret + gpk map[uint64]*DKGGroupPublicKey + dkgResult sync.RWMutex + tsig map[common.Hash]*tsigProtocol + tsigTouched map[common.Hash]struct{} + tsigReady *sync.Cond + cache *NodeSetCache + dkgSet map[types.NodeID]struct{} + mpkReady bool + pendingPrvShare map[types.NodeID]*typesDKG.PrivateShare // TODO(jimmy-dexon): add timeout to pending psig. pendingPsig map[common.Hash][]*typesDKG.PartialSignature prevHash common.Hash @@ -60,6 +64,7 @@ func newConfigurationChain( ID types.NodeID, recv dkgReceiver, gov Governance, + cache *NodeSetCache, logger common.Logger) *configurationChain { return &configurationChain{ ID: ID, @@ -71,6 +76,7 @@ func newConfigurationChain( tsig: make(map[common.Hash]*tsigProtocol), tsigTouched: make(map[common.Hash]struct{}), tsigReady: sync.NewCond(&sync.Mutex{}), + cache: cache, pendingPsig: make(map[common.Hash][]*typesDKG.PartialSignature), } } @@ -78,6 +84,17 @@ func newConfigurationChain( func (cc *configurationChain) registerDKG(round uint64, threshold int) { cc.dkgLock.Lock() defer cc.dkgLock.Unlock() + if cc.dkg != nil { + cc.logger.Error("Previous DKG is not finished") + } + dkgSet, err := cc.cache.GetDKGSet(round) + if err != nil { + cc.logger.Error("Error getting DKG set from cache", "error", err) + return + } + cc.dkgSet = dkgSet + cc.pendingPrvShare = make(map[types.NodeID]*typesDKG.PrivateShare) + cc.mpkReady = false cc.dkg = newDKGProtocol( cc.ID, cc.recv, @@ -107,6 +124,13 @@ func (cc *configurationChain) runDKG(round uint64) error { // Phase 2(T = 0): Exchange DKG secret key share. cc.logger.Debug("Calling Governance.DKGMasterPublicKeys", "round", round) cc.dkg.processMasterPublicKeys(cc.gov.DKGMasterPublicKeys(round)) + cc.mpkReady = true + for _, prvShare := range cc.pendingPrvShare { + if err := cc.dkg.processPrivateShare(prvShare); err != nil { + cc.logger.Error("Failed to process private share", + "error", err) + } + } // Phase 3(T = 0~λ): Propose complaint. // Propose complaint is done in `processMasterPublicKeys`. cc.dkgLock.Unlock() @@ -286,6 +310,21 @@ func (cc *configurationChain) processPrivateShare( if cc.dkg == nil { return nil } + if _, exist := cc.dkgSet[prvShare.ProposerID]; !exist { + return ErrNotDKGParticipant + } + if !cc.mpkReady { + // TODO(jimmy-dexon): remove duplicated signature check in dkg module. + ok, err := verifyDKGPrivateShareSignature(prvShare) + if err != nil { + return err + } + if !ok { + return ErrIncorrectPrivateShareSignature + } + cc.pendingPrvShare[prvShare.ProposerID] = prvShare + return nil + } return cc.dkg.processPrivateShare(prvShare) } |