ADR 052: Tendermint Mode
Changelog
- 27-11-2019: Initial draft from ADR-051
- 13-01-2020: Separate ADR Tendermint Mode from ADR-051
- 29-03-2021: Update info regarding defaults
Context
- Full mode: full mode does not have the capability to become a validator.
- Validator mode : this mode is exactly same as existing state machine behavior. sync without voting on consensus, and participate consensus when fully synced
- Seed mode : lightweight seed node maintaining an address book, p2p like TenderSeed
Decision
We would like to suggest a simple Tendermint mode abstraction. These modes will live under one binary, and when initializing a node the user will be able to specify which node they would like to create.
- Which reactor, component to include for each node
- full
- switch, transport
- reactors
- mempool
- consensus
- evidence
- blockchain
- p2p/pex
- statesync
- rpc (safe connections only)
no privValidator(priv_validator_key.json, priv_validator_state.json)
- validator
- switch, transport
- reactors
- mempool
- consensus
- evidence
- blockchain
- p2p/pex
- statesync
- rpc (safe connections only)
- with privValidator(priv_validator_key.json, priv_validator_state.json)
- seed
- switch, transport
- reactor
- Configuration, cli command
- We would like to suggest by introducing
mode
parameter in config.toml
and cli
mode = "{{ .BaseConfig.Mode }}"
in config.toml
tendermint start --mode validator
in cli
- full | validator | seednode
- There will be no default. Users will need to specify when they run
tendermint init
- RPC modification
host:26657/status
- return empty
validator_info
when in full mode
- no rpc server in seednode
- Where to modify in codebase
- Add switch for
config.Mode
on node/node.go:DefaultNewNode
- If
config.Mode==validator
, call default NewNode
(current logic)
- If
config.Mode==full
, call NewNode
with nil
privValidator
(do not load or generation)
- Need to add exception routine for
nil
privValidator
to related functions
- If
config.Mode==seed
, call NewSeedNode
(seed node version of node/node.go:NewNode
)
- Need to add exception routine for
nil
reactor
, component
to related functions
Status
Implemented
Consequences
Positive
- Node operators can choose mode when they run state machine according to the purpose of the node.
- Mode can prevent mistakes because users have to specify which mode they want to run via flag. (eg. If a user want to run a validator node, she/he should explicitly write down validator as mode)
- Different mode needs different reactors, resulting in efficient resource usage.
Negative
- Users need to study how each mode operate and which capability it has.
Neutral
References
- Issue #2237 : Tendermint "mode"
- TenderSeed : A lightweight Tendermint Seed Node.