diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-12-19 17:16:40 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-19 17:16:40 +0800 |
commit | c7b4045802450df361216d9e7da3ec318e67cc34 (patch) | |
tree | c4060817a54e5cf455e830b21e6a91b9fc11004f /core/types | |
parent | 7bafefa5c70a26a28636123cb2b6598eea3ed380 (diff) | |
download | dexon-consensus-c7b4045802450df361216d9e7da3ec318e67cc34.tar dexon-consensus-c7b4045802450df361216d9e7da3ec318e67cc34.tar.gz dexon-consensus-c7b4045802450df361216d9e7da3ec318e67cc34.tar.bz2 dexon-consensus-c7b4045802450df361216d9e7da3ec318e67cc34.tar.lz dexon-consensus-c7b4045802450df361216d9e7da3ec318e67cc34.tar.xz dexon-consensus-c7b4045802450df361216d9e7da3ec318e67cc34.tar.zst dexon-consensus-c7b4045802450df361216d9e7da3ec318e67cc34.zip |
core: Add a `MPKReady` so `MasterPublicKey` cannot be added afterwards (#375)
* Add type DKGReady
* Add DKGReady to interface and state
* DKG will wait for MPK to be ready before running
* Modify test
* Check if self's MPK is registered
* Add test for delay add MPK
* Rename Ready to MPKReady
Diffstat (limited to 'core/types')
-rw-r--r-- | core/types/dkg/dkg.go | 21 | ||||
-rw-r--r-- | core/types/dkg/dkg_test.go | 31 |
2 files changed, 52 insertions, 0 deletions
diff --git a/core/types/dkg/dkg.go b/core/types/dkg/dkg.go index cecc4f1..f021d1b 100644 --- a/core/types/dkg/dkg.go +++ b/core/types/dkg/dkg.go @@ -167,6 +167,27 @@ type PartialSignature struct { Signature crypto.Signature `json:"signature"` } +// MPKReady describe a dig ready message in DKG protocol. +type MPKReady struct { + ProposerID types.NodeID `json:"proposer_id"` + Round uint64 `json:"round"` + Signature crypto.Signature `json:"signature"` +} + +func (ready *MPKReady) String() string { + return fmt.Sprintf("DKGMPKReady{RP:%s Round:%d}", + ready.ProposerID.String()[:6], + ready.Round) +} + +// Equal check equality of two MPKReady instances. +func (ready *MPKReady) Equal(other *MPKReady) bool { + return ready.ProposerID.Equal(other.ProposerID) && + ready.Round == other.Round && + ready.Signature.Type == other.Signature.Type && + bytes.Compare(ready.Signature.Signature, other.Signature.Signature) == 0 +} + // Finalize describe a dig finalize message in DKG protocol. type Finalize struct { ProposerID types.NodeID `json:"proposer_id"` diff --git a/core/types/dkg/dkg_test.go b/core/types/dkg/dkg_test.go index ea46621..4eb17ac 100644 --- a/core/types/dkg/dkg_test.go +++ b/core/types/dkg/dkg_test.go @@ -212,6 +212,37 @@ func (s *DKGTestSuite) TestComplaintEquality() { req.True(comp1.Equal(comp2)) } +func (s *DKGTestSuite) TestMPKReadyEquality() { + var req = s.Require() + ready1 := &MPKReady{ + ProposerID: types.NodeID{Hash: common.NewRandomHash()}, + Round: 1, + Signature: crypto.Signature{ + Signature: s.genRandomBytes(), + }, + } + // Make a copy + ready2 := &MPKReady{} + s.clone(ready1, ready2) + req.True(ready1.Equal(ready2)) + // Change proposer ID. + ready2.ProposerID = types.NodeID{Hash: common.NewRandomHash()} + req.False(ready1.Equal(ready2)) + ready2.ProposerID = ready1.ProposerID + // Change round. + ready2.Round = ready1.Round + 1 + req.False(ready1.Equal(ready2)) + ready2.Round = ready1.Round + // Change signature. + ready2.Signature = crypto.Signature{ + Signature: s.genRandomBytes(), + } + req.False(ready1.Equal(ready2)) + ready2.Signature = ready1.Signature + // After changing every field back, they should be equal. + req.True(ready1.Equal(ready2)) +} + func (s *DKGTestSuite) TestFinalizeEquality() { var req = s.Require() final1 := &Finalize{ |