feat: make validator key injectable by application developers (backport #21608) (#21802)

Co-authored-by: Marko <marko@baricevic.me>
Co-authored-by: marbar3778 <marbar3778@yahoo.com>
This commit is contained in:
mergify[bot] 2024-09-18 16:09:44 +02:00 committed by GitHub
parent 2174a3d9e5
commit fea175a70b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 35 additions and 8 deletions

View File

@ -6,6 +6,8 @@ import (
"slices"
abci "github.com/cometbft/cometbft/api/cometbft/abci/v1"
cmtcrypto "github.com/cometbft/cometbft/crypto"
cmted25519 "github.com/cometbft/cometbft/crypto/ed25519"
"google.golang.org/grpc"
runtimev1alpha1 "cosmossdk.io/api/cosmos/app/runtime/v1alpha1"
@ -30,6 +32,9 @@ import (
authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
)
// KeyGenF is a function that generates a private key for use by comet.
type KeyGenF = func() (cmtcrypto.PrivKey, error)
// App is a wrapper around BaseApp and ModuleManager that can be used in hybrid
// app.go/app config scenarios or directly as a servertypes.Application instance.
// To get an instance of *App, *AppBuilder must be requested as a dependency
@ -308,3 +313,10 @@ var _ servertypes.Application = &App{}
type hasServicesV1 interface {
RegisterServices(grpc.ServiceRegistrar) error
}
// ValidatorKeyProvider returns a function that generates a private key for use by comet.
func (a *App) ValidatorKeyProvider() KeyGenF {
return func() (cmtcrypto.PrivKey, error) {
return cmted25519.GenPrivKey(), nil
}
}

View File

@ -374,9 +374,7 @@ func startCmtNode(
return nil, cleanupFn, err
}
pv, err := pvm.LoadOrGenFilePV(cfg.PrivValidatorKeyFile(), cfg.PrivValidatorStateFile(), func() (cmtcrypto.PrivKey, error) {
return cmted25519.GenPrivKey(), nil
}) // TODO: make this modular
pv, err := pvm.LoadOrGenFilePV(cfg.PrivValidatorKeyFile(), cfg.PrivValidatorStateFile(), app.ValidatorKeyProvider())
if err != nil {
return nil, cleanupFn, err
}

View File

@ -5,6 +5,7 @@ import (
"io"
cmtproto "github.com/cometbft/cometbft/api/cometbft/types/v1"
cmtcrypto "github.com/cometbft/cometbft/crypto"
cmttypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/gogoproto/grpc"
@ -57,6 +58,9 @@ type (
// SnapshotManager return the snapshot manager
SnapshotManager() *snapshots.Manager
// ValidatorKeyProvider returns a function that generates a validator key
ValidatorKeyProvider() func() (cmtcrypto.PrivKey, error)
// Close is called in start cmd to gracefully cleanup resources.
// Must be safe to be called multiple times.
Close() error

View File

@ -1,6 +1,9 @@
package cometbft
import (
cmtcrypto "github.com/cometbft/cometbft/crypto"
cmted22519 "github.com/cometbft/cometbft/crypto/ed25519"
"cosmossdk.io/core/transaction"
"cosmossdk.io/server/v2/cometbft/handlers"
"cosmossdk.io/server/v2/cometbft/mempool"
@ -8,6 +11,8 @@ import (
"cosmossdk.io/store/v2/snapshots"
)
type keyGenF = func() (cmtcrypto.PrivKey, error)
// ServerOptions defines the options for the CometBFT server.
// When an option takes a map[string]any, it can access the app.tom's cometbft section and the config.toml config.
type ServerOptions[T transaction.Tx] struct {
@ -15,6 +20,7 @@ type ServerOptions[T transaction.Tx] struct {
ProcessProposalHandler handlers.ProcessHandler[T]
VerifyVoteExtensionHandler handlers.VerifyVoteExtensionhandler
ExtendVoteHandler handlers.ExtendVoteHandler
KeygenF keyGenF
Mempool func(cfg map[string]any) mempool.Mempool[T]
SnapshotOptions func(cfg map[string]any) snapshots.SnapshotOptions
@ -35,5 +41,6 @@ func DefaultServerOptions[T transaction.Tx]() ServerOptions[T] {
SnapshotOptions: func(cfg map[string]any) snapshots.SnapshotOptions { return snapshots.NewSnapshotOptions(0, 0) },
AddrPeerFilter: nil,
IdPeerFilter: nil,
KeygenF: func() (cmtcrypto.PrivKey, error) { return cmted22519.GenPrivKey(), nil },
}
}

View File

@ -11,8 +11,6 @@ import (
abciserver "github.com/cometbft/cometbft/abci/server"
cmtcmd "github.com/cometbft/cometbft/cmd/cometbft/commands"
cmtcfg "github.com/cometbft/cometbft/config"
cmtcrypto "github.com/cometbft/cometbft/crypto"
cmted25519 "github.com/cometbft/cometbft/crypto/ed25519"
"github.com/cometbft/cometbft/node"
"github.com/cometbft/cometbft/p2p"
pvm "github.com/cometbft/cometbft/privval"
@ -159,9 +157,7 @@ func (s *CometBFTServer[T]) Start(ctx context.Context) error {
pv, err := pvm.LoadOrGenFilePV(
s.config.ConfigTomlConfig.PrivValidatorKeyFile(),
s.config.ConfigTomlConfig.PrivValidatorStateFile(),
func() (cmtcrypto.PrivKey, error) {
return cmted25519.GenPrivKey(), nil
},
s.serverOptions.KeygenF,
)
if err != nil {
return err

View File

@ -11,6 +11,8 @@ import (
"path/filepath"
abci "github.com/cometbft/cometbft/api/cometbft/abci/v1"
cmtcrypto "github.com/cometbft/cometbft/crypto"
cmted25519 "github.com/cometbft/cometbft/crypto/ed25519"
"github.com/cosmos/gogoproto/proto"
"github.com/spf13/cast"
@ -829,6 +831,14 @@ func (app *SimApp) RegisterNodeService(clientCtx client.Context, cfg config.Conf
nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter(), cfg)
}
// ValidatorKeyProvider returns a function that generates a validator key
// Supported key types are those supported by Comet: ed25519, secp256k1, bls12-381
func (app *SimApp) ValidatorKeyProvider() runtime.KeyGenF {
return func() (cmtcrypto.PrivKey, error) {
return cmted25519.GenPrivKey(), nil
}
}
// GetMaccPerms returns a copy of the module account permissions
//
// NOTE: This is solely to be used for testing purposes.