cosmos-sdk/docs/spec/slashing/02_state.md

55 lines
2.7 KiB
Markdown
Raw Normal View History

2018-08-20 09:28:40 -07:00
# State
2018-05-23 12:42:37 -07:00
2018-08-20 09:28:40 -07:00
## Signing Info
2018-05-23 12:42:37 -07:00
Every block includes a set of precommits by the validators for the previous block,
known as the LastCommit. A LastCommit is valid so long as it contains precommits from +2/3 of voting power.
2018-05-23 12:42:37 -07:00
Proposers are incentivized to include precommits from all
validators in the LastCommit by receiving additional fees
proportional to the difference between the voting power included in the
LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967)).
2018-05-23 12:42:37 -07:00
Validators are penalized for failing to be included in the LastCommit for some
number of blocks by being automatically unbonded.
2018-05-23 12:42:37 -07:00
Information about validator activity is tracked in a `ValidatorSigningInfo`.
It is indexed in the store as follows:
- SigningInfo: ` 0x01 | ValTendermintAddr -> amino(valSigningInfo)`
2018-10-15 14:01:29 -07:00
- MissedBlocksBitArray: ` 0x02 | ValTendermintAddr | LittleEndianUint64(signArrayIndex) -> VarInt(didMiss)`
The first map allows us to easily lookup the recent signing info for a
validator, according to the Tendermint validator address. The second map acts as
2018-10-15 14:01:29 -07:00
a bit-array of size `SIGNED_BLOCKS_WINDOW` that tells us if the validator missed the block for a given index in the bit-array.
The index in the bit-array is given as little endian uint64.
The result is a `varint` that takes on `0` or `1`, where `0` indicates the
2018-10-15 14:01:29 -07:00
validator did not miss (did sign) the corresponding block, and `1` indicates they missed the block (did not sign).
2018-10-15 14:01:29 -07:00
Note that the MissedBlocksBitArray is not explicitly initialized up-front. Keys are
added as we progress through the first `SIGNED_BLOCKS_WINDOW` blocks for a newly
bonded validator.
The information stored for tracking validator liveness is as follows:
```go
type ValidatorSigningInfo struct {
2018-08-13 06:48:23 -07:00
StartHeight int64 // Height at which the validator became able to sign blocks
IndexOffset int64 // Offset into the signed block bit array
2018-08-14 02:31:39 -07:00
JailedUntilHeight int64 // Block height until which the validator is jailed,
2018-08-13 06:48:23 -07:00
// or sentinel value of 0 for not jailed
2019-01-10 17:22:49 -08:00
Tombstoned bool // Whether a validator is tombstoned or not
2018-10-11 16:04:57 -07:00
MissedBlocksCounter int64 // Running counter of missed blocks
}
```
Where:
* `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power).
* `IndexOffset` is incremented each time the candidate was a bonded validator in a block (and may have signed a precommit or not).
2018-08-22 08:56:13 -07:00
* `JailedUntil` is set whenever the candidate is jailed due to downtime
2019-01-10 17:22:49 -08:00
* `Tombstoned` is set once a validator's first double sign evidence comes in
2018-10-11 16:04:57 -07:00
* `MissedBlocksCounter` is a counter kept to avoid unnecessary array reads. `MissedBlocksBitArray.Sum() == MissedBlocksCounter` always.