mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-24 14:22:16 +00:00
ADR 045 - ABCI Evidence (#4010)
* ADR 045: ABCI Evidnce Handling * add link to abci evidence defn * remove debug line
This commit is contained in:
parent
a81aa14b06
commit
b065b8a0c5
140
docs/architecture/adr-045-abci-evidence.md
Normal file
140
docs/architecture/adr-045-abci-evidence.md
Normal file
@ -0,0 +1,140 @@
|
||||
# ADR 45 - ABCI Evidence Handling
|
||||
|
||||
## Changelog
|
||||
* 21-09-2019: Initial draft
|
||||
|
||||
## Context
|
||||
|
||||
Evidence is a distinct component in a Tendermint block and has it's own reactor
|
||||
for high priority gossipping. Currently, Tendermint supports only a single form of evidence, an explicit
|
||||
equivocation, where a validator signs conflicting blocks at the same
|
||||
height/round. It is detected in real-time in the consensus reactor, and gossiped
|
||||
through the evidence reactor. Evidence can also be submitted through the RPC.
|
||||
|
||||
Currently, Tendermint does not gracefully handle a fork on the main chain.
|
||||
If a fork is detected, the node panics. At this point manual intervention and
|
||||
social consensus are required to reconfigure. We'd like to do something more
|
||||
graceful here, but that's for another day.
|
||||
|
||||
It's possible to fool lite clients without there being a fork on the
|
||||
main chain - so called Fork-Lite. See the
|
||||
[fork accountability](https://github.com/tendermint/tendermint/blob/master/docs/spec/consensus/fork-accountability.md)
|
||||
document for more details. For a sequential lite client, this can happen via
|
||||
equivocation or amnesia attacks. For a skipping lite client this can also happen
|
||||
via lunatic validator attacks. There must be some way for applications to punish
|
||||
all forms of misbehaviour.
|
||||
|
||||
The essential question is whether Tendermint should manage the evidence
|
||||
verification, or whether it should treat evidence more like a transaction (ie.
|
||||
arbitrary bytes) and let the application handle it (including all the signature
|
||||
checking).
|
||||
|
||||
Currently, evidence verification is handled by Tendermint. Once committed,
|
||||
[evidence is passed over
|
||||
ABCI](https://github.com/tendermint/tendermint/blob/master/abci/types/types.proto#L321)
|
||||
in BeginBlock in a reduced form that includes only
|
||||
the type of evidence, its height and timestamp, the validator it's from, and the
|
||||
total voting power of the validator set at the height. The app trusts Tendermint
|
||||
to perform the evidence verification, as the ABCI evidence does not contain the
|
||||
signatures and additional data for the app to verify itself.
|
||||
|
||||
Arguments in favor of leaving evidence handling in Tendermint:
|
||||
|
||||
1) Attacks on full nodes must be detectable by full nodes in real time, ie. within the consensus reactor.
|
||||
So at the very least, any evidence involved in something that could fool a full
|
||||
node must be handled natively by Tendermint as there would otherwise be no way
|
||||
for the ABCI app to detect it (ie. we don't send all votes we receive during
|
||||
consensus to the app ... ).
|
||||
|
||||
2) Amensia attacks can not be easily detected - they require an interactive
|
||||
protocol among all the validators to submit justification for their past
|
||||
votes. Our best notion of [how to do this
|
||||
currently](https://github.com/tendermint/tendermint/blob/c67154232ca8be8f5c21dff65d154127adc4f7bb/docs/spec/consensus/fork-detection.md)
|
||||
is via a centralized
|
||||
monitor service that is trusted for liveness to aggregate data from
|
||||
current and past validators, but which produces a proof of misbehaviour (ie.
|
||||
via amnesia) that can be verified by anyone, including the blockchain.
|
||||
Validators must submit all the votes they saw for the relevant consensus
|
||||
height to justify their precommits. This is quite specific to the Tendermint
|
||||
protocol and may change if the protocol is upgraded. Hence it would be awkward
|
||||
to co-ordinate this from the app.
|
||||
|
||||
3) Evidence gossipping is similar to tx gossipping, but it should be higher
|
||||
priority. Since the mempool does not support any notion of priority yet,
|
||||
evidence is gossipped through a distinct Evidence reactor. If we just treated
|
||||
evidence like any other transaction, leaving it entirely to the application,
|
||||
Tendermint would have no way to know how to prioritize it, unless/until we
|
||||
significantly upgrade the mempool. Thus we would need to continue to treat evidence
|
||||
distinctly and update the ABCI to either support sending Evidence through
|
||||
CheckTx/DeliverTx, or to introduce new CheckEvidence/DeliverEvidence methods.
|
||||
In either case we'd need to make more changes to ABCI then if Tendermint
|
||||
handled things and we just added support for another evidence type that could be included
|
||||
in BeginBlock.
|
||||
|
||||
4) All ABCI application frameworks will benefit from most of the heavy lifting
|
||||
being handled by Tendermint, rather than each of them needing to re-implement
|
||||
all the evidence verification logic in each language.
|
||||
|
||||
Arguments in favor of moving evidence handling to the application:
|
||||
|
||||
5) Skipping lite clients require us to track the set of all validators that were
|
||||
bonded over some period in case validators that are unbonding but still
|
||||
slashable sign invalid headers to fool lite clients. The Cosmos-SDK
|
||||
staking/slashing modules track this, as it's used for slashing.
|
||||
Tendermint does not currently track this, though it does keep track of the
|
||||
validator set at every height. This leans in favour of managing evidence in
|
||||
the app to avoid redundantly managing the historical validator set data in
|
||||
Tendermint
|
||||
|
||||
6) Applications supporting cross-chain validation will be required to process
|
||||
evidence from other chains. This data will come in the form of a transaction,
|
||||
but it means the app will be required to have all the functionality to process
|
||||
evidence, even if the evidence for its own chain is handled directly by
|
||||
Tendermint.
|
||||
|
||||
7) Evidence from lite clients may be large and constitute some form of DoS
|
||||
vector against full nodes. Putting it in transactions allows it to engage the application's fee
|
||||
mechanism to pay for cost of executions in the event the evidence is false.
|
||||
This means the evidence submitter must be able to afford the fees for the
|
||||
submission, but of course it should be refunded if the evidence is valid.
|
||||
That said, the burden is mostly on full nodes, which don't necessarily benefit
|
||||
from fees.
|
||||
|
||||
|
||||
## Decision
|
||||
|
||||
The above mostly seems to suggest that evidence detection belongs in Tendermint.
|
||||
(5) does not impose particularly large obligations on Tendermint and (6) just
|
||||
means the app can use Tendermint libraries. That said, (7) is potentially
|
||||
cause for some concern, though it could still attack full nodes that weren't associated with validators
|
||||
(ie. that don't benefit from fees). This could be handled out of band, for instance by
|
||||
full nodes offering the light client service via payment channels or via some
|
||||
other payment service. This can also be mitigated by banning client IPs if they
|
||||
send bad data. Note the burden is on the client to actually send us a lot of
|
||||
data in the first place.
|
||||
|
||||
A separate ADR will describe how Tendermint will handle these new forms of
|
||||
evidence, in terms of how it will engage the monitoring protocol described in
|
||||
the [fork
|
||||
detection](https://github.com/tendermint/tendermint/blob/c67154232ca8be8f5c21dff65d154127adc4f7bb/docs/spec/consensus/fork-detection.md) document,
|
||||
and how it will track past validators and manage DoS issues.
|
||||
|
||||
## Status
|
||||
|
||||
Proposed.
|
||||
|
||||
## Consequences
|
||||
|
||||
### Positive
|
||||
|
||||
- No real changes to ABCI
|
||||
- Tendermint handles evidence for all apps
|
||||
|
||||
### Neutral
|
||||
|
||||
- Need to be careful about denial of service on the Tendermint RPC
|
||||
|
||||
### Negative
|
||||
|
||||
- Tendermint duplicates data by tracking all pubkeys that were validators during
|
||||
the unbonding period
|
Loading…
x
Reference in New Issue
Block a user