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
|
|
|
|
2018-06-15 03:22:06 -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
|
|
|
|
2018-06-15 03:22:06 -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
|
|
|
|
2018-06-15 03:22:06 -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
|
|
|
|
2018-06-15 03:22:06 -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)`
|
2018-06-15 03:22:06 -07:00
|
|
|
|
|
|
|
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.
|
2018-06-15 03:22:06 -07:00
|
|
|
|
|
|
|
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-06-15 03:22:06 -07:00
|
|
|
|
2018-10-15 14:01:29 -07:00
|
|
|
Note that the MissedBlocksBitArray is not explicitly initialized up-front. Keys are
|
2018-06-15 03:22:06 -07:00
|
|
|
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
|
2018-06-15 03:22:06 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
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.
|