diff --git a/consensus/cometbft/service/interfaces.go b/consensus/cometbft/service/interfaces.go index f00cd84b6f..b3f97507b8 100644 --- a/consensus/cometbft/service/interfaces.go +++ b/consensus/cometbft/service/interfaces.go @@ -22,6 +22,8 @@ package cometbft import ( "time" + + cmttypes "github.com/cometbft/cometbft/types" ) // TelemetrySink is an interface for sending metrics to a telemetry backend. @@ -31,3 +33,8 @@ type TelemetrySink interface { // MeasureSince measures the time since the given time. MeasureSince(key string, start time.Time, args ...string) } + +// PrivValidatorConsumer consumes a CometBFT PrivValidator reference. +type PrivValidatorConsumer interface { + SetPrivValidator(cmttypes.PrivValidator) +} diff --git a/consensus/cometbft/service/options.go b/consensus/cometbft/service/options.go index ef687eee80..62b3c48b45 100644 --- a/consensus/cometbft/service/options.go +++ b/consensus/cometbft/service/options.go @@ -79,6 +79,13 @@ func SetInterBlockCache(cache storetypes.MultiStorePersistentCache) func(*Servic } } +// SetPrivValidatorConsumer configures the Service to share its PrivValidator. +func SetPrivValidatorConsumer(consumer PrivValidatorConsumer) func(*Service) { + return func(s *Service) { + s.privValConsumer = consumer + } +} + // SetChainID sets the chain ID in cometbft. func SetChainID(chainID string) func(*Service) { return func(s *Service) { s.chainID = chainID } diff --git a/consensus/cometbft/service/service.go b/consensus/cometbft/service/service.go index de275a0c1a..e26776113e 100644 --- a/consensus/cometbft/service/service.go +++ b/consensus/cometbft/service/service.go @@ -70,6 +70,8 @@ type Service struct { cmtCfg *cmtcfg.Config telemetrySink TelemetrySink + // privValConsumer consumes the PrivValidator created during Start. + privValConsumer PrivValidatorConsumer logger *phuslu.Logger sm *statem.Manager @@ -203,7 +205,6 @@ func (s *Service) Start( if err != nil { return err } - s.ResetAppCtx(ctx) s.node, err = node.NewNode( ctx, @@ -220,6 +221,11 @@ func (s *Service) Start( return err } + // The privval has been started, we can now swap the FilePV + if s.privValConsumer != nil { + s.privValConsumer.SetPrivValidator(s.node.PrivValidator()) + } + pubKey, errPk := s.node.PrivValidator().GetPubKey() if errPk != nil { return fmt.Errorf("failed retrieving pub key: %w", err) diff --git a/node-core/components/cometbft_service.go b/node-core/components/cometbft_service.go index 3dce738714..5da79423f7 100644 --- a/node-core/components/cometbft_service.go +++ b/node-core/components/cometbft_service.go @@ -29,6 +29,7 @@ import ( "github.com/berachain/beacon-kit/log/phuslu" "github.com/berachain/beacon-kit/node-core/builder" "github.com/berachain/beacon-kit/node-core/components/metrics" + "github.com/berachain/beacon-kit/primitives/crypto" cmtcfg "github.com/cometbft/cometbft/config" dbm "github.com/cosmos/cosmos-db" ) @@ -43,7 +44,13 @@ func ProvideCometBFTService( cmtCfg *cmtcfg.Config, appOpts config.AppOptions, telemetrySink *metrics.TelemetrySink, + blsSigner crypto.BLSSigner, ) *cometbft.Service { + options := builder.DefaultServiceOptions(appOpts) + if consumer, ok := blsSigner.(cometbft.PrivValidatorConsumer); ok { + options = append(options, cometbft.SetPrivValidatorConsumer(consumer)) + } + return cometbft.NewService( logger, db, @@ -52,6 +59,6 @@ func ProvideCometBFTService( cs, cmtCfg, telemetrySink, - builder.DefaultServiceOptions(appOpts)..., + options..., ) } diff --git a/node-core/components/signer/signer.go b/node-core/components/signer/signer.go index f0a0c44a83..4467525c19 100644 --- a/node-core/components/signer/signer.go +++ b/node-core/components/signer/signer.go @@ -37,6 +37,11 @@ type BLSSigner struct { types.PrivValidator } +// SetPrivValidator swaps the underlying PrivValidator the signer delegates to. +func (f *BLSSigner) SetPrivValidator(pv types.PrivValidator) { + f.PrivValidator = pv +} + // NewBLSSigner creates a new BLSSigner instance using the provided key and // state // file paths.