Skip to content

Commit

Permalink
Merge pull request #4269 from ElrondNetwork/pseudo-slashing-for-inval…
Browse files Browse the repository at this point in the history
…id-signers

Pseudo slashing for invalid signers
  • Loading branch information
AdoAdoAdo committed Oct 21, 2022
2 parents edf2344 + 63d7e98 commit 405148c
Show file tree
Hide file tree
Showing 36 changed files with 1,082 additions and 73 deletions.
8 changes: 8 additions & 0 deletions consensus/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,14 @@ type ScheduledProcessor interface {
IsInterfaceNil() bool
}

// P2PSigningHandler defines the behaviour of a component able to verify p2p message signature
type P2PSigningHandler interface {
Verify(message p2p.MessageP2P) error
Serialize(messages []p2p.MessageP2P) ([]byte, error)
Deserialize(messagesBytes []byte) ([]p2p.MessageP2P, error)
IsInterfaceNil() bool
}

// SignatureHandler defines the behaviour of a component that handles signatures in consensus
type SignatureHandler interface {
Reset(pubKeys []string) error
Expand Down
2 changes: 2 additions & 0 deletions consensus/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ func NewConsensusMessage(
aggregateSignature []byte,
leaderSignature []byte,
currentPid core.PeerID,
invalidSigners []byte,
) *Message {
return &Message{
BlockHeaderHash: blHeaderHash,
Expand All @@ -36,5 +37,6 @@ func NewConsensusMessage(
AggregateSignature: aggregateSignature,
LeaderSignature: leaderSignature,
OriginatorPid: currentPid.Bytes(),
InvalidSigners: invalidSigners,
}
}
116 changes: 88 additions & 28 deletions consensus/message.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions consensus/message.proto
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ message Message {
bytes AggregateSignature = 11;
bytes LeaderSignature = 12;
bytes OriginatorPid = 13;
bytes InvalidSigners = 14;
}
1 change: 1 addition & 0 deletions consensus/message_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func TestConsensusMessage_NewConsensusMessageShouldWork(t *testing.T) {
nil,
nil,
"pid",
nil,
)

assert.NotNil(t, cnsMsg)
Expand Down
24 changes: 23 additions & 1 deletion consensus/mock/consensusDataContainerMock.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ type ConsensusCoreMock struct {
marshalizer marshal.Marshalizer
blsPrivateKey crypto.PrivateKey
blsSingleSigner crypto.SingleSigner
keyGenerator crypto.KeyGenerator
multiSignerContainer cryptoCommon.MultiSignerContainer
roundHandler consensus.RoundHandler
shardCoordinator sharding.Coordinator
Expand All @@ -38,6 +39,7 @@ type ConsensusCoreMock struct {
fallbackHeaderValidator consensus.FallbackHeaderValidator
nodeRedundancyHandler consensus.NodeRedundancyHandler
scheduledProcessor consensus.ScheduledProcessor
messageSigningHandler consensus.P2PSigningHandler
signatureHandler consensus.SignatureHandler
}

Expand Down Expand Up @@ -186,11 +188,16 @@ func (ccm *ConsensusCoreMock) PrivateKey() crypto.PrivateKey {
return ccm.blsPrivateKey
}

// SingleSigner returns the bls single signer stored in the ConsensusStore
// SingleSigner returns the bls single signer stored in the ConsensusCore
func (ccm *ConsensusCoreMock) SingleSigner() crypto.SingleSigner {
return ccm.blsSingleSigner
}

// KeyGenerator -
func (ccm *ConsensusCoreMock) KeyGenerator() crypto.KeyGenerator {
return ccm.keyGenerator
}

// PeerHonestyHandler -
func (ccm *ConsensusCoreMock) PeerHonestyHandler() consensus.PeerHonestyHandler {
return ccm.peerHonestyHandler
Expand Down Expand Up @@ -231,6 +238,21 @@ func (ccm *ConsensusCoreMock) SetNodeRedundancyHandler(nodeRedundancyHandler con
ccm.nodeRedundancyHandler = nodeRedundancyHandler
}

// MessageSigningHandler -
func (ccm *ConsensusCoreMock) MessageSigningHandler() consensus.P2PSigningHandler {
return ccm.messageSigningHandler
}

// SetMessageSigningHandler -
func (ccm *ConsensusCoreMock) SetMessageSigningHandler(messageSigningHandler consensus.P2PSigningHandler) {
ccm.messageSigningHandler = messageSigningHandler
}

// SetKeyGenerator -
func (ccm *ConsensusCoreMock) SetKeyGenerator(keyGenerator crypto.KeyGenerator) {
ccm.keyGenerator = keyGenerator
}

// SignatureHandler -
func (ccm *ConsensusCoreMock) SignatureHandler() consensus.SignatureHandler {
return ccm.signatureHandler
Expand Down
14 changes: 11 additions & 3 deletions consensus/mock/keyGenMock.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package mock

import (
"github.com/ElrondNetwork/elrond-go-crypto"
crypto "github.com/ElrondNetwork/elrond-go-crypto"
)

// PrivateKeyMock mocks a private key implementation
Expand Down Expand Up @@ -84,12 +84,20 @@ func (keyGen *KeyGenMock) GeneratePair() (crypto.PrivateKey, crypto.PublicKey) {

// PrivateKeyFromByteArray generates the private key from it's byte array representation
func (keyGen *KeyGenMock) PrivateKeyFromByteArray(b []byte) (crypto.PrivateKey, error) {
return keyGen.PrivateKeyFromByteArrayMock(b)
if keyGen.PrivateKeyFromByteArrayMock != nil {
return keyGen.PrivateKeyFromByteArrayMock(b)
}

return &PrivateKeyMock{}, nil
}

// PublicKeyFromByteArray generates a public key from it's byte array representation
func (keyGen *KeyGenMock) PublicKeyFromByteArray(b []byte) (crypto.PublicKey, error) {
return keyGen.PublicKeyFromByteArrayMock(b)
if keyGen.PublicKeyFromByteArrayMock != nil {
return keyGen.PublicKeyFromByteArrayMock(b)
}

return &PublicKeyMock{}, nil
}

// CheckPublicKeyValid verifies the validity of the public key
Expand Down
48 changes: 48 additions & 0 deletions consensus/mock/messageSigningHandlerMock.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package mock

import (
"encoding/json"

"github.com/ElrondNetwork/elrond-go/p2p"
"github.com/ElrondNetwork/elrond-go/p2p/message"
)

// MessageSignerMock implements P2PSigningHandler interface but it does nothing as it is disabled
type MessageSignerMock struct {
}

// Verify does nothing
func (ms *MessageSignerMock) Verify(message p2p.MessageP2P) error {
return nil
}

// Serialize will serialize the list of p2p messages
func (ms *MessageSignerMock) Serialize(messages []p2p.MessageP2P) ([]byte, error) {
messagesBytes, err := json.Marshal(messages)
if err != nil {
return nil, err
}

return messagesBytes, nil
}

// Deserialize will unmarshal into a list of p2p messages
func (ms *MessageSignerMock) Deserialize(messagesBytes []byte) ([]p2p.MessageP2P, error) {
var messages []*message.Message
err := json.Unmarshal(messagesBytes, &messages)
if err != nil {
return nil, err
}

messages2 := make([]p2p.MessageP2P, 0)
for _, msg := range messages {
messages2 = append(messages2, msg)
}

return messages2, nil
}

// IsInterfaceNil returns true if there is no value under the interface
func (ms *MessageSignerMock) IsInterfaceNil() bool {
return ms == nil
}

0 comments on commit 405148c

Please sign in to comment.