From 0e4b629fbe76f4a1df83372f0766037513022fbd Mon Sep 17 00:00:00 2001 From: Konstantin <355847+Frozen@users.noreply.github.com> Date: Thu, 20 Jul 2023 22:59:04 -0400 Subject: [PATCH] Consensus Mask. Removed unnecessary argument. (#4466) * Removed unnecessary argument. * Fixed comment. --- consensus/consensus_service.go | 13 +++++------- consensus/construct.go | 6 +----- consensus/view_change_construct.go | 20 +++++++++--------- consensus/view_change_msg.go | 10 ++------- core/state/journal.go | 3 ++- crypto/bls/mask.go | 18 +++------------- crypto/bls/mask_test.go | 34 +++++++++++++++++------------- hmy/blockchain.go | 5 +---- internal/chain/sig.go | 6 +----- staking/availability/measure.go | 5 +---- 10 files changed, 45 insertions(+), 75 deletions(-) diff --git a/consensus/consensus_service.go b/consensus/consensus_service.go index 5229f0ed31..3ebfa5e307 100644 --- a/consensus/consensus_service.go +++ b/consensus/consensus_service.go @@ -145,9 +145,9 @@ func (consensus *Consensus) updateBitmaps() { Str("MessageType", consensus.phase.String()). Msg("[UpdateBitmaps] Updating consensus bitmaps") members := consensus.Decider.Participants() - prepareBitmap, _ := bls_cosi.NewMask(members, nil) - commitBitmap, _ := bls_cosi.NewMask(members, nil) - multiSigBitmap, _ := bls_cosi.NewMask(members, nil) + prepareBitmap := bls_cosi.NewMask(members) + commitBitmap := bls_cosi.NewMask(members) + multiSigBitmap := bls_cosi.NewMask(members) consensus.prepareBitmap = prepareBitmap consensus.commitBitmap = commitBitmap consensus.multiSigBitmap = multiSigBitmap @@ -627,11 +627,8 @@ func (consensus *Consensus) NumSignaturesIncludedInBlock(block *types.Block) uin count := uint32(0) members := consensus.Decider.Participants() // TODO(audit): do not reconstruct the Mask - mask, err := bls.NewMask(members, nil) - if err != nil { - return count - } - err = mask.SetMask(block.Header().LastCommitBitmap()) + mask := bls.NewMask(members) + err := mask.SetMask(block.Header().LastCommitBitmap()) if err != nil { return count } diff --git a/consensus/construct.go b/consensus/construct.go index eaa6fd83f1..10488816c7 100644 --- a/consensus/construct.go +++ b/consensus/construct.go @@ -82,11 +82,7 @@ func (consensus *Consensus) construct( ) } else { // TODO: use a persistent bitmap to report bitmap - mask, err := bls.NewMask(consensus.Decider.Participants(), nil) - if err != nil { - utils.Logger().Warn().Err(err).Msg("unable to setup mask for multi-sig message") - return nil, err - } + mask := bls.NewMask(consensus.Decider.Participants()) for _, key := range priKeys { mask.SetKey(key.Pub.Bytes, true) } diff --git a/consensus/view_change_construct.go b/consensus/view_change_construct.go index 089ec2ef87..061d2a795c 100644 --- a/consensus/view_change_construct.go +++ b/consensus/view_change_construct.go @@ -69,15 +69,15 @@ func (vc *viewChange) AddViewIDKeyIfNotExist(viewID uint64, members multibls.Pub vc.viewIDSigs[viewID] = map[string]*bls_core.Sign{} } if _, ok := vc.bhpBitmap[viewID]; !ok { - bhpBitmap, _ := bls_cosi.NewMask(members, nil) + bhpBitmap := bls_cosi.NewMask(members) vc.bhpBitmap[viewID] = bhpBitmap } if _, ok := vc.nilBitmap[viewID]; !ok { - nilBitmap, _ := bls_cosi.NewMask(members, nil) + nilBitmap := bls_cosi.NewMask(members) vc.nilBitmap[viewID] = nilBitmap } if _, ok := vc.viewIDBitmap[viewID]; !ok { - viewIDBitmap, _ := bls_cosi.NewMask(members, nil) + viewIDBitmap := bls_cosi.NewMask(members) vc.viewIDBitmap[viewID] = viewIDBitmap } } @@ -290,7 +290,7 @@ func (vc *viewChange) ProcessViewChangeMsg( } vc.bhpSigs[recvMsg.ViewID][senderKeyStr] = recvMsg.ViewchangeSig if _, ok := vc.bhpBitmap[recvMsg.ViewID]; !ok { - bhpBitmap, _ := bls_cosi.NewMask(decider.Participants(), nil) + bhpBitmap := bls_cosi.NewMask(decider.Participants()) vc.bhpBitmap[recvMsg.ViewID] = bhpBitmap } vc.bhpBitmap[recvMsg.ViewID].SetKey(senderKey.Bytes, true) // Set the bitmap indicating that this validator signed. @@ -305,7 +305,7 @@ func (vc *viewChange) ProcessViewChangeMsg( vc.viewIDSigs[recvMsg.ViewID][senderKeyStr] = recvMsg.ViewidSig if _, ok := vc.viewIDBitmap[recvMsg.ViewID]; !ok { - viewIDBitmap, _ := bls_cosi.NewMask(decider.Participants(), nil) + viewIDBitmap := bls_cosi.NewMask(decider.Participants()) vc.viewIDBitmap[recvMsg.ViewID] = viewIDBitmap } // Set the bitmap indicating that this validator signed. @@ -350,7 +350,7 @@ func (vc *viewChange) ProcessViewChangeMsg( vc.nilSigs[recvMsg.ViewID][senderKeyStr] = recvMsg.ViewchangeSig if _, ok := vc.nilBitmap[recvMsg.ViewID]; !ok { - nilBitmap, _ := bls_cosi.NewMask(decider.Participants(), nil) + nilBitmap := bls_cosi.NewMask(decider.Participants()) vc.nilBitmap[recvMsg.ViewID] = nilBitmap } vc.nilBitmap[recvMsg.ViewID].SetKey(senderKey.Bytes, true) // Set the bitmap indicating that this validator signed. @@ -366,7 +366,7 @@ func (vc *viewChange) ProcessViewChangeMsg( // Set the bitmap indicating that this validator signed. if _, ok := vc.viewIDBitmap[recvMsg.ViewID]; !ok { - viewIDBitmap, _ := bls_cosi.NewMask(decider.Participants(), nil) + viewIDBitmap := bls_cosi.NewMask(decider.Participants()) vc.viewIDBitmap[recvMsg.ViewID] = viewIDBitmap } vc.viewIDBitmap[recvMsg.ViewID].SetKey(senderKey.Bytes, true) @@ -411,7 +411,7 @@ func (vc *viewChange) InitPayload( for _, key := range privKeys { // update the dictionary key if the viewID is first time received if _, ok := vc.bhpBitmap[viewID]; !ok { - bhpBitmap, _ := bls_cosi.NewMask(members, nil) + bhpBitmap := bls_cosi.NewMask(members) vc.bhpBitmap[viewID] = bhpBitmap } if err := vc.bhpBitmap[viewID].SetKey(key.Pub.Bytes, true); err != nil { @@ -435,7 +435,7 @@ func (vc *viewChange) InitPayload( vc.getLogger().Info().Uint64("viewID", viewID).Uint64("blockNum", blockNum).Msg("[InitPayload] add my M2 (NIL) type messaage") for _, key := range privKeys { if _, ok := vc.nilBitmap[viewID]; !ok { - nilBitmap, _ := bls_cosi.NewMask(members, nil) + nilBitmap := bls_cosi.NewMask(members) vc.nilBitmap[viewID] = nilBitmap } if err := vc.nilBitmap[viewID].SetKey(key.Pub.Bytes, true); err != nil { @@ -467,7 +467,7 @@ func (vc *viewChange) InitPayload( vc.getLogger().Info().Uint64("viewID", viewID).Uint64("blockNum", blockNum).Msg("[InitPayload] add my M3 (ViewID) type messaage") for _, key := range privKeys { if _, ok := vc.viewIDBitmap[viewID]; !ok { - viewIDBitmap, _ := bls_cosi.NewMask(members, nil) + viewIDBitmap := bls_cosi.NewMask(members) vc.viewIDBitmap[viewID] = viewIDBitmap } if err := vc.viewIDBitmap[viewID].SetKey(key.Pub.Bytes, true); err != nil { diff --git a/consensus/view_change_msg.go b/consensus/view_change_msg.go index fdb3f3afe2..6c4b080055 100644 --- a/consensus/view_change_msg.go +++ b/consensus/view_change_msg.go @@ -222,10 +222,7 @@ func ParseNewViewMessage(msg *msg_pb.Message, members multibls.PublicKeys) (*FBF if err != nil { return nil, err } - m3mask, err := bls_cosi.NewMask(members, nil) - if err != nil { - return nil, err - } + m3mask := bls_cosi.NewMask(members) m3mask.SetMask(vcMsg.M3Bitmap) FBFTMsg.M3AggSig = &m3Sig FBFTMsg.M3Bitmap = m3mask @@ -237,10 +234,7 @@ func ParseNewViewMessage(msg *msg_pb.Message, members multibls.PublicKeys) (*FBF if err != nil { return nil, err } - m2mask, err := bls_cosi.NewMask(members, nil) - if err != nil { - return nil, err - } + m2mask := bls_cosi.NewMask(members) m2mask.SetMask(vcMsg.M2Bitmap) FBFTMsg.M2AggSig = &m2Sig FBFTMsg.M2Bitmap = m2mask diff --git a/core/state/journal.go b/core/state/journal.go index 210f38808f..c5e3f743e7 100644 --- a/core/state/journal.go +++ b/core/state/journal.go @@ -156,7 +156,8 @@ func (v validatorWrapperChange) dirtied() *common.Address { } // revert undoes the changes introduced by this journal entry. -func (v validatorWrapperChange) revert(*DB) { +func (v validatorWrapperChange) revert(s *DB) { + s.stateValidators[*(v.address)] = v.prev } func (ch createObjectChange) revert(s *DB) { diff --git a/crypto/bls/mask.go b/crypto/bls/mask.go index b033838f02..2bd908fd7c 100644 --- a/crypto/bls/mask.go +++ b/crypto/bls/mask.go @@ -72,10 +72,8 @@ type Mask struct { } // NewMask returns a new participation bitmask for cosigning where all -// cosigners are disabled by default. If a public key is given it verifies that -// it is present in the list of keys and sets the corresponding index in the -// bitmask to 1 (enabled). -func NewMask(publics []PublicKeyWrapper, myKey *PublicKeyWrapper) (*Mask, error) { +// cosigners are disabled by default. +func NewMask(publics []PublicKeyWrapper) *Mask { index := map[SerializedPublicKey]int{} publicKeys := make([]*PublicKeyWrapper, len(publics)) for i, key := range publics { @@ -88,17 +86,7 @@ func NewMask(publics []PublicKeyWrapper, myKey *PublicKeyWrapper) (*Mask, error) } m.Bitmap = make([]byte, m.Len()) m.AggregatePublic = &bls.PublicKey{} - if myKey != nil { - i, found := m.PublicsIndex[myKey.Bytes] - if found { - m.SetBit(i, true) - found = true - } - if !found { - return nil, errors.New("key not found") - } - } - return m, nil + return m } // Clear clears the existing bits and aggregate public keys. diff --git a/crypto/bls/mask_test.go b/crypto/bls/mask_test.go index 58231add67..17770fd668 100644 --- a/crypto/bls/mask_test.go +++ b/crypto/bls/mask_test.go @@ -16,7 +16,8 @@ func TestNewMask(test *testing.T) { pubKey1.Bytes.FromLibBLSPublicKey(pubKey1.Object) pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) pubKey3.Bytes.FromLibBLSPublicKey(pubKey3.Object) - mask, err := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}) + err := mask.SetKey(pubKey1.Bytes, true) if err != nil { test.Errorf("Failed to create a new Mask: %s", err) @@ -51,16 +52,12 @@ func TestNewMaskWithAbsentPublicKey(test *testing.T) { pubKey3.Bytes.FromLibBLSPublicKey(pubKey3.Object) pubKey4.Bytes.FromLibBLSPublicKey(pubKey4.Object) - mask, err := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}, &pubKey4) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}) + err := mask.SetKey(pubKey4.Bytes, true) if err == nil { - test.Errorf("Failed to create a new Mask: %s", err) - } - - if mask != nil { - test.Errorf("Expected failure to create a new mask") + test.Errorf("Failed to set a key: %s", err) } - } func TestThreshHoldPolicy(test *testing.T) { @@ -71,7 +68,8 @@ func TestThreshHoldPolicy(test *testing.T) { pubKey1.Bytes.FromLibBLSPublicKey(pubKey1.Object) pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) pubKey3.Bytes.FromLibBLSPublicKey(pubKey3.Object) - mask, err := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}) + err := mask.SetKey(pubKey1.Bytes, true) if err != nil { test.Errorf("Failed to create a new Mask: %s", err) @@ -110,7 +108,8 @@ func TestCompletePolicy(test *testing.T) { pubKey1.Bytes.FromLibBLSPublicKey(pubKey1.Object) pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) pubKey3.Bytes.FromLibBLSPublicKey(pubKey3.Object) - mask, err := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}) + err := mask.SetKey(pubKey1.Bytes, true) if err != nil { test.Errorf("Failed to create a new Mask: %s", err) @@ -184,7 +183,8 @@ func TestEnableKeyFunctions(test *testing.T) { pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) pubKey3.Bytes.FromLibBLSPublicKey(pubKey3.Object) pubKey4.Bytes.FromLibBLSPublicKey(pubKey4.Object) - mask, err := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}) + err := mask.SetKey(pubKey1.Bytes, true) if err != nil { test.Errorf("Failed to create a new Mask: %s", err) @@ -238,7 +238,8 @@ func TestGetSignedPubKeysFromBitmap(test *testing.T) { pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) pubKey3.Bytes.FromLibBLSPublicKey(pubKey3.Object) pubKey4.Bytes.FromLibBLSPublicKey(pubKey4.Object) - mask, err := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}) + err := mask.SetKey(pubKey1.Bytes, true) if err != nil { test.Errorf("Failed to create a new Mask: %s", err) @@ -273,7 +274,8 @@ func TestSetKeyAtomic(test *testing.T) { pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) pubKey3.Bytes.FromLibBLSPublicKey(pubKey3.Object) pubKey4.Bytes.FromLibBLSPublicKey(pubKey4.Object) - mask, err := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2, pubKey3}) + err := mask.SetKey(pubKey1.Bytes, true) if err != nil { test.Errorf("Failed to create a new Mask: %s", err) @@ -315,7 +317,8 @@ func TestCopyParticipatingMask(test *testing.T) { pubKey1.Bytes.FromLibBLSPublicKey(pubKey1.Object) pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) - mask, _ := NewMask([]PublicKeyWrapper{pubKey1, pubKey2}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2}) + _ = mask.SetKey(pubKey1.Bytes, true) clonedMask := mask.Mask() @@ -331,7 +334,8 @@ func TestSetMask(test *testing.T) { pubKey1.Bytes.FromLibBLSPublicKey(pubKey1.Object) pubKey2.Bytes.FromLibBLSPublicKey(pubKey2.Object) - mask, _ := NewMask([]PublicKeyWrapper{pubKey1, pubKey2}, &pubKey1) + mask := NewMask([]PublicKeyWrapper{pubKey1, pubKey2}) + _ = mask.SetKey(pubKey1.Bytes, true) _ = mask maskBytes := []byte{3} diff --git a/hmy/blockchain.go b/hmy/blockchain.go index 45bd099f1f..25a6d3aa7f 100644 --- a/hmy/blockchain.go +++ b/hmy/blockchain.go @@ -67,10 +67,7 @@ func (hmy *Harmony) GetBlockSigners( Object: key, } } - mask, err := internal_bls.NewMask(pubKeys, nil) - if err != nil { - return nil, nil, err - } + mask := internal_bls.NewMask(pubKeys) err = mask.SetMask(blockWithSigners.Header().LastCommitBitmap()) if err != nil { return nil, nil, err diff --git a/internal/chain/sig.go b/internal/chain/sig.go index e898b8e6f9..23b51d5f1b 100644 --- a/internal/chain/sig.go +++ b/internal/chain/sig.go @@ -40,11 +40,7 @@ func DecodeSigBitmap(sigBytes bls.SerializedSignature, bitmap []byte, pubKeys [] if err != nil { return nil, nil, errors.New("unable to deserialize multi-signature from payload") } - mask, err := bls.NewMask(pubKeys, nil) - if err != nil { - utils.Logger().Warn().Err(err).Msg("onNewView unable to setup mask for prepared message") - return nil, nil, errors.New("unable to setup mask from payload") - } + mask := bls.NewMask(pubKeys) if err := mask.SetMask(bitmap); err != nil { utils.Logger().Warn().Err(err).Msg("mask.SetMask failed") return nil, nil, errors.New("mask.SetMask failed") diff --git a/staking/availability/measure.go b/staking/availability/measure.go index d79181c32c..680092aa0d 100644 --- a/staking/availability/measure.go +++ b/staking/availability/measure.go @@ -31,10 +31,7 @@ func BlockSigners( if err != nil { return nil, nil, err } - mask, err := bls.NewMask(committerKeys, nil) - if err != nil { - return nil, nil, err - } + mask := bls.NewMask(committerKeys) if err := mask.SetMask(bitmap); err != nil { return nil, nil, err }