docs: QBFT decision timing analytics for proposer and committee duties - #2883
docs: QBFT decision timing analytics for proposer and committee duties#2883iurii-ssv wants to merge 13 commits into
Conversation
release: v2.4.3
35 days of mainnet data (44,838 proposer duties, network-wide): round 2 is rare (0.29%) but round-2 decisions miss 11.4% vs 0.049% for round-1; the driver is wall-clock decision time vs the 4s attestation deadline - miss rate is ~0.05% when QBFT decides by 3s, 30% at 3.5-4s, and 100% past 4s. Includes the miss-rate vs decision-time chart and implications for ProposerDelay tuning.
Greptile SummaryThis is a docs-only addition of an analytics write-up measuring the relationship between proposer-duty QBFT decision timing and block acceptance on Ethereum mainnet, based on 35 days of network-wide data (44,838 duties). No code is changed.
Confidence Score: 5/5Docs-only change adding an analytics write-up; no code, config, or schema is touched, so there is no runtime risk. All headline numbers are internally consistent (round counts, miss totals, derived percentages, and confidence intervals cross-check correctly), the chart is referenced correctly, and the relative-path link to No files require special attention — both changed files are documentation assets. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Slot starts] --> B[RANDAO pre-consensus\n+ payload fetch\n~1.2s median]
B --> C[QBFT instance starts]
C --> D{Round 1 decision\nwithin 2s of start?}
D -- Yes: ~99.75% of duties --> E{Decision time\nvs 4s deadline}
D -- No: ~0.25% of duties --> F[Round 2 begins]
F --> G{Decision time\nvs 4s deadline}
E --> H["≤ 3.0s: ~0.05% miss"]
E --> I["3.0–3.5s: ~1.9% miss"]
E --> J["3.5–4.0s: ~30% miss"]
E --> K["≥ 4.0s: 100% miss (8/8)"]
G --> L["< 3.0s: 0% miss (7/7)"]
G --> M["3.0–3.5s: 2.25% miss (2/89)"]
G --> N["3.5–4.0s: 30% miss (3/10)"]
G --> O["≥ 4.0s: 100% miss (8/8)"]
H & I --> P[Block accepted]
L & M --> P
J & N --> Q[Block likely missed]
K & O --> R[Block guaranteed missed\nAttesters already voted for parent]
Reviews (1): Last reviewed commit: "docs: add proposer QBFT decision timing ..." | Re-trigger Greptile |
Companion to the proposer analysis with the opposite conclusion: attestation inclusion is insensitive to QBFT decision time (0 misses in 19,463 round-2 decisions; duties decided 7-8.5s all landed). 86% of missed attestations come from duties that never decided; five chronic clusters account for 82% of cluster-failure events. Lateness costs quality only: first-block inclusion drops past 7s and the 4s no-block fallback costs head correctness, which round-2 retries heal. Cross-linked from the proposer doc.
0.25s buckets from 4s onward (the 6.5-7.5s transition was previously hidden in 0.5s bins), Wilson 95% CI error bars on both lines, and an in-figure definition of n (included attestations per bucket). Deadline labels moved to the top to avoid colliding with sample-size labels. Adjusts the one README sentence that cited the coarser buckets.
Round-1-only and round-2-only variants of the quality-vs-decision-time chart, separating the two effects: the 4-5s head-vote dip belongs entirely to round-1 fallback decisions, while round-2 decisions have near-perfect head votes and only pay first-block inclusion when deciding past ~7.2s.
The row reads as a subset of 'Decided round 3+' when it actually spans all three decided rows; relabel it and spell out the 15/1,140 point.
Adds the round-1/2/3+ split of decided duties (98.67% / 1.31% / 0.013%) so the chart's right side reads with the correct weight, and fixes duty-vs-attestation units in the adjacent figures: 19,463 and 128 are attestation counts; the duty counts are 2,826 (round 2) and 28 (round 3+).
The table flips from committee-duty counts (rows 1-2) to validator-attestation counts (miss-rate rows) without saying so, and row 1 uses traced duties while row 2 uses decided duties as the denominator. Spell out the unit in every row and add a one-line note.
1.95% vs 0.29% touched-round-2 decomposes into: instance-relative vs slot-aligned round timers (72% of touched committee duties had no round-1 proposal - the leader was still waiting for the block), slot-correlated late-block bursts (half of touches co-occur >=5 per slot), and per-slot vs per-validator weighting of unhealthy clusters.
Both analytics docs now spell out the pipeline steps with the internal script names, endpoints, batching and server caps, sampling design (stratified one-epoch-per-day, fixed seed), key metric definitions, verification mechanics, and the constraints to respect when re-running (trace retention, settled-window margin, arrival-time semantics).
…units Addresses the Greptile comment: the 129-vs-115 gap in the proposer headline table is now explicit (14 duties had only round-change messages observed). Aligns 'touched round >=2' terminology across both docs, fixes the attester >=8s caveat to its real units (28 duties / 128 attestations), and removes detail duplicated between the Method and Reproduction sections in both docs.
|
|
||
| - The ≥8s region is thin in the sample (28 duties / 128 attestations); conclusions there lean on the full-window forensics, which point the same way. | ||
| - Zero observed misses in round 2/3+ bounds the rate by sample size, not to literal zero. | ||
| - Scattered misses of 1–4 validators within decided duties exist (they are the 0.0011%) and are not part of the ≥5-validator forensics set. |
There was a problem hiding this comment.
Might be worth reconciling this with the TL;DR — 41 misses from just four duties averages ~10 per duty, so at least one of those duties must have had ≥5 validators missing together.
Seems that contradicts both the "1–4 validators" bound and these being outside the ≥5-validator forensics set; maybe the bound or the duty count needs adjusting.
There was a problem hiding this comment.
Reconciled: four duties is the correct figure, so the caveat was the loose part. Dropped the "1–4 validators" bound and the "not part of the forensics set" claim; it now notes that those four duties (the ones with ≥5 validators missing together) do appear in the full-window forensics under "decided round 1 (on time), failed downstream" — i.e. the sample misses and the forensics set overlap rather than partition.
| For block proposals, decision time is destiny (100% missed past 4.0s into the slot). For committee duties, decision time is **almost irrelevant to inclusion**: | ||
|
|
||
| - **0 of the 19,463 attestations from the 2,826 round-2-decided duties were missed** (CI95 ≤ 0.02%); likewise 0 of 128 from round-3+ decisions, and 0 of 355 from the 61 duties decided 7–8.5s into the slot. Round-1 decisions miss 0.0011%. Even the handful of duties decided past 10s were included, ~13 slots late. | ||
| - Of the 1,500 missed validator-attestations in the sample, 97% came from duties that never produced a decision: 86% where consensus messages were observed but a decide quorum never formed, and 12% where the exporter saw no consensus activity for the duty at all. The remaining 3% (41 misses, from just four duties) completed consensus early — between 2.3s and 5.1s — and failed after it. |
There was a problem hiding this comment.
Worth considering rounding these consistently — 86% and 12% read as the decomposition of the 97% but sum to 98. The underlying fractions (85.5% + 11.7% = 97.3%) each round up; maybe 86% + 11%, or one decimal place, would avoid the double-take.
There was a problem hiding this comment.
Went with 86% + 11% so the split sums to the 97% (and 86 + 11 + 3 = 100). The 11% is 176/1500 = 11.7% nudged down so the arithmetic reads clean — happy to switch to one decimal place instead if you'd rather not round that way.
|
|
||
| ### Caveats | ||
|
|
||
| - The ≥8s region is thin in the sample (28 duties / 128 attestations); conclusions there lean on the full-window forensics, which point the same way. |
There was a problem hiding this comment.
What do you think about phrasing this as the round-3+ region instead?
The numbers match the round-3+ row exactly, but the TL;DR mentions round-2 duties decided up to 8.5s, so the ≥8s region presumably isn't only round-3+.
There was a problem hiding this comment.
Good point: 28 duties / 128 attestations is the round-3+ count exactly, and the ≥8s time region also picks up late round-2 duties, so that label was wrong for these numbers. Relabeled the caveat to Round-3+.
…unding + round-3+ caveat label
Adds two analytics documents under
docs/analytics/quantifying how QBFT decision timing relates to on-chain outcomes on Ethereum mainnet, based on 35 days of network-wide data (2026-05-07 → 2026-06-10). Docs-only change, no code.docs/analytics/proposer/— block proposals44,838 proposer duties, 99.93% exporter-trace coverage, every miss verified against the canonical chain.
docs/MEV_CONSIDERATIONS.md(ProposerDelayheadroom: p50 decision 1.40s, p99 2.25s) and #2429.docs/analytics/attester/— committee duties (attestations)Stratified sample of 36 epochs (216,243 committee duties, 3.89M validator-attestations) + complete cluster-failure forensics over the full window (7,732 events). The conclusion is the opposite of the proposer story:
Contents
docs/analytics/proposer/README.md+ miss-rate-vs-decision-time chartdocs/analytics/attester/README.md+ four charts: miss sources, quality vs decision time, and round-1-only / round-2-only conditioned variantsData sources for both: e2m duty monitor (duty enumeration/outcomes), exporter duty traces (QBFT rounds and message timing, network-wide P2P observation), public beacon API (canonical-chain verification).