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

Peer authentication sender factory #4414

Merged
merged 8 commits into from
Sep 1, 2022
Merged
Prev Previous commit
Next Next commit
integrated keys holder into crypto components
  • Loading branch information
sstanculeanu committed Sep 1, 2022

Verified

This commit was signed with the committer’s verified signature. The key has expired.
tagliala Geremia Taglialatela
commit 5dcbdc28a89ec7999c5e1ad7d7798b90175c037a
4 changes: 4 additions & 0 deletions cmd/node/config/config.toml
Original file line number Diff line number Diff line change
@@ -486,6 +486,10 @@
MaxRoundsToKeepUnprocessedMiniBlocks = 300 # max number of rounds unprocessed miniblocks are kept in pool
MaxRoundsToKeepUnprocessedTransactions = 300 # max number of rounds unprocessed transactions are kept in pool

[KeysHolderConfig]
IsMainMachine = false
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we have a separate configuration? Couldn't this be determined based on the redundancy level?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have this in prefs.toml file

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and the MaxRoundsWithoutReceivedMessages is actually the RedundancyLevel value

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pushed

MaxRoundsWithoutReceivedMessages = 5

[TrieSyncStorage]
Capacity = 300000
SizeInBytes = 104857600 #100MB
7 changes: 7 additions & 0 deletions config/config.go
Original file line number Diff line number Diff line change
@@ -218,6 +218,7 @@ type Config struct {

PeersRatingConfig PeersRatingConfig
PoolsCleanersConfig PoolsCleanersConfig
KeysHolderConfig KeysHolderConfig
}

// PeersRatingConfig will hold settings related to peers rating
@@ -607,3 +608,9 @@ type PoolsCleanersConfig struct {
MaxRoundsToKeepUnprocessedMiniBlocks int64
MaxRoundsToKeepUnprocessedTransactions int64
}

// KeysHolderConfig represents the config options to be used by the virtual keys holder
type KeysHolderConfig struct {
IsMainMachine bool
MaxRoundsWithoutReceivedMessages int
}
3 changes: 3 additions & 0 deletions errors/errors.go
Original file line number Diff line number Diff line change
@@ -481,3 +481,6 @@ var ErrDBIsClosed = errors.New("DB is closed")

// ErrNilEnableEpochsHandler signals that a nil enable epochs handler was provided
var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler")

// ErrNilKeysHolder signals that a nil keys holder has been provided
var ErrNilKeysHolder = errors.New("nil keys holder")
21 changes: 21 additions & 0 deletions factory/cryptoComponents.go
Original file line number Diff line number Diff line change
@@ -25,6 +25,9 @@ import (
"github.com/ElrondNetwork/elrond-go/errors"
"github.com/ElrondNetwork/elrond-go/factory/peerSignatureHandler"
"github.com/ElrondNetwork/elrond-go/genesis/process/disabled"
"github.com/ElrondNetwork/elrond-go/heartbeat"
"github.com/ElrondNetwork/elrond-go/keysManagement"
p2pCrypto "github.com/ElrondNetwork/elrond-go/p2p/crypto"
storageFactory "github.com/ElrondNetwork/elrond-go/storage/factory"
"github.com/ElrondNetwork/elrond-go/storage/storageUnit"
"github.com/ElrondNetwork/elrond-go/vm"
@@ -38,6 +41,7 @@ type CryptoComponentsFactoryArgs struct {
ValidatorKeyPemFileName string
SkIndex int
Config config.Config
PrefsConfig config.Preferences
CoreComponentsHolder CoreComponentsHolder
KeyLoader KeyLoaderHandler
ActivateBLSPubKeyMessageVerification bool
@@ -51,6 +55,7 @@ type cryptoComponentsFactory struct {
validatorKeyPemFileName string
skIndex int
config config.Config
prefsConfig config.Preferences
coreComponentsHolder CoreComponentsHolder
activateBLSPubKeyMessageVerification bool
keyLoader KeyLoaderHandler
@@ -77,6 +82,7 @@ type cryptoComponents struct {
blockSignKeyGen crypto.KeyGenerator
txSignKeyGen crypto.KeyGenerator
messageSignVerifier vm.MessageSignVerifier
keysHolder heartbeat.KeysHolder
cryptoParams
}

@@ -97,6 +103,7 @@ func NewCryptoComponentsFactory(args CryptoComponentsFactoryArgs) (*cryptoCompon
validatorKeyPemFileName: args.ValidatorKeyPemFileName,
skIndex: args.SkIndex,
config: args.Config,
prefsConfig: args.PrefsConfig,
coreComponentsHolder: args.CoreComponentsHolder,
activateBLSPubKeyMessageVerification: args.ActivateBLSPubKeyMessageVerification,
keyLoader: args.KeyLoader,
@@ -167,6 +174,19 @@ func (ccf *cryptoComponentsFactory) Create() (*cryptoComponents, error) {
return nil, err
}

blsKeyGenerator := signing.NewKeyGenerator(mcl.NewSuiteBLS12())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't it be created based on a config? similar to factory/cryptoComponents.getSuite()

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of this, we should use the blockSignKeyGen

argsKeysHolder := keysManagement.ArgsVirtualPeersHolder{
KeyGenerator: blsKeyGenerator,
P2PIdentityGenerator: p2pCrypto.NewIdentityGenerator(),
IsMainMachine: ccf.config.KeysHolderConfig.IsMainMachine,
MaxRoundsWithoutReceivedMessages: ccf.config.KeysHolderConfig.MaxRoundsWithoutReceivedMessages,
PrefsConfig: ccf.prefsConfig,
}
keysHolder, err := keysManagement.NewVirtualPeersHolder(argsKeysHolder)
if err != nil {
return nil, err
}

log.Debug("block sign pubkey", "value", cp.publicKeyString)

return &cryptoComponents{
@@ -177,6 +197,7 @@ func (ccf *cryptoComponentsFactory) Create() (*cryptoComponents, error) {
blockSignKeyGen: blockSignKeyGen,
txSignKeyGen: txSignKeyGen,
messageSignVerifier: messageSignVerifier,
keysHolder: keysHolder,
cryptoParams: *cp,
}, nil
}
17 changes: 17 additions & 0 deletions factory/cryptoComponentsHandler.go
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import (
"github.com/ElrondNetwork/elrond-go-core/core/check"
"github.com/ElrondNetwork/elrond-go-crypto"
"github.com/ElrondNetwork/elrond-go/errors"
"github.com/ElrondNetwork/elrond-go/heartbeat"
"github.com/ElrondNetwork/elrond-go/vm"
)

@@ -104,6 +105,9 @@ func (mcc *managedCryptoComponents) CheckSubcomponents() error {
if check.IfNil(mcc.cryptoComponents.messageSignVerifier) {
return errors.ErrNilMessageSignVerifier
}
if check.IfNil(mcc.cryptoComponents.keysHolder) {
return errors.ErrNilKeysHolder
}

return nil
}
@@ -265,6 +269,18 @@ func (mcc *managedCryptoComponents) MessageSignVerifier() vm.MessageSignVerifier
return mcc.cryptoComponents.messageSignVerifier
}

// KeysHolder returns the virtual keys holder
func (mcc *managedCryptoComponents) KeysHolder() heartbeat.KeysHolder {
mcc.mutCryptoComponents.RLock()
defer mcc.mutCryptoComponents.RUnlock()

if mcc.cryptoComponents == nil {
return nil
}

return mcc.cryptoComponents.keysHolder
}

// Clone creates a shallow clone of a managedCryptoComponents
func (mcc *managedCryptoComponents) Clone() interface{} {
cryptoComp := (*cryptoComponents)(nil)
@@ -277,6 +293,7 @@ func (mcc *managedCryptoComponents) Clone() interface{} {
blockSignKeyGen: mcc.BlockSignKeyGen(),
txSignKeyGen: mcc.TxSignKeyGen(),
messageSignVerifier: mcc.MessageSignVerifier(),
keysHolder: mcc.KeysHolder(),
cryptoParams: mcc.cryptoParams,
}
}
2 changes: 2 additions & 0 deletions factory/cryptoComponentsHandler_test.go
Original file line number Diff line number Diff line change
@@ -43,6 +43,7 @@ func TestManagedCryptoComponents_CreateShouldWork(t *testing.T) {
require.Nil(t, managedCryptoComponents.BlockSignKeyGen())
require.Nil(t, managedCryptoComponents.TxSignKeyGen())
require.Nil(t, managedCryptoComponents.MessageSignVerifier())
require.Nil(t, managedCryptoComponents.KeysHolder())

err = managedCryptoComponents.Create()
require.NoError(t, err)
@@ -52,6 +53,7 @@ func TestManagedCryptoComponents_CreateShouldWork(t *testing.T) {
require.NotNil(t, managedCryptoComponents.BlockSignKeyGen())
require.NotNil(t, managedCryptoComponents.TxSignKeyGen())
require.NotNil(t, managedCryptoComponents.MessageSignVerifier())
require.NotNil(t, managedCryptoComponents.KeysHolder())
}

func TestManagedCryptoComponents_CheckSubcomponents(t *testing.T) {
11 changes: 11 additions & 0 deletions factory/cryptoComponents_test.go
Original file line number Diff line number Diff line change
@@ -490,6 +490,17 @@ func getCryptoArgs(coreComponents factory.CoreComponentsHolder) factory.CryptoCo
Type: "LRU",
},
Hasher: config.TypeConfig{Type: "blake2b"},
KeysHolderConfig: config.KeysHolderConfig{
IsMainMachine: true,
MaxRoundsWithoutReceivedMessages: 2,
},
},
PrefsConfig: config.Preferences{
Preferences: config.PreferencesConfig{
NodeDisplayName: "node name",
Identity: "identity",
},
NamedIdentity: nil,
},
SkIndex: 0,
ValidatorKeyPemFileName: "validatorKey.pem",
3 changes: 1 addition & 2 deletions factory/heartbeatV2Components.go
Original file line number Diff line number Diff line change
@@ -12,7 +12,6 @@ import (
"github.com/ElrondNetwork/elrond-go/heartbeat/monitor"
"github.com/ElrondNetwork/elrond-go/heartbeat/processor"
"github.com/ElrondNetwork/elrond-go/heartbeat/sender"
"github.com/ElrondNetwork/elrond-go/testscommon"
"github.com/ElrondNetwork/elrond-go/update"
)

@@ -143,7 +142,7 @@ func (hcf *heartbeatV2ComponentsFactory) Create() (*heartbeatV2Components, error
HardforkTrigger: hcf.processComponents.HardforkTrigger(),
HardforkTimeBetweenSends: time.Second * time.Duration(cfg.HardforkTimeBetweenSendsInSec),
HardforkTriggerPubKey: hcf.coreComponents.HardforkTriggerPubKey(),
KeysHolder: &testscommon.KeysHolderStub{}, // TODO: use the real component once it is completely integrated
KeysHolder: hcf.cryptoComponents.KeysHolder(),
PeerAuthenticationTimeBetweenChecks: time.Second * time.Duration(cfg.PeerAuthenticationTimeBetweenChecksInSec),
ShardCoordinator: hcf.processComponents.ShardCoordinator(),
}
1 change: 1 addition & 0 deletions factory/interface.go
Original file line number Diff line number Diff line change
@@ -162,6 +162,7 @@ type CryptoComponentsHolder interface {
BlockSignKeyGen() crypto.KeyGenerator
TxSignKeyGen() crypto.KeyGenerator
MessageSignVerifier() vm.MessageSignVerifier
KeysHolder() heartbeat.KeysHolder
Clone() interface{}
IsInterfaceNil() bool
}
8 changes: 8 additions & 0 deletions factory/mock/cryptoComponentsMock.go
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import (
"sync"

"github.com/ElrondNetwork/elrond-go-crypto"
"github.com/ElrondNetwork/elrond-go/heartbeat"
"github.com/ElrondNetwork/elrond-go/vm"
)

@@ -21,6 +22,7 @@ type CryptoComponentsMock struct {
BlKeyGen crypto.KeyGenerator
TxKeyGen crypto.KeyGenerator
MsgSigVerifier vm.MessageSignVerifier
KeysHolderField heartbeat.KeysHolder
mutMultiSig sync.RWMutex
}

@@ -99,6 +101,11 @@ func (ccm *CryptoComponentsMock) MessageSignVerifier() vm.MessageSignVerifier {
return ccm.MsgSigVerifier
}

// KeysHolder -
func (ccm *CryptoComponentsMock) KeysHolder() heartbeat.KeysHolder {
return ccm.KeysHolderField
}

// Clone -
func (ccm *CryptoComponentsMock) Clone() interface{} {
return &CryptoComponentsMock{
@@ -114,6 +121,7 @@ func (ccm *CryptoComponentsMock) Clone() interface{} {
BlKeyGen: ccm.BlKeyGen,
TxKeyGen: ccm.TxKeyGen,
MsgSigVerifier: ccm.MsgSigVerifier,
KeysHolderField: ccm.KeysHolderField,
mutMultiSig: sync.RWMutex{},
}
}
8 changes: 8 additions & 0 deletions integrationTests/mock/cryptoComponentsStub.go
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import (
"sync"

"github.com/ElrondNetwork/elrond-go-crypto"
"github.com/ElrondNetwork/elrond-go/heartbeat"
"github.com/ElrondNetwork/elrond-go/vm"
)

@@ -21,6 +22,7 @@ type CryptoComponentsStub struct {
BlKeyGen crypto.KeyGenerator
TxKeyGen crypto.KeyGenerator
MsgSigVerifier vm.MessageSignVerifier
KeysHolderField heartbeat.KeysHolder
mutMultiSig sync.RWMutex
}

@@ -114,6 +116,11 @@ func (ccs *CryptoComponentsStub) MessageSignVerifier() vm.MessageSignVerifier {
return ccs.MsgSigVerifier
}

// KeysHolder -
func (ccs *CryptoComponentsStub) KeysHolder() heartbeat.KeysHolder {
return ccs.KeysHolderField
}

// Clone -
func (ccs *CryptoComponentsStub) Clone() interface{} {
return &CryptoComponentsStub{
@@ -129,6 +136,7 @@ func (ccs *CryptoComponentsStub) Clone() interface{} {
BlKeyGen: ccs.BlKeyGen,
TxKeyGen: ccs.TxKeyGen,
MsgSigVerifier: ccs.MsgSigVerifier,
KeysHolderField: ccs.KeysHolderField,
mutMultiSig: sync.RWMutex{},
}
}
36 changes: 19 additions & 17 deletions integrationTests/testHeartbeatNode.go
Original file line number Diff line number Diff line change
@@ -392,29 +392,31 @@ func (thn *TestHeartbeatNode) initStorage() {
func (thn *TestHeartbeatNode) initSender() {
identifierHeartbeat := common.HeartbeatV2Topic + thn.ShardCoordinator.CommunicationIdentifier(thn.ShardCoordinator.SelfId())
argsSender := sender.ArgSender{
Messenger: thn.Messenger,
Marshaller: TestMarshaller,
PeerAuthenticationTopic: common.PeerAuthenticationTopic,
HeartbeatTopic: identifierHeartbeat,
VersionNumber: "v01",
NodeDisplayName: defaultNodeName,
Identity: defaultNodeName + "_identity",
PeerSubType: core.RegularPeer,
CurrentBlockProvider: &testscommon.ChainHandlerStub{},
PeerSignatureHandler: thn.PeerSigHandler,
PrivateKey: thn.NodeKeys.Sk,
RedundancyHandler: &mock.RedundancyHandlerStub{},
NodesCoordinator: thn.NodesCoordinator,
HardforkTrigger: &testscommon.HardforkTriggerStub{},
HardforkTriggerPubKey: []byte(providedHardforkPubKey),

PeerAuthenticationTimeBetweenSends: timeBetweenPeerAuths,
Messenger: thn.Messenger,
Marshaller: TestMarshaller,
PeerAuthenticationTopic: common.PeerAuthenticationTopic,
HeartbeatTopic: identifierHeartbeat,
PeerAuthenticationTimeBetweenSends: timeBetweenPeerAuths,
PeerAuthenticationTimeBetweenSendsWhenError: timeBetweenSendsWhenError,
PeerAuthenticationThresholdBetweenSends: thresholdBetweenSends,
HeartbeatTimeBetweenSends: timeBetweenHeartbeats,
HeartbeatTimeBetweenSendsWhenError: timeBetweenSendsWhenError,
HeartbeatThresholdBetweenSends: thresholdBetweenSends,
VersionNumber: "v01",
NodeDisplayName: defaultNodeName,
Identity: defaultNodeName + "_identity",
PeerSubType: core.RegularPeer,
CurrentBlockProvider: &testscommon.ChainHandlerStub{},
PeerSignatureHandler: thn.PeerSigHandler,
PrivateKey: thn.NodeKeys.Sk,
RedundancyHandler: &mock.RedundancyHandlerStub{},
NodesCoordinator: thn.NodesCoordinator,
HardforkTrigger: &testscommon.HardforkTriggerStub{},
HardforkTimeBetweenSends: timeBetweenHardforks,
HardforkTriggerPubKey: []byte(providedHardforkPubKey),
KeysHolder: &testscommon.KeysHolderStub{},
PeerAuthenticationTimeBetweenChecks: time.Second * 2,
ShardCoordinator: thn.ShardCoordinator,
}

thn.Sender, _ = sender.NewSender(argsSender)
7 changes: 7 additions & 0 deletions node/mock/factory/cryptoComponentsStub.go
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import (
"sync"

"github.com/ElrondNetwork/elrond-go-crypto"
"github.com/ElrondNetwork/elrond-go/heartbeat"
"github.com/ElrondNetwork/elrond-go/vm"
)

@@ -21,6 +22,7 @@ type CryptoComponentsMock struct {
BlKeyGen crypto.KeyGenerator
TxKeyGen crypto.KeyGenerator
MsgSigVerifier vm.MessageSignVerifier
KeysHolderField heartbeat.KeysHolder
mutMultiSig sync.RWMutex
}

@@ -114,6 +116,11 @@ func (ccm *CryptoComponentsMock) MessageSignVerifier() vm.MessageSignVerifier {
return ccm.MsgSigVerifier
}

// KeysHolder -
func (ccm *CryptoComponentsMock) KeysHolder() heartbeat.KeysHolder {
return ccm.KeysHolderField
}

// Clone -
func (ccm *CryptoComponentsMock) Clone() interface{} {
return &CryptoComponentsMock{