@ -6,19 +6,17 @@ import (
"fmt"
"fmt"
"net"
"net"
"net/http"
"net/http"
_ "net/http/pprof" // nolint: gosec // securely exposed on separate, optional port
"strconv"
"strconv"
"time"
"time"
_ "github.com/lib/pq" // provide the psql db driver
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/rs/cors"
"github.com/rs/cors"
abciclient "github.com/tendermint/tendermint/abci/client"
abciclient "github.com/tendermint/tendermint/abci/client"
abci "github.com/tendermint/tendermint/abci/types"
abci "github.com/tendermint/tendermint/abci/types"
cfg "github.com/tendermint/tendermint/config"
"github.com/tendermint/tendermint/config"
"github.com/tendermint/tendermint/crypto"
"github.com/tendermint/tendermint/crypto"
cs "github.com/tendermint/tendermint/internal/consensus"
"github.com/tendermint/tendermint/internal/consensus"
"github.com/tendermint/tendermint/internal/mempool"
"github.com/tendermint/tendermint/internal/mempool"
"github.com/tendermint/tendermint/internal/p2p"
"github.com/tendermint/tendermint/internal/p2p"
"github.com/tendermint/tendermint/internal/p2p/pex"
"github.com/tendermint/tendermint/internal/p2p/pex"
@ -38,6 +36,10 @@ import (
rpcserver "github.com/tendermint/tendermint/rpc/jsonrpc/server"
rpcserver "github.com/tendermint/tendermint/rpc/jsonrpc/server"
"github.com/tendermint/tendermint/store"
"github.com/tendermint/tendermint/store"
"github.com/tendermint/tendermint/types"
"github.com/tendermint/tendermint/types"
_ "net/http/pprof" // nolint: gosec // securely exposed on separate, optional port
_ "github.com/lib/pq" // provide the psql db driver
)
)
// nodeImpl is the highest level interface to a full Tendermint node.
// nodeImpl is the highest level interface to a full Tendermint node.
@ -46,7 +48,7 @@ type nodeImpl struct {
service . BaseService
service . BaseService
// config
// config
config * cfg . Config
config * con fi g . Config
genesisDoc * types . GenesisDoc // initial validator set
genesisDoc * types . GenesisDoc // initial validator set
privValidator types . PrivValidator // local node's validator key
privValidator types . PrivValidator // local node's validator key
@ -69,7 +71,7 @@ type nodeImpl struct {
mempool mempool . Mempool
mempool mempool . Mempool
stateSync bool // whether the node should state sync on startup
stateSync bool // whether the node should state sync on startup
stateSyncReactor * statesync . Reactor // for hosting and restoring state sync snapshots
stateSyncReactor * statesync . Reactor // for hosting and restoring state sync snapshots
consensusReactor * cs . Reactor // for participating in the consensus
consensusReactor * consensu s . Reactor // for participating in the consensus
pexReactor service . Service // for exchanging peer addresses
pexReactor service . Service // for exchanging peer addresses
evidenceReactor service . Service
evidenceReactor service . Service
rpcListeners [ ] net . Listener // rpc servers
rpcListeners [ ] net . Listener // rpc servers
@ -81,23 +83,23 @@ type nodeImpl struct {
// newDefaultNode returns a Tendermint node with default settings for the
// newDefaultNode returns a Tendermint node with default settings for the
// PrivValidator, ClientCreator, GenesisDoc, and DBProvider.
// PrivValidator, ClientCreator, GenesisDoc, and DBProvider.
// It implements NodeProvider.
// It implements NodeProvider.
func newDefaultNode ( con fi g * cfg . Config , logger log . Logger ) ( service . Service , error ) {
nodeKey , err := types . LoadOrGenNodeKey ( con fi g . NodeKeyFile ( ) )
func newDefaultNode ( cfg * con fi g . Config , logger log . Logger ) ( service . Service , error ) {
nodeKey , err := types . LoadOrGenNodeKey ( cfg . NodeKeyFile ( ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "failed to load or gen node key %s: %w" , con fi g . NodeKeyFile ( ) , err )
return nil , fmt . Errorf ( "failed to load or gen node key %s: %w" , cfg . NodeKeyFile ( ) , err )
}
}
if con fi g . Mode == cfg . ModeSeed {
return makeSeedNode ( con fi g ,
cfg . DefaultDBProvider ,
if cfg . Mode == con fi g . ModeSeed {
return makeSeedNode ( cfg ,
con fi g . DefaultDBProvider ,
nodeKey ,
nodeKey ,
defaultGenesisDocProviderFunc ( con fi g ) ,
defaultGenesisDocProviderFunc ( cfg ) ,
logger ,
logger ,
)
)
}
}
var pval * privval . FilePV
var pval * privval . FilePV
if con fi g . Mode == cfg . ModeValidator {
pval , err = privval . LoadOrGenFilePV ( con fi g . PrivValidator . KeyFile ( ) , con fi g . PrivValidator . StateFile ( ) )
if cfg . Mode == con fi g . ModeValidator {
pval , err = privval . LoadOrGenFilePV ( cfg . PrivValidator . KeyFile ( ) , cfg . PrivValidator . StateFile ( ) )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -105,27 +107,27 @@ func newDefaultNode(config *cfg.Config, logger log.Logger) (service.Service, err
pval = nil
pval = nil
}
}
appClient , _ := proxy . DefaultClientCreator ( con fi g . ProxyApp , con fi g . ABCI , con fi g . DBDir ( ) )
return makeNode ( con fi g ,
appClient , _ := proxy . DefaultClientCreator ( cfg . ProxyApp , cfg . ABCI , cfg . DBDir ( ) )
return makeNode ( cfg ,
pval ,
pval ,
nodeKey ,
nodeKey ,
appClient ,
appClient ,
defaultGenesisDocProviderFunc ( con fi g ) ,
cfg . DefaultDBProvider ,
defaultGenesisDocProviderFunc ( cfg ) ,
con fi g . DefaultDBProvider ,
logger ,
logger ,
)
)
}
}
// makeNode returns a new, ready to go, Tendermint Node.
// makeNode returns a new, ready to go, Tendermint Node.
func makeNode ( con fi g * cfg . Config ,
func makeNode ( cfg * con fi g . Config ,
privValidator types . PrivValidator ,
privValidator types . PrivValidator ,
nodeKey types . NodeKey ,
nodeKey types . NodeKey ,
clientCreator abciclient . Creator ,
clientCreator abciclient . Creator ,
genesisDocProvider genesisDocProvider ,
genesisDocProvider genesisDocProvider ,
dbProvider cfg . DBProvider ,
dbProvider con fi g . DBProvider ,
logger log . Logger ) ( service . Service , error ) {
logger log . Logger ) ( service . Service , error ) {
blockStore , stateDB , err := initDBs ( con fi g , dbProvider )
blockStore , stateDB , err := initDBs ( cfg , dbProvider )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -161,31 +163,31 @@ func makeNode(config *cfg.Config,
return nil , err
return nil , err
}
}
indexerService , eventSinks , err := createAndStartIndexerService ( con fi g , dbProvider , eventBus , logger , genDoc . ChainID )
indexerService , eventSinks , err := createAndStartIndexerService ( cfg , dbProvider , eventBus , logger , genDoc . ChainID )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
// If an address is provided, listen on the socket for a connection from an
// If an address is provided, listen on the socket for a connection from an
// external signing process.
// external signing process.
if con fi g . PrivValidator . ListenAddr != "" {
protocol , _ := tmnet . ProtocolAndAddress ( con fi g . PrivValidator . ListenAddr )
if cfg . PrivValidator . ListenAddr != "" {
protocol , _ := tmnet . ProtocolAndAddress ( cfg . PrivValidator . ListenAddr )
// FIXME: we should start services inside OnStart
// FIXME: we should start services inside OnStart
switch protocol {
switch protocol {
case "grpc" :
case "grpc" :
privValidator , err = createAndStartPrivValidatorGRPCClient ( con fi g , genDoc . ChainID , logger )
privValidator , err = createAndStartPrivValidatorGRPCClient ( cfg , genDoc . ChainID , logger )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "error with private validator grpc client: %w" , err )
return nil , fmt . Errorf ( "error with private validator grpc client: %w" , err )
}
}
default :
default :
privValidator , err = createAndStartPrivValidatorSocketClient ( con fi g . PrivValidator . ListenAddr , genDoc . ChainID , logger )
privValidator , err = createAndStartPrivValidatorSocketClient ( cfg . PrivValidator . ListenAddr , genDoc . ChainID , logger )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "error with private validator socket client: %w" , err )
return nil , fmt . Errorf ( "error with private validator socket client: %w" , err )
}
}
}
}
}
}
var pubKey crypto . PubKey
var pubKey crypto . PubKey
if con fi g . Mode == cfg . ModeValidator {
if cfg . Mode == con fi g . ModeValidator {
pubKey , err = privValidator . GetPubKey ( context . TODO ( ) )
pubKey , err = privValidator . GetPubKey ( context . TODO ( ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "can't get pubkey: %w" , err )
return nil , fmt . Errorf ( "can't get pubkey: %w" , err )
@ -196,7 +198,7 @@ func makeNode(config *cfg.Config,
}
}
// Determine whether we should attempt state sync.
// Determine whether we should attempt state sync.
stateSync := con fi g . StateSync . Enable && ! onlyValidatorIsUs ( state , pubKey )
stateSync := cfg . StateSync . Enable && ! onlyValidatorIsUs ( state , pubKey )
if stateSync && state . LastBlockHeight > 0 {
if stateSync && state . LastBlockHeight > 0 {
logger . Info ( "Found local state with non-zero height, skipping state sync" )
logger . Info ( "Found local state with non-zero height, skipping state sync" )
stateSync = false
stateSync = false
@ -221,43 +223,43 @@ func makeNode(config *cfg.Config,
// Determine whether we should do block sync. This must happen after the handshake, since the
// Determine whether we should do block sync. This must happen after the handshake, since the
// app may modify the validator set, specifying ourself as the only validator.
// app may modify the validator set, specifying ourself as the only validator.
blockSync := con fi g . BlockSync . Enable && ! onlyValidatorIsUs ( state , pubKey )
blockSync := cfg . BlockSync . Enable && ! onlyValidatorIsUs ( state , pubKey )
logNodeStartupInfo ( state , pubKey , logger , consensusLogger , con fi g . Mode )
logNodeStartupInfo ( state , pubKey , logger , consensusLogger , cfg . Mode )
// TODO: Fetch and provide real options and do proper p2p bootstrapping.
// TODO: Fetch and provide real options and do proper p2p bootstrapping.
// TODO: Use a persistent peer database.
// TODO: Use a persistent peer database.
nodeInfo , err := makeNodeInfo ( con fi g , nodeKey , eventSinks , genDoc , state )
nodeInfo , err := makeNodeInfo ( cfg , nodeKey , eventSinks , genDoc , state )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
p2pLogger := logger . With ( "module" , "p2p" )
p2pLogger := logger . With ( "module" , "p2p" )
transport := createTransport ( p2pLogger , con fi g )
transport := createTransport ( p2pLogger , cfg )
peerManager , err := createPeerManager ( con fi g , dbProvider , p2pLogger , nodeKey . ID )
peerManager , err := createPeerManager ( cfg , dbProvider , p2pLogger , nodeKey . ID )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "failed to create peer manager: %w" , err )
return nil , fmt . Errorf ( "failed to create peer manager: %w" , err )
}
}
nodeMetrics :=
nodeMetrics :=
defaultMetricsProvider ( con fi g . Instrumentation ) ( genDoc . ChainID )
defaultMetricsProvider ( cfg . Instrumentation ) ( genDoc . ChainID )
router , err := createRouter ( p2pLogger , nodeMetrics . p2p , nodeInfo , nodeKey . PrivKey ,
router , err := createRouter ( p2pLogger , nodeMetrics . p2p , nodeInfo , nodeKey . PrivKey ,
peerManager , transport , getRouterConfig ( con fi g , proxyApp ) )
peerManager , transport , getRouterConfig ( cfg , proxyApp ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "failed to create router: %w" , err )
return nil , fmt . Errorf ( "failed to create router: %w" , err )
}
}
mpReactorShim , mpReactor , mp , err := createMempoolReactor (
mpReactorShim , mpReactor , mp , err := createMempoolReactor (
con fi g , proxyApp , state , nodeMetrics . mempool , peerManager , router , logger ,
cfg , proxyApp , state , nodeMetrics . mempool , peerManager , router , logger ,
)
)
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
evReactorShim , evReactor , evPool , err := createEvidenceReactor (
evReactorShim , evReactor , evPool , err := createEvidenceReactor (
con fi g , dbProvider , stateDB , blockStore , peerManager , router , logger ,
cfg , dbProvider , stateDB , blockStore , peerManager , router , logger ,
)
)
if err != nil {
if err != nil {
return nil , err
return nil , err
@ -275,16 +277,16 @@ func makeNode(config *cfg.Config,
)
)
csReactorShim , csReactor , csState := createConsensusReactor (
csReactorShim , csReactor , csState := createConsensusReactor (
con fi g , state , blockExec , blockStore , mp , evPool ,
privValidator , nodeMetrics . cs , stateSync || blockSync , eventBus ,
cfg , state , blockExec , blockStore , mp , evPool ,
privValidator , nodeMetrics . consensu s , stateSync || blockSync , eventBus ,
peerManager , router , consensusLogger ,
peerManager , router , consensusLogger ,
)
)
// Create the blockchain reactor. Note, we do not start block sync if we're
// Create the blockchain reactor. Note, we do not start block sync if we're
// doing a state sync first.
// doing a state sync first.
bcReactorShim , bcReactor , err := createBlockchainReactor (
bcReactorShim , bcReactor , err := createBlockchainReactor (
logger , con fi g , state , blockExec , blockStore , csReactor ,
peerManager , router , blockSync && ! stateSync , nodeMetrics . cs ,
logger , cfg , state , blockExec , blockStore , csReactor ,
peerManager , router , blockSync && ! stateSync , nodeMetrics . consensu s ,
)
)
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "could not create blockchain reactor: %w" , err )
return nil , fmt . Errorf ( "could not create blockchain reactor: %w" , err )
@ -301,9 +303,9 @@ func makeNode(config *cfg.Config,
// Make ConsensusReactor. Don't enable fully if doing a state sync and/or block sync first.
// Make ConsensusReactor. Don't enable fully if doing a state sync and/or block sync first.
// FIXME We need to update metrics here, since other reactors don't have access to them.
// FIXME We need to update metrics here, since other reactors don't have access to them.
if stateSync {
if stateSync {
nodeMetrics . cs . StateSyncing . Set ( 1 )
nodeMetrics . consensu s . StateSyncing . Set ( 1 )
} else if blockSync {
} else if blockSync {
nodeMetrics . cs . BlockSyncing . Set ( 1 )
nodeMetrics . consensu s . BlockSyncing . Set ( 1 )
}
}
// Set up state sync reactor, and schedule a sync if requested.
// Set up state sync reactor, and schedule a sync if requested.
@ -320,7 +322,7 @@ func makeNode(config *cfg.Config,
stateSyncReactorShim = p2p . NewReactorShim ( logger . With ( "module" , "statesync" ) , "StateSyncShim" , statesync . ChannelShims )
stateSyncReactorShim = p2p . NewReactorShim ( logger . With ( "module" , "statesync" ) , "StateSyncShim" , statesync . ChannelShims )
if con fi g . P2P . UseLegacy {
if cfg . P2P . UseLegacy {
channels = getChannelsFromShim ( stateSyncReactorShim )
channels = getChannelsFromShim ( stateSyncReactorShim )
peerUpdates = stateSyncReactorShim . PeerUpdates
peerUpdates = stateSyncReactorShim . PeerUpdates
} else {
} else {
@ -331,7 +333,7 @@ func makeNode(config *cfg.Config,
stateSyncReactor = statesync . NewReactor (
stateSyncReactor = statesync . NewReactor (
genDoc . ChainID ,
genDoc . ChainID ,
genDoc . InitialHeight ,
genDoc . InitialHeight ,
* con fi g . StateSync ,
* cfg . StateSync ,
stateSyncReactorShim . Logger ,
stateSyncReactorShim . Logger ,
proxyApp . Snapshot ( ) ,
proxyApp . Snapshot ( ) ,
proxyApp . Query ( ) ,
proxyApp . Query ( ) ,
@ -342,7 +344,7 @@ func makeNode(config *cfg.Config,
peerUpdates ,
peerUpdates ,
stateStore ,
stateStore ,
blockStore ,
blockStore ,
con fi g . StateSync . TempDir ,
cfg . StateSync . TempDir ,
nodeMetrics . statesync ,
nodeMetrics . statesync ,
)
)
@ -378,46 +380,46 @@ func makeNode(config *cfg.Config,
pexCh := pex . ChannelDescriptor ( )
pexCh := pex . ChannelDescriptor ( )
transport . AddChannelDescriptors ( [ ] * p2p . ChannelDescriptor { & pexCh } )
transport . AddChannelDescriptors ( [ ] * p2p . ChannelDescriptor { & pexCh } )
if con fi g . P2P . UseLegacy {
if cfg . P2P . UseLegacy {
// setup Transport and Switch
// setup Transport and Switch
sw = createSwitch (
sw = createSwitch (
con fi g , transport , nodeMetrics . p2p , mpReactorShim , bcReactorForSwitch ,
cfg , transport , nodeMetrics . p2p , mpReactorShim , bcReactorForSwitch ,
stateSyncReactorShim , csReactorShim , evReactorShim , proxyApp , nodeInfo , nodeKey , p2pLogger ,
stateSyncReactorShim , csReactorShim , evReactorShim , proxyApp , nodeInfo , nodeKey , p2pLogger ,
)
)
err = sw . AddPersistentPeers ( strings . SplitAndTrimEmpty ( con fi g . P2P . PersistentPeers , "," , " " ) )
err = sw . AddPersistentPeers ( strings . SplitAndTrimEmpty ( cfg . P2P . PersistentPeers , "," , " " ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "could not add peers from persistent-peers field: %w" , err )
return nil , fmt . Errorf ( "could not add peers from persistent-peers field: %w" , err )
}
}
err = sw . AddUnconditionalPeerIDs ( strings . SplitAndTrimEmpty ( con fi g . P2P . UnconditionalPeerIDs , "," , " " ) )
err = sw . AddUnconditionalPeerIDs ( strings . SplitAndTrimEmpty ( cfg . P2P . UnconditionalPeerIDs , "," , " " ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "could not add peer ids from unconditional_peer_ids field: %w" , err )
return nil , fmt . Errorf ( "could not add peer ids from unconditional_peer_ids field: %w" , err )
}
}
addrBook , err = createAddrBookAndSetOnSwitch ( con fi g , sw , p2pLogger , nodeKey )
addrBook , err = createAddrBookAndSetOnSwitch ( cfg , sw , p2pLogger , nodeKey )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "could not create addrbook: %w" , err )
return nil , fmt . Errorf ( "could not create addrbook: %w" , err )
}
}
pexReactor = createPEXReactorAndAddToSwitch ( addrBook , con fi g , sw , logger )
pexReactor = createPEXReactorAndAddToSwitch ( addrBook , cfg , sw , logger )
} else {
} else {
addrBook = nil
addrBook = nil
pexReactor , err = createPEXReactorV2 ( con fi g , logger , peerManager , router )
pexReactor , err = createPEXReactorV2 ( cfg , logger , peerManager , router )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
}
}
if con fi g . RPC . PprofListenAddress != "" {
if cfg . RPC . PprofListenAddress != "" {
go func ( ) {
go func ( ) {
logger . Info ( "Starting pprof server" , "laddr" , con fi g . RPC . PprofListenAddress )
logger . Error ( "pprof server error" , "err" , http . ListenAndServe ( con fi g . RPC . PprofListenAddress , nil ) )
logger . Info ( "Starting pprof server" , "laddr" , cfg . RPC . PprofListenAddress )
logger . Error ( "pprof server error" , "err" , http . ListenAndServe ( cfg . RPC . PprofListenAddress , nil ) )
} ( )
} ( )
}
}
node := & nodeImpl {
node := & nodeImpl {
config : con fi g ,
config : cfg ,
genesisDoc : genDoc ,
genesisDoc : genDoc ,
privValidator : privValidator ,
privValidator : privValidator ,
@ -452,7 +454,7 @@ func makeNode(config *cfg.Config,
ConsensusState : csState ,
ConsensusState : csState ,
ConsensusReactor : csReactor ,
ConsensusReactor : csReactor ,
BlockSyncReactor : bcReactor . ( cs . BlockSyncReactor ) ,
BlockSyncReactor : bcReactor . ( consensu s . BlockSyncReactor ) ,
P2PPeers : sw ,
P2PPeers : sw ,
PeerManager : peerManager ,
PeerManager : peerManager ,
@ -462,7 +464,7 @@ func makeNode(config *cfg.Config,
EventBus : eventBus ,
EventBus : eventBus ,
Mempool : mp ,
Mempool : mp ,
Logger : logger . With ( "module" , "rpc" ) ,
Logger : logger . With ( "module" , "rpc" ) ,
Config : * con fi g . RPC ,
Config : * cfg . RPC ,
} ,
} ,
}
}
@ -485,8 +487,8 @@ func makeNode(config *cfg.Config,
}
}
// makeSeedNode returns a new seed node, containing only p2p, pex reactor
// makeSeedNode returns a new seed node, containing only p2p, pex reactor
func makeSeedNode ( con fi g * cfg . Config ,
dbProvider cfg . DBProvider ,
func makeSeedNode ( cfg * con fi g . Config ,
dbProvider con fi g . DBProvider ,
nodeKey types . NodeKey ,
nodeKey types . NodeKey ,
genesisDocProvider genesisDocProvider ,
genesisDocProvider genesisDocProvider ,
logger log . Logger ,
logger log . Logger ,
@ -502,23 +504,23 @@ func makeSeedNode(config *cfg.Config,
return nil , err
return nil , err
}
}
nodeInfo , err := makeSeedNodeInfo ( con fi g , nodeKey , genDoc , state )
nodeInfo , err := makeSeedNodeInfo ( cfg , nodeKey , genDoc , state )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
// Setup Transport and Switch.
// Setup Transport and Switch.
p2pMetrics := p2p . PrometheusMetrics ( con fi g . Instrumentation . Namespace , "chain_id" , genDoc . ChainID )
p2pMetrics := p2p . PrometheusMetrics ( cfg . Instrumentation . Namespace , "chain_id" , genDoc . ChainID )
p2pLogger := logger . With ( "module" , "p2p" )
p2pLogger := logger . With ( "module" , "p2p" )
transport := createTransport ( p2pLogger , con fi g )
transport := createTransport ( p2pLogger , cfg )
peerManager , err := createPeerManager ( con fi g , dbProvider , p2pLogger , nodeKey . ID )
peerManager , err := createPeerManager ( cfg , dbProvider , p2pLogger , nodeKey . ID )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "failed to create peer manager: %w" , err )
return nil , fmt . Errorf ( "failed to create peer manager: %w" , err )
}
}
router , err := createRouter ( p2pLogger , p2pMetrics , nodeInfo , nodeKey . PrivKey ,
router , err := createRouter ( p2pLogger , p2pMetrics , nodeInfo , nodeKey . PrivKey ,
peerManager , transport , getRouterConfig ( con fi g , nil ) )
peerManager , transport , getRouterConfig ( cfg , nil ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "failed to create router: %w" , err )
return nil , fmt . Errorf ( "failed to create router: %w" , err )
}
}
@ -536,44 +538,44 @@ func makeSeedNode(config *cfg.Config,
pexCh := pex . ChannelDescriptor ( )
pexCh := pex . ChannelDescriptor ( )
transport . AddChannelDescriptors ( [ ] * p2p . ChannelDescriptor { & pexCh } )
transport . AddChannelDescriptors ( [ ] * p2p . ChannelDescriptor { & pexCh } )
if con fi g . P2P . UseLegacy {
if cfg . P2P . UseLegacy {
sw = createSwitch (
sw = createSwitch (
con fi g , transport , p2pMetrics , nil , nil ,
cfg , transport , p2pMetrics , nil , nil ,
nil , nil , nil , nil , nodeInfo , nodeKey , p2pLogger ,
nil , nil , nil , nil , nodeInfo , nodeKey , p2pLogger ,
)
)
err = sw . AddPersistentPeers ( strings . SplitAndTrimEmpty ( con fi g . P2P . PersistentPeers , "," , " " ) )
err = sw . AddPersistentPeers ( strings . SplitAndTrimEmpty ( cfg . P2P . PersistentPeers , "," , " " ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "could not add peers from persistent_peers field: %w" , err )
return nil , fmt . Errorf ( "could not add peers from persistent_peers field: %w" , err )
}
}
err = sw . AddUnconditionalPeerIDs ( strings . SplitAndTrimEmpty ( con fi g . P2P . UnconditionalPeerIDs , "," , " " ) )
err = sw . AddUnconditionalPeerIDs ( strings . SplitAndTrimEmpty ( cfg . P2P . UnconditionalPeerIDs , "," , " " ) )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "could not add peer ids from unconditional_peer_ids field: %w" , err )
return nil , fmt . Errorf ( "could not add peer ids from unconditional_peer_ids field: %w" , err )
}
}
addrBook , err = createAddrBookAndSetOnSwitch ( con fi g , sw , p2pLogger , nodeKey )
addrBook , err = createAddrBookAndSetOnSwitch ( cfg , sw , p2pLogger , nodeKey )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "could not create addrbook: %w" , err )
return nil , fmt . Errorf ( "could not create addrbook: %w" , err )
}
}
pexReactor = createPEXReactorAndAddToSwitch ( addrBook , con fi g , sw , logger )
pexReactor = createPEXReactorAndAddToSwitch ( addrBook , cfg , sw , logger )
} else {
} else {
pexReactor , err = createPEXReactorV2 ( con fi g , logger , peerManager , router )
pexReactor , err = createPEXReactorV2 ( cfg , logger , peerManager , router )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
}
}
if con fi g . RPC . PprofListenAddress != "" {
if cfg . RPC . PprofListenAddress != "" {
go func ( ) {
go func ( ) {
logger . Info ( "Starting pprof server" , "laddr" , con fi g . RPC . PprofListenAddress )
logger . Error ( "pprof server error" , "err" , http . ListenAndServe ( con fi g . RPC . PprofListenAddress , nil ) )
logger . Info ( "Starting pprof server" , "laddr" , cfg . RPC . PprofListenAddress )
logger . Error ( "pprof server error" , "err" , http . ListenAndServe ( cfg . RPC . PprofListenAddress , nil ) )
} ( )
} ( )
}
}
node := & nodeImpl {
node := & nodeImpl {
config : con fi g ,
config : cfg ,
genesisDoc : genDoc ,
genesisDoc : genDoc ,
transport : transport ,
transport : transport ,
@ -602,7 +604,7 @@ func (n *nodeImpl) OnStart() error {
// Start the RPC server before the P2P server
// Start the RPC server before the P2P server
// so we can eg. receive txs for the first block
// so we can eg. receive txs for the first block
if n . config . RPC . ListenAddress != "" && n . config . Mode != cfg . ModeSeed {
if n . config . RPC . ListenAddress != "" && n . config . Mode != con fi g . ModeSeed {
listeners , err := n . startRPC ( )
listeners , err := n . startRPC ( )
if err != nil {
if err != nil {
return err
return err
@ -637,8 +639,8 @@ func (n *nodeImpl) OnStart() error {
return err
return err
}
}
if n . config . Mode != cfg . ModeSeed {
if n . config . BlockSync . Version == cfg . BlockSyncV0 {
if n . config . Mode != con fi g . ModeSeed {
if n . config . BlockSync . Version == con fi g . BlockSyncV0 {
if err := n . bcReactor . Start ( ) ; err != nil {
if err := n . bcReactor . Start ( ) ; err != nil {
return err
return err
}
}
@ -679,7 +681,7 @@ func (n *nodeImpl) OnStart() error {
// TODO: We shouldn't run state sync if we already have state that has a
// TODO: We shouldn't run state sync if we already have state that has a
// LastBlockHeight that is not InitialHeight
// LastBlockHeight that is not InitialHeight
if n . stateSync {
if n . stateSync {
bcR , ok := n . bcReactor . ( cs . BlockSyncReactor )
bcR , ok := n . bcReactor . ( consensu s . BlockSyncReactor )
if ! ok {
if ! ok {
return fmt . Errorf ( "this blockchain reactor does not support switching from state sync" )
return fmt . Errorf ( "this blockchain reactor does not support switching from state sync" )
}
}
@ -758,9 +760,9 @@ func (n *nodeImpl) OnStop() {
n . Logger . Error ( "Error closing indexerService" , "err" , err )
n . Logger . Error ( "Error closing indexerService" , "err" , err )
}
}
if n . config . Mode != cfg . ModeSeed {
if n . config . Mode != con fi g . ModeSeed {
// now stop the reactors
// now stop the reactors
if n . config . BlockSync . Version == cfg . BlockSyncV0 {
if n . config . BlockSync . Version == con fi g . BlockSyncV0 {
// Stop the real blockchain reactor separately since the switch uses the shim.
// Stop the real blockchain reactor separately since the switch uses the shim.
if err := n . bcReactor . Stop ( ) ; err != nil {
if err := n . bcReactor . Stop ( ) ; err != nil {
n . Logger . Error ( "failed to stop the blockchain reactor" , "err" , err )
n . Logger . Error ( "failed to stop the blockchain reactor" , "err" , err )
@ -831,7 +833,7 @@ func (n *nodeImpl) OnStop() {
}
}
func ( n * nodeImpl ) startRPC ( ) ( [ ] net . Listener , error ) {
func ( n * nodeImpl ) startRPC ( ) ( [ ] net . Listener , error ) {
if n . config . Mode == cfg . ModeValidator {
if n . config . Mode == con fi g . ModeValidator {
pubKey , err := n . privValidator . GetPubKey ( context . TODO ( ) )
pubKey , err := n . privValidator . GetPubKey ( context . TODO ( ) )
if pubKey == nil || err != nil {
if pubKey == nil || err != nil {
return nil , fmt . Errorf ( "can't get pubkey: %w" , err )
return nil , fmt . Errorf ( "can't get pubkey: %w" , err )
@ -849,15 +851,15 @@ func (n *nodeImpl) startRPC() ([]net.Listener, error) {
n . rpcEnv . AddUnsafe ( routes )
n . rpcEnv . AddUnsafe ( routes )
}
}
con fi g := rpcserver . DefaultConfig ( )
con fi g . MaxBodyBytes = n . config . RPC . MaxBodyBytes
con fi g . MaxHeaderBytes = n . config . RPC . MaxHeaderBytes
con fi g . MaxOpenConnections = n . config . RPC . MaxOpenConnections
cfg := rpcserver . DefaultConfig ( )
cfg . MaxBodyBytes = n . config . RPC . MaxBodyBytes
cfg . MaxHeaderBytes = n . config . RPC . MaxHeaderBytes
cfg . MaxOpenConnections = n . config . RPC . MaxOpenConnections
// If necessary adjust global WriteTimeout to ensure it's greater than
// If necessary adjust global WriteTimeout to ensure it's greater than
// TimeoutBroadcastTxCommit.
// TimeoutBroadcastTxCommit.
// See https://github.com/tendermint/tendermint/issues/3435
// See https://github.com/tendermint/tendermint/issues/3435
if con fi g . WriteTimeout <= n . config . RPC . TimeoutBroadcastTxCommit {
con fi g . WriteTimeout = n . config . RPC . TimeoutBroadcastTxCommit + 1 * time . Second
if cfg . WriteTimeout <= n . config . RPC . TimeoutBroadcastTxCommit {
cfg . WriteTimeout = n . config . RPC . TimeoutBroadcastTxCommit + 1 * time . Second
}
}
// we may expose the rpc over both a unix and tcp socket
// we may expose the rpc over both a unix and tcp socket
@ -873,14 +875,14 @@ func (n *nodeImpl) startRPC() ([]net.Listener, error) {
wmLogger . Error ( "Failed to unsubscribe addr from events" , "addr" , remoteAddr , "err" , err )
wmLogger . Error ( "Failed to unsubscribe addr from events" , "addr" , remoteAddr , "err" , err )
}
}
} ) ,
} ) ,
rpcserver . ReadLimit ( con fi g . MaxBodyBytes ) ,
rpcserver . ReadLimit ( cfg . MaxBodyBytes ) ,
)
)
wm . SetLogger ( wmLogger )
wm . SetLogger ( wmLogger )
mux . HandleFunc ( "/websocket" , wm . WebsocketHandler )
mux . HandleFunc ( "/websocket" , wm . WebsocketHandler )
rpcserver . RegisterRPCFuncs ( mux , routes , rpcLogger )
rpcserver . RegisterRPCFuncs ( mux , routes , rpcLogger )
listener , err := rpcserver . Listen (
listener , err := rpcserver . Listen (
listenAddr ,
listenAddr ,
con fi g . MaxOpenConnections ,
cfg . MaxOpenConnections ,
)
)
if err != nil {
if err != nil {
return nil , err
return nil , err
@ -903,7 +905,7 @@ func (n *nodeImpl) startRPC() ([]net.Listener, error) {
n . config . RPC . CertFile ( ) ,
n . config . RPC . CertFile ( ) ,
n . config . RPC . KeyFile ( ) ,
n . config . RPC . KeyFile ( ) ,
rpcLogger ,
rpcLogger ,
con fi g ,
cfg ,
) ; err != nil {
) ; err != nil {
n . Logger . Error ( "Error serving server with TLS" , "err" , err )
n . Logger . Error ( "Error serving server with TLS" , "err" , err )
}
}
@ -914,7 +916,7 @@ func (n *nodeImpl) startRPC() ([]net.Listener, error) {
listener ,
listener ,
rootHandler ,
rootHandler ,
rpcLogger ,
rpcLogger ,
con fi g ,
cfg ,
) ; err != nil {
) ; err != nil {
n . Logger . Error ( "Error serving server" , "err" , err )
n . Logger . Error ( "Error serving server" , "err" , err )
}
}
@ -927,18 +929,18 @@ func (n *nodeImpl) startRPC() ([]net.Listener, error) {
// we expose a simplified api over grpc for convenience to app devs
// we expose a simplified api over grpc for convenience to app devs
grpcListenAddr := n . config . RPC . GRPCListenAddress
grpcListenAddr := n . config . RPC . GRPCListenAddress
if grpcListenAddr != "" {
if grpcListenAddr != "" {
con fi g := rpcserver . DefaultConfig ( )
con fi g . MaxBodyBytes = n . config . RPC . MaxBodyBytes
con fi g . MaxHeaderBytes = n . config . RPC . MaxHeaderBytes
cfg := rpcserver . DefaultConfig ( )
cfg . MaxBodyBytes = n . config . RPC . MaxBodyBytes
cfg . MaxHeaderBytes = n . config . RPC . MaxHeaderBytes
// NOTE: GRPCMaxOpenConnections is used, not MaxOpenConnections
// NOTE: GRPCMaxOpenConnections is used, not MaxOpenConnections
con fi g . MaxOpenConnections = n . config . RPC . GRPCMaxOpenConnections
cfg . MaxOpenConnections = n . config . RPC . GRPCMaxOpenConnections
// If necessary adjust global WriteTimeout to ensure it's greater than
// If necessary adjust global WriteTimeout to ensure it's greater than
// TimeoutBroadcastTxCommit.
// TimeoutBroadcastTxCommit.
// See https://github.com/tendermint/tendermint/issues/3435
// See https://github.com/tendermint/tendermint/issues/3435
if con fi g . WriteTimeout <= n . config . RPC . TimeoutBroadcastTxCommit {
con fi g . WriteTimeout = n . config . RPC . TimeoutBroadcastTxCommit + 1 * time . Second
if cfg . WriteTimeout <= n . config . RPC . TimeoutBroadcastTxCommit {
cfg . WriteTimeout = n . config . RPC . TimeoutBroadcastTxCommit + 1 * time . Second
}
}
listener , err := rpcserver . Listen ( grpcListenAddr , con fi g . MaxOpenConnections )
listener , err := rpcserver . Listen ( grpcListenAddr , cfg . MaxOpenConnections )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -977,7 +979,7 @@ func (n *nodeImpl) startPrometheusServer(addr string) *http.Server {
}
}
// ConsensusReactor returns the Node's ConsensusReactor.
// ConsensusReactor returns the Node's ConsensusReactor.
func ( n * nodeImpl ) ConsensusReactor ( ) * cs . Reactor {
func ( n * nodeImpl ) ConsensusReactor ( ) * consensu s . Reactor {
return n . consensusReactor
return n . consensusReactor
}
}
@ -1031,14 +1033,14 @@ type genesisDocProvider func() (*types.GenesisDoc, error)
// defaultGenesisDocProviderFunc returns a GenesisDocProvider that loads
// defaultGenesisDocProviderFunc returns a GenesisDocProvider that loads
// the GenesisDoc from the config.GenesisFile() on the filesystem.
// the GenesisDoc from the config.GenesisFile() on the filesystem.
func defaultGenesisDocProviderFunc ( con fi g * cfg . Config ) genesisDocProvider {
func defaultGenesisDocProviderFunc ( cfg * con fi g . Config ) genesisDocProvider {
return func ( ) ( * types . GenesisDoc , error ) {
return func ( ) ( * types . GenesisDoc , error ) {
return types . GenesisDocFromFile ( con fi g . GenesisFile ( ) )
return types . GenesisDocFromFile ( cfg . GenesisFile ( ) )
}
}
}
}
type nodeMetrics struct {
type nodeMetrics struct {
cs * cs . Metrics
consensu s * consensu s . Metrics
p2p * p2p . Metrics
p2p * p2p . Metrics
mempool * mempool . Metrics
mempool * mempool . Metrics
state * sm . Metrics
state * sm . Metrics
@ -1050,19 +1052,19 @@ type metricsProvider func(chainID string) *nodeMetrics
// defaultMetricsProvider returns Metrics build using Prometheus client library
// defaultMetricsProvider returns Metrics build using Prometheus client library
// if Prometheus is enabled. Otherwise, it returns no-op Metrics.
// if Prometheus is enabled. Otherwise, it returns no-op Metrics.
func defaultMetricsProvider ( con fi g * cfg . InstrumentationConfig ) metricsProvider {
func defaultMetricsProvider ( cfg * con fi g . InstrumentationConfig ) metricsProvider {
return func ( chainID string ) * nodeMetrics {
return func ( chainID string ) * nodeMetrics {
if con fi g . Prometheus {
if cfg . Prometheus {
return & nodeMetrics {
return & nodeMetrics {
cs . PrometheusMetrics ( con fi g . Namespace , "chain_id" , chainID ) ,
p2p . PrometheusMetrics ( con fi g . Namespace , "chain_id" , chainID ) ,
mempool . PrometheusMetrics ( con fi g . Namespace , "chain_id" , chainID ) ,
sm . PrometheusMetrics ( con fi g . Namespace , "chain_id" , chainID ) ,
statesync . PrometheusMetrics ( con fi g . Namespace , "chain_id" , chainID ) ,
consensu s . PrometheusMetrics ( cfg . Namespace , "chain_id" , chainID ) ,
p2p . PrometheusMetrics ( cfg . Namespace , "chain_id" , chainID ) ,
mempool . PrometheusMetrics ( cfg . Namespace , "chain_id" , chainID ) ,
sm . PrometheusMetrics ( cfg . Namespace , "chain_id" , chainID ) ,
statesync . PrometheusMetrics ( cfg . Namespace , "chain_id" , chainID ) ,
}
}
}
}
return & nodeMetrics {
return & nodeMetrics {
cs . NopMetrics ( ) ,
consensu s . NopMetrics ( ) ,
p2p . NopMetrics ( ) ,
p2p . NopMetrics ( ) ,
mempool . NopMetrics ( ) ,
mempool . NopMetrics ( ) ,
sm . NopMetrics ( ) ,
sm . NopMetrics ( ) ,
@ -1130,15 +1132,15 @@ func createAndStartPrivValidatorSocketClient(
}
}
func createAndStartPrivValidatorGRPCClient (
func createAndStartPrivValidatorGRPCClient (
con fi g * cfg . Config ,
cfg * con fi g . Config ,
chainID string ,
chainID string ,
logger log . Logger ,
logger log . Logger ,
) ( types . PrivValidator , error ) {
) ( types . PrivValidator , error ) {
pvsc , err := tmgrpc . DialRemoteSigner (
pvsc , err := tmgrpc . DialRemoteSigner (
con fi g . PrivValidator ,
cfg . PrivValidator ,
chainID ,
chainID ,
logger ,
logger ,
con fi g . Instrumentation . Prometheus ,
cfg . Instrumentation . Prometheus ,
)
)
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "failed to start private validator: %w" , err )
return nil , fmt . Errorf ( "failed to start private validator: %w" , err )
@ -1153,7 +1155,7 @@ func createAndStartPrivValidatorGRPCClient(
return pvsc , nil
return pvsc , nil
}
}
func getRouterConfig ( conf * cfg . Config , proxyApp proxy . AppConns ) p2p . RouterOptions {
func getRouterConfig ( conf * con fi g . Config , proxyApp proxy . AppConns ) p2p . RouterOptions {
opts := p2p . RouterOptions {
opts := p2p . RouterOptions {
QueueType : conf . P2P . QueueType ,
QueueType : conf . P2P . QueueType ,
}
}