aboutsummaryrefslogtreecommitdiffstats
path: root/core/utils/utils_test.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2019-01-04 10:38:29 +0800
committerGitHub <noreply@github.com>2019-01-04 10:38:29 +0800
commit4bf8e9c1cbf4b9892ff2718673735bb370e97dc5 (patch)
tree1115d07368b56168271bd2312ec9e44c0df47446 /core/utils/utils_test.go
parent4757fa14e9832b7eb0502470d47c0e70f7d10379 (diff)
downloaddexon-consensus-4bf8e9c1cbf4b9892ff2718673735bb370e97dc5.tar
dexon-consensus-4bf8e9c1cbf4b9892ff2718673735bb370e97dc5.tar.gz
dexon-consensus-4bf8e9c1cbf4b9892ff2718673735bb370e97dc5.tar.bz2
dexon-consensus-4bf8e9c1cbf4b9892ff2718673735bb370e97dc5.tar.lz
dexon-consensus-4bf8e9c1cbf4b9892ff2718673735bb370e97dc5.tar.xz
dexon-consensus-4bf8e9c1cbf4b9892ff2718673735bb370e97dc5.tar.zst
dexon-consensus-4bf8e9c1cbf4b9892ff2718673735bb370e97dc5.zip
core/utils: Add Penalty checker and VerifyDKGComplaint (#393)
* Add Util for checking penalty * Add VerifyDKGComplaints * Fixup and rename * Happy New Year!
Diffstat (limited to 'core/utils/utils_test.go')
-rw-r--r--core/utils/utils_test.go116
1 files changed, 116 insertions, 0 deletions
diff --git a/core/utils/utils_test.go b/core/utils/utils_test.go
new file mode 100644
index 0000000..34336b3
--- /dev/null
+++ b/core/utils/utils_test.go
@@ -0,0 +1,116 @@
+// Copyright 2019 The dexon-consensus Authors
+// This file is part of the dexon-consensus library.
+//
+// The dexon-consensus library is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// The dexon-consensus library is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+// General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the dexon-consensus library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package utils
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/suite"
+
+ "github.com/dexon-foundation/dexon-consensus/core/crypto"
+ "github.com/dexon-foundation/dexon-consensus/core/crypto/dkg"
+ "github.com/dexon-foundation/dexon-consensus/core/crypto/ecdsa"
+ "github.com/dexon-foundation/dexon-consensus/core/types"
+ typesDKG "github.com/dexon-foundation/dexon-consensus/core/types/dkg"
+)
+
+type UtilsTestSuite struct {
+ suite.Suite
+}
+
+func (s *UtilsTestSuite) TestVerifyDKGComplaint() {
+ signComplaint := func(prv crypto.PrivateKey, complaint *typesDKG.Complaint) {
+ var err error
+ complaint.Signature, err = prv.Sign(hashDKGComplaint(complaint))
+ s.Require().NoError(err)
+ }
+ prv1, err := ecdsa.NewPrivateKey()
+ s.Require().NoError(err)
+ nID1 := types.NewNodeID(prv1.PublicKey())
+
+ prv2, err := ecdsa.NewPrivateKey()
+ s.Require().NoError(err)
+ nID2 := types.NewNodeID(prv2.PublicKey())
+
+ prvShares, pubShares := dkg.NewPrivateKeyShares(3)
+ mpk := &typesDKG.MasterPublicKey{
+ ProposerID: nID1,
+ DKGID: typesDKG.NewID(nID1),
+ PublicKeyShares: *pubShares,
+ }
+ mpk.Signature, err = prv1.Sign(hashDKGMasterPublicKey(mpk))
+ s.Require().NoError(err)
+
+ // Valid NackComplaint.
+ complaint := &typesDKG.Complaint{
+ ProposerID: nID2,
+ }
+ signComplaint(prv2, complaint)
+ s.Require().True(complaint.IsNack())
+ ok, err := VerifyDKGComplaint(complaint, mpk)
+ s.Require().NoError(err)
+ s.True(ok)
+
+ // Correct privateShare.
+ prvShares.SetParticipants(dkg.IDs{typesDKG.NewID(nID1), typesDKG.NewID(nID2)})
+ share, exist := prvShares.Share(typesDKG.NewID(nID2))
+ s.Require().True(exist)
+ prvShare := &typesDKG.PrivateShare{
+ ProposerID: nID1,
+ ReceiverID: nID2,
+ PrivateShare: *share,
+ }
+ prvShare.Signature, err = prv1.Sign(hashDKGPrivateShare(prvShare))
+ s.Require().NoError(err)
+ complaint.PrivateShare = *prvShare
+ signComplaint(prv2, complaint)
+ ok, err = VerifyDKGComplaint(complaint, mpk)
+ s.Require().NoError(err)
+ s.True(ok)
+
+ // Incorrect privateShare.
+ share, exist = prvShares.Share(typesDKG.NewID(nID1))
+ s.Require().True(exist)
+ prvShare.PrivateShare = *share
+ prvShare.Signature, err = prv1.Sign(hashDKGPrivateShare(prvShare))
+ s.Require().NoError(err)
+ complaint.PrivateShare = *prvShare
+ signComplaint(prv2, complaint)
+ ok, err = VerifyDKGComplaint(complaint, mpk)
+ s.Require().NoError(err)
+ s.False(ok)
+
+ // MPK is incorrect.
+ mpk.Round++
+ ok, err = VerifyDKGComplaint(complaint, mpk)
+ s.Require().NoError(err)
+ s.False(ok)
+
+ // MPK's proposer not match with prvShares'.
+ mpk.Round--
+ mpk.ProposerID = nID2
+ mpk.Signature, err = prv1.Sign(hashDKGMasterPublicKey(mpk))
+ s.Require().NoError(err)
+ ok, err = VerifyDKGComplaint(complaint, mpk)
+ s.Require().NoError(err)
+ s.False(ok)
+}
+
+func TestUtils(t *testing.T) {
+ suite.Run(t, new(UtilsTestSuite))
+}