Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Signature handler component for consensus #4316

Merged
merged 20 commits into from
Aug 2, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
811288a
added signing component for consensus:
ssd04 Jul 22, 2022
379055d
consensus signing: unit tests for aggSig and verifyAggSig
ssd04 Jul 22, 2022
4cb32fc
consensus: added signature handler interface
ssd04 Jul 22, 2022
8709e7f
signature holder component: renamings and comment updates
ssd04 Jul 22, 2022
36d9dbc
unit tests and mocks fixes
ssd04 Jul 22, 2022
93ca11b
update signature handler interface; remove own index from signatures …
ssd04 Jul 25, 2022
e525002
Merge branch 'feat/kosk-bls-multisigner' into signatures-holder-compo…
ssd04 Jul 29, 2022
a7c0c9d
integrate multisigner container; fix unit tests
ssd04 Aug 1, 2022
cd57cd1
fix multisigner mutex on set + unit tests
ssd04 Aug 1, 2022
d9473b0
create signature handler component for consensus
ssd04 Aug 1, 2022
f248531
remove single signer since it's not being used
ssd04 Aug 1, 2022
12f2d8d
add multi signer container stub
ssd04 Aug 1, 2022
f6cb500
consensus signing: remove multi signer set from signature handler, re…
ssd04 Aug 1, 2022
5b1e898
fixes after review:
ssd04 Aug 1, 2022
3be0b7e
fixes after review: renamings, removed TODO comment
ssd04 Aug 1, 2022
323d3f9
fixes after review: better checks for invalid input
ssd04 Aug 1, 2022
60b05ff
fixes after review: renamings, change mutex to read when applicable
ssd04 Aug 1, 2022
aac70c1
fix linter issues: return bool variable directly
ssd04 Aug 1, 2022
67ed8dd
unit tests for get current multi signer fail
ssd04 Aug 2, 2022
5969f45
fix after review: better slice allocation
ssd04 Aug 2, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions consensus/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,17 @@ type ScheduledProcessor interface {
IsProcessedOKWithTimeout() bool
IsInterfaceNil() bool
}

// SignatureHandler defines the behaviour of a component that handles signatures in consensus
type SignatureHandler interface {
Reset(pubKeys []string) error
SetMultiSignerByEpoch(epoch uint32) error
AdoAdoAdo marked this conversation as resolved.
Show resolved Hide resolved
CreateSignatureShare(msg []byte, index uint16) ([]byte, error)
StoreSignatureShare(index uint16, sig []byte) error
SignatureShare(index uint16) ([]byte, error)
VerifySignatureShare(index uint16, sig []byte, msg []byte) error
AggregateSigs(bitmap []byte) ([]byte, error)
SetAggregatedSig([]byte) error
Verify(msg []byte, bitmap []byte) error
IsInterfaceNil() bool
}
11 changes: 11 additions & 0 deletions consensus/mock/consensusDataContainerMock.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ type ConsensusCoreMock struct {
fallbackHeaderValidator consensus.FallbackHeaderValidator
nodeRedundancyHandler consensus.NodeRedundancyHandler
scheduledProcessor consensus.ScheduledProcessor
signatureHandler consensus.SignatureHandler
}

// GetAntiFloodHandler -
Expand Down Expand Up @@ -230,6 +231,16 @@ func (ccm *ConsensusCoreMock) SetNodeRedundancyHandler(nodeRedundancyHandler con
ccm.nodeRedundancyHandler = nodeRedundancyHandler
}

// SignatureHandler -
func (ccm *ConsensusCoreMock) SignatureHandler() consensus.SignatureHandler {
return ccm.signatureHandler
}

// SetSignatureHandler -
AdoAdoAdo marked this conversation as resolved.
Show resolved Hide resolved
func (ccm *ConsensusCoreMock) SetSignatureHandler(signatureHandler consensus.SignatureHandler) {
ccm.signatureHandler = signatureHandler
}

// IsInterfaceNil returns true if there is no value under the interface
func (ccm *ConsensusCoreMock) IsInterfaceNil() bool {
return ccm == nil
Expand Down
2 changes: 2 additions & 0 deletions consensus/mock/mockTestInitializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ func InitConsensusCoreWithMultiSigner(multiSigner crypto.MultiSigner) *Consensus
nodeRedundancyHandler := &NodeRedundancyHandlerStub{}
scheduledProcessor := &consensusMocks.ScheduledProcessorStub{}
multiSignerContainer := cryptoMocks.NewMultiSignerContainerMock(multiSigner)
signatureHandler := &SignatureHandlerStub{}

container := &ConsensusCoreMock{
blockChain: blockChain,
Expand All @@ -229,6 +230,7 @@ func InitConsensusCoreWithMultiSigner(multiSigner crypto.MultiSigner) *Consensus
fallbackHeaderValidator: fallbackHeaderValidator,
nodeRedundancyHandler: nodeRedundancyHandler,
scheduledProcessor: scheduledProcessor,
signatureHandler: signatureHandler,
}

return container
Expand Down
100 changes: 100 additions & 0 deletions consensus/mock/signatureHandlerStub.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package mock

// SignatureHandlerStub implements SignatureHandler interface
type SignatureHandlerStub struct {
ResetCalled func(pubKeys []string) error
SetMultiSignerByEpochCalled func(epoch uint32) error
CreateSignatureShareCalled func(msg []byte, index uint16) ([]byte, error)
StoreSignatureShareCalled func(index uint16, sig []byte) error
SignatureShareCalled func(index uint16) ([]byte, error)
VerifySignatureShareCalled func(index uint16, sig []byte, msg []byte) error
AggregateSigsCalled func(bitmap []byte) ([]byte, error)
SetAggregatedSigCalled func(_ []byte) error
VerifyCalled func(msg []byte, bitmap []byte) error
}

// SetMultiSignerByEpoch -
func (stub *SignatureHandlerStub) SetMultiSignerByEpoch(epoch uint32) error {
if stub.SetMultiSignerByEpochCalled != nil {
return stub.SetMultiSignerByEpochCalled(epoch)
}

return nil
}

// Reset -
func (stub *SignatureHandlerStub) Reset(pubKeys []string) error {
if stub.ResetCalled != nil {
return stub.ResetCalled(pubKeys)
}

return nil
}

// CreateSignatureShare -
func (stub *SignatureHandlerStub) CreateSignatureShare(msg []byte, index uint16) ([]byte, error) {
if stub.CreateSignatureShareCalled != nil {
return stub.CreateSignatureShareCalled(msg, index)
}

return []byte("sigShare"), nil
}

// StoreSignatureShare -
func (stub *SignatureHandlerStub) StoreSignatureShare(index uint16, sig []byte) error {
if stub.StoreSignatureShareCalled != nil {
return stub.StoreSignatureShareCalled(index, sig)
}

return nil
}

// SignatureShare -
func (stub *SignatureHandlerStub) SignatureShare(index uint16) ([]byte, error) {
if stub.SignatureShareCalled != nil {
return stub.SignatureShareCalled(index)
}

return []byte("sigShare"), nil
}

// VerifySignatureShare -
func (stub *SignatureHandlerStub) VerifySignatureShare(index uint16, sig []byte, msg []byte) error {
if stub.VerifySignatureShareCalled != nil {
return stub.VerifySignatureShareCalled(index, sig, msg)
}

return nil
}

// AggregateSigs -
func (stub *SignatureHandlerStub) AggregateSigs(bitmap []byte) ([]byte, error) {
if stub.AggregateSigsCalled != nil {
return stub.AggregateSigsCalled(bitmap)
}

return []byte("aggSigs"), nil
}

// SetAggregatedSig -
func (stub *SignatureHandlerStub) SetAggregatedSig(sig []byte) error {
if stub.SetAggregatedSigCalled != nil {
return stub.SetAggregatedSigCalled(sig)
}

return nil
}

// Verify -
func (stub *SignatureHandlerStub) Verify(msg []byte, bitmap []byte) error {
if stub.VerifyCalled != nil {
return stub.VerifyCalled(msg, bitmap)
}

return nil
}

// IsInterfaceNil -
func (stub *SignatureHandlerStub) IsInterfaceNil() bool {
return stub == nil
}
4 changes: 2 additions & 2 deletions consensus/signing/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ var ErrNilPublicKeys = errors.New("public keys are nil")
// ErrNilSingleSigner singals that a nil single signer has been provided
sstanculeanu marked this conversation as resolved.
Show resolved Hide resolved
var ErrNilSingleSigner = errors.New("single signer is nil")

// ErrNilMultiSigner singals that a nil multi signer has been provided
var ErrNilMultiSigner = errors.New("multi signer is nil")
// ErrNilMultiSignerContainer singals that a nil multi signer container has been provided
sstanculeanu marked this conversation as resolved.
Show resolved Hide resolved
var ErrNilMultiSignerContainer = errors.New("multi signer container is nil")

// ErrIndexOutOfBounds is raised when an out of bound index is used
var ErrIndexOutOfBounds = errors.New("index is out of bounds")
Expand Down
78 changes: 56 additions & 22 deletions consensus/signing/signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@ import (

"github.com/ElrondNetwork/elrond-go-core/core/check"
crypto "github.com/ElrondNetwork/elrond-go-crypto"
cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto"
)

// ArgsSignatureHolder defines the arguments needed to create a new signature holder component
type ArgsSignatureHolder struct {
PubKeys []string
PrivKey crypto.PrivateKey
SingleSigner crypto.SingleSigner
MultiSigner crypto.MultiSigner
KeyGenerator crypto.KeyGenerator
PubKeys []string
PrivKey crypto.PrivateKey
SingleSigner crypto.SingleSigner
MultiSignerContainer cryptoCommon.MultiSignerContainer
KeyGenerator crypto.KeyGenerator
}

type signatureHolderData struct {
Expand All @@ -24,11 +25,13 @@ type signatureHolderData struct {
}

type signatureHolder struct {
data *signatureHolderData
mutSigningData sync.RWMutex
singleSigner crypto.SingleSigner
multiSigner crypto.MultiSigner
keyGen crypto.KeyGenerator
data *signatureHolderData
mutSigningData sync.RWMutex
singleSigner crypto.SingleSigner
multiSignerContainer cryptoCommon.MultiSignerContainer
AdoAdoAdo marked this conversation as resolved.
Show resolved Hide resolved
multiSigner crypto.MultiSigner
mutMultiSigner sync.RWMutex
keyGen crypto.KeyGenerator
}

// NewSignatureHolder will create a new signature holder component
Expand All @@ -51,21 +54,27 @@ func NewSignatureHolder(args ArgsSignatureHolder) (*signatureHolder, error) {
sigShares: sigShares,
}

multiSigner, err := args.MultiSignerContainer.GetMultiSigner(0)
if err != nil {
return nil, err
}

return &signatureHolder{
data: data,
mutSigningData: sync.RWMutex{},
singleSigner: args.SingleSigner,
multiSigner: args.MultiSigner,
keyGen: args.KeyGenerator,
data: data,
mutSigningData: sync.RWMutex{},
singleSigner: args.SingleSigner,
multiSignerContainer: args.MultiSignerContainer,
multiSigner: multiSigner,
keyGen: args.KeyGenerator,
}, nil
}

func checkArgs(args ArgsSignatureHolder) error {
if check.IfNil(args.SingleSigner) {
return ErrNilSingleSigner
}
if check.IfNil(args.MultiSigner) {
return ErrNilMultiSigner
if check.IfNil(args.MultiSignerContainer) {
return ErrNilMultiSignerContainer
}
if check.IfNil(args.PrivKey) {
return ErrNilPrivateKey
Expand All @@ -87,11 +96,11 @@ func (sh *signatureHolder) Create(pubKeys []string, index uint16) (*signatureHol
sh.mutSigningData.RUnlock()

args := ArgsSignatureHolder{
PubKeys: pubKeys,
PrivKey: privKey,
SingleSigner: sh.singleSigner,
MultiSigner: sh.multiSigner,
KeyGenerator: sh.keyGen,
PubKeys: pubKeys,
PrivKey: privKey,
SingleSigner: sh.singleSigner,
MultiSignerContainer: sh.multiSignerContainer,
KeyGenerator: sh.keyGen,
}
return NewSignatureHolder(args)
}
Expand Down Expand Up @@ -125,6 +134,20 @@ func (sh *signatureHolder) Reset(pubKeys []string) error {
return nil
}

func (sh *signatureHolder) SetMultiSignerByEpoch(epoch uint32) error {
AdoAdoAdo marked this conversation as resolved.
Show resolved Hide resolved
multiSigner, err := sh.multiSignerContainer.GetMultiSigner(epoch)
if err != nil {
return err
}

sh.mutMultiSigner.RLock()
defer sh.mutSigningData.RUnlock()

sh.multiSigner = multiSigner

return nil
}

// CreateSignatureShare returns a signature over a message
func (sh *signatureHolder) CreateSignatureShare(message []byte, selfIndex uint16) ([]byte, error) {
if message == nil {
Expand All @@ -139,10 +162,12 @@ func (sh *signatureHolder) CreateSignatureShare(message []byte, selfIndex uint16
return nil, err
}

sh.mutMultiSigner.RLock()
sigShareBytes, err := sh.multiSigner.CreateSignatureShare(privKeyBytes, message)
if err != nil {
return nil, err
}
sh.mutMultiSigner.RUnlock()

sh.data.sigShares[selfIndex] = sigShareBytes

Expand All @@ -165,6 +190,9 @@ func (sh *signatureHolder) VerifySignatureShare(index uint16, sig []byte, messag

pubKey := sh.data.pubKeys[index]

sh.mutMultiSigner.RLock()
defer sh.mutMultiSigner.RUnlock()

return sh.multiSigner.VerifySignatureShare(pubKey, message, sig)
}

Expand Down Expand Up @@ -246,6 +274,9 @@ func (sh *signatureHolder) AggregateSigs(bitmap []byte) ([]byte, error) {
pubKeysSigners = append(pubKeysSigners, sh.data.pubKeys[i])
}

sh.mutMultiSigner.RLock()
defer sh.mutMultiSigner.RUnlock()

return sh.multiSigner.AggregateSigs(pubKeysSigners, signatures)
}

Expand Down Expand Up @@ -285,6 +316,9 @@ func (sh *signatureHolder) Verify(message []byte, bitmap []byte) error {
pubKeys = append(pubKeys, sh.data.pubKeys[i])
}

sh.mutMultiSigner.RLock()
defer sh.mutMultiSigner.RUnlock()

return sh.multiSigner.VerifyAggregatedSig(pubKeys, message, sh.data.aggSig)
}

Expand Down
Loading