@@ -45,9 +45,9 @@ After importing a block, all validators [recompute their head](./lmd_ghost.md),
4545the latest [ finalized and justified checkpoints] ( ./3sf_mini.md ) according to the block's
4646post-state.
4747
48- A block body carries at most
49- ` MAX_ATTESTATIONS_DATA ` aggregated attestations: distinct ` (slot, head, target, source) ` tuples, each paired with a
50- bitfield naming the validators bound to it.
48+ A block body carries at most ` MAX_ATTESTATIONS_DATA ` aggregated attestations: distinct
49+ ` (slot, head, target, source) ` tuples, each paired with a bitfield naming the validators
50+ bound to it.
5151Genesis occupies slot 0, so proposals start at slot 1, and nothing forces a slot to be
5252filled: a proposer that is offline or too slow leaves an empty slot, and the next block
5353simply points its parent root at an older block.
@@ -77,10 +77,10 @@ Aggregators aggregate the votes they have received and gossip the resulting aggr
7777attestations to the network. These aggregated attestations are imported by all validators,
7878who verify and store them in a "new attestations buffer".
7979
80- Aggregation earns its own interval because it is the heaviest recurring computation in the
81- client: collapsing a subnet's worth of them
82- into one proof is heavy CPU work. It is also what makes a block affordable, since a block
83- carrying raw votes would need one full XMSS signature per voter, quickly going over the network bandwidth limit.
80+ Aggregation earns its own interval because collapsing a subnet's worth of XMSS signatures
81+ into one proof is the heaviest recurring computation in the client. It is also what makes a
82+ block affordable, since a block carrying raw votes would need one full XMSS signature per
83+ voter, quickly going over the network bandwidth limit.
8484
8585> ** In ethlambda:** the proofs run on an off-thread worker so the blockchain actor's
8686> message loop stays responsive, and a session may start up to ` EARLY_AGGREGATION_WINDOW `
@@ -94,7 +94,8 @@ Validators compute the [safe target](./lmd_ghost.md#safe-target-selection) they'
9494deciding which finality vote to cast on the next slot. The safe target is computed based on
9595the votes received in the current slot.
9696
97- It is LMD-GHOST run with a two-thirds weight threshold instead of a plain majority, so it
97+ It is LMD-GHOST again, but run over just the votes that arrived this slot and with a
98+ two-thirds weight threshold, where head selection applies none. The safe target therefore
9899sits at or behind the head and advances only once a branch is backed by a supermajority.
99100Deriving targets from it is what stops [ 3SF-mini] ( ./3sf_mini.md ) from justifying a branch
100101the network has not visibly converged on.
@@ -105,6 +106,8 @@ Validators merge the aggregated attestations they have in their "new attestation
105106into their fork-choice view, and recompute their head.
106107
107108This is the slot's second and last promotion point; the first is the proposer's, just
108- before it builds. Between promotions a vote sits in the buffer without weight, which is
109- what keeps a validator's fork-choice view from shifting under it mid-slot. See
110- [ why staged promotion] ( ./lmd_ghost.md#why-staged-promotion ) for the reasoning.
109+ before it builds. Until a vote is promoted it carries no weight in head selection, which is
110+ what keeps a validator's fork-choice view from shifting under it mid-slot. The safe target
111+ is the exception: it reads the unpromoted buffer directly, which is how it stays a view of
112+ this slot alone. See [ why staged promotion] ( ./lmd_ghost.md#why-staged-promotion ) for the
113+ reasoning.
0 commit comments