mukan-consensus/docs/architecture/tendermint-core/adr-052-tendermint-mode.md
Mukan Erkin Törük ef24c0b67e
Some checks are pending
docker-build-cometbft / vars (push) Waiting to run
docker-build-cometbft / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-cometbft / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-cometbft / merge-images (push) Blocked by required conditions
docker-build-e2e-node / vars (push) Waiting to run
docker-build-e2e-node / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-e2e-node / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-e2e-node / merge-images (push) Blocked by required conditions
initial: sovereign Mukan Network fork
2026-05-11 03:18:27 +03:00

3.2 KiB

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
        • p2p/pex
  • 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.