From 5f2f97548f8714e05f5dae877ea2972d3e074187 Mon Sep 17 00:00:00 2001 From: dongsamb Date: Wed, 22 Jan 2020 16:03:05 +0900 Subject: [PATCH] adr: ADR-052: Tendermint Mode (#4302) * Separate ADR Tendermint Mode from ADR-051 * Update docs/architecture/adr-052-tendermint-mode.md Co-Authored-By: Anton Kaliaev * Apply suggestions from code review Co-Authored-By: Marko * Apply suggestions from code review Co-Authored-By: Marko * remove line of mode info of rpc * Add link to ADR table of contents Co-authored-by: Anton Kaliaev Co-authored-by: Marko Fullnode mode : fullnode mode does not have any capability to participate on consensus 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 mode only for maintain an address book, p2p like TenderSeed Separate ADR Tendermint Mode from ADR-051 #4262 --- docs/architecture/README.md | 1 + docs/architecture/adr-052-tendermint-mode.md | 81 ++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 docs/architecture/adr-052-tendermint-mode.md diff --git a/docs/architecture/README.md b/docs/architecture/README.md index cc507ae78..d29a49c81 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -64,3 +64,4 @@ Note the context/background should be written in the present tense. - [ADR-039-Peer-Behaviour](./adr-039-peer-behaviour.md) - [ADR-041-Proposer-Selection-via-ABCI](./adr-041-proposer-selection-via-abci.md) - [ADR-043-Blockchain-RiRi-Org](./adr-043-blockchain-riri-org.md) +- [ADR-052-Tendermint-Mode](./adr-052-tendermint-mode.md) diff --git a/docs/architecture/adr-052-tendermint-mode.md b/docs/architecture/adr-052-tendermint-mode.md new file mode 100644 index 000000000..edf217a06 --- /dev/null +++ b/docs/architecture/adr-052-tendermint-mode.md @@ -0,0 +1,81 @@ +# ADR 052: Tendermint Mode + +## Changelog + +* 27-11-2019: Initial draft from ADR-051 +* 13-01-2020: Separate ADR Tendermint Mode from ADR-051 + +## Context + +- Fullnode mode: fullnode 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 mode maintaining an address book, p2p like [TenderSeed](https://gitlab.com/polychainlabs/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 + - fullnode *(default)* + - switch, transport + - reactors + - mempool + - consensus + - evidence + - blockchain + - p2p/pex + - rpc (safe connections only) + - *~~no privValidator(priv_validator_key.json, priv_validator_state.json)~~* + - validator + - switch, transport + - reactors + - mempool + - consensus + - evidence + - blockchain +  - p2p/pex + - 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 node --mode validator` in cli + - fullnode | validator | seed (default: "fullnode") +- RPC modification + - `host:26657/status` + - return empty `validator_info` when fullnode mode + - no rpc server in seed mode +- 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==fullnode`, 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 version of `node/node.go:NewNode`) + - Need to add exception routine for `nil` `reactor`, `component` to related functions + +## Status + +Proposed + +## 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](https://github.com/tendermint/tendermint/issues/2237) : Tendermint "mode" +- [TenderSeed](https://gitlab.com/polychainlabs/tenderseed) : A lightweight Tendermint Seed Node.