-
Notifications
You must be signed in to change notification settings - Fork 104
leios testnet
Leveraging DeltaQ tracing mechanism (including the proposed
TraceRecvBurstSDU):
- Aggregated
TraceRecvDeltaQSampleevents (one per peer per protocol per ~10 s) is cheap: a ~100-node testnet with ~60 peers each gives you ~600 samples/sec cluster-wide, order-of-megabytes/day. Trivial for InfluxDB/Timescale/Prometheus. - Raw
TraceRecvDeltaQObservationandTraceRecvBurstSDUevents are far higher volume (per-SDU). Ship them selectively — only enable for a subset of nodes, or during measurement windows — and land them in S3 as Parquet for offline analysis. This is the pattern the mempool-measurements dataset already uses. -
PeerRTT.quantileis a liveSTMreader — you can either poll it periodically at whatever cadence you want, or (better) emit it as a periodic aggregate on the same 10 s cycle. -
TraceTCPInfois already wired in the mux bearer, but conditionally: it requires Linux and thetracetcpinfocabal flag onnetwork-muxat compile time (default off; flag description flags it as "costly"). When enabled, per-SDU it emits kernel state (tcpi_retrans,tcpi_lost,tcpi_snd_cwnd,tcpi_advmss,tcpi_rcv_space) — the primary loss-rate and rwnd answer for the validation frame. In practice: compile a dedicatedtracetcpinfobuild for the Linux measurement nodes only, run the vanilla build everywhere else. Treat the resulting numbers as testnet / design-phase telemetry only, not runtime signals — the flag is off in production builds by design (seeleios-overlap.md's Frame 1 subsection on TCPInfo for the design-phase framing). Additional motivation:tcpi_rttcross-checked against the branch'sPeerRTT.quantile(application layer) is one of the multi-signal-fusion cross-checks inleios-fetch-scheme.md— a peer whose application-layer RTT is much larger than the kernel's TCP-layer RTT is a signature of application-level adversarial delay.
So the infrastructure question reduces to "hook initDeltaQTracer' up to
cardano-tracer and add a Grafana dashboard." References to Frame's
target the leios-overlap.md report, which discusses expanded ouroboros-network
tracing machinery to validate concerns in the DeltaQ report and which in turn
is used to analyze Leios itself.
Validation needs known ground-truth inputs and
measured outputs. For eg. to verity the Mathis relation in
the deltaq report, measure estBurstS and p, which requires
either the TraceTCPInfo kernel telemetry already emitted
by the mux (Linux + tracetcpinfo cabal flag; see the
trace-collection section above and
leios-overlap.md's Frame 1 subsection on TCPInfo)
or the S-residual probe (a noisy secondary derivation).
leios-overlap.md recommends both a controlled
tc netem microbench (where you dial p and RTT explicitly) and a testnet
campaign for different purposes:
-
Microbench: does the model form (Mathis or CUBIC) match observed
throughput at known
p, validating the equation. -
Testnet: what is the empirical distribution of
estBurstS, RTT quantiles, per-protocol tx-arrival latency across a realistic cross-continental mesh? Feeds the inputs to the equation and tells you whether the CIP-0164 assumed values are conservative or optimistic.
Parameter driving (what should CIP-0164 say?) is exactly what a testnet
gives you well. Concretely, the observations feed into the following levers,
grouped by the same three tiers used in
leios-overlap.md's Frame 1 subsection:
| Leios parameter | Data you'd use | Tier |
|---|---|---|
S_EB_tx maximum |
Largest closure size such that the 7 s voter deadline is met at p95 with observed estBurstS
|
Protocol parameter |
L_vote (currently 4 s, tunable component of the 7 s voter deadline) |
p95/p99 of voter validate CDF — 3·L_hdr + L_vote + observed estBurstS·closure_size + µ_eff·N_txs |
Protocol parameter |
L_diff (certRB diffusion budget, currently 7 s) |
p95/p99 of blended-multi-hop estBurstS × 8 kB (certRB body) |
Protocol parameter |
Round length (3·L_hdr + L_vote + L_diff, currently 14 s) |
Sum of the two above, plus header diffusion time | Protocol parameter |
p (loss-rate assumption in report.md §4.2, currently 10⁻⁴) |
TraceTCPInfo tcpi_retrans / tcpi_lost distribution across connections |
Rationale-doc assumption |
Mathis-vs-CUBIC choice (report.md:1046-1173) |
TraceTCPInfo tcpi_snd_cwnd trace picks the actual growth law |
Rationale-doc assumption |
long_hop_owd (currently 134 ms) |
Empirical p95 of PeerRTT binned by peer geography |
Rationale-doc assumption |
| rwnd-vs-cwnd binding (§5.4 caveat 1) |
min(tcpi_snd_cwnd, tcpi_rcv_space) reveals which is the actual limit |
Rationale-doc assumption |
BlockFetch per-peer byte watermarks (calculatePeerFetchInFlightLimits) |
Empirical PeerGSV from the branch's window; cross-check via tcpi_delivery_rate × tcpi_rtt on Linux |
Node-implementation constant |
| SPO tuning guidance (MSS, IW10, congestion-control choice) |
TraceTCPInfo per-connection deltas from expected defaults |
Node-implementation constant (ops guidance, not spec) |
TCPInfo-fed rows are Linux-only, testnet / design-phase only (see the trace-collection section above). All other rows are portable and can be collected on any mux bearer.
For the runtime-adaptive lever the branch also enables (a voter refusing to vote when its local mesh health drops below CIP-0164's assumed budget), see the reader-view section below — it belongs in Frame 2, not in this design-time parameter-driving table.
For the Leios use case specifically:
-
Topology: 30–100 nodes across ap-northeast-1, eu-central-1, us-east-2 (mirroring the mempool-measurements setup so
π₁and network data live in the same dataset), plus 5–10 "adversarial edge" nodes on non-AWS or consumer-grade uplinks to probe §7 limitation 6 (South America ↔ APAC, deep-buffer bottleneck links). A pure-AWS mesh misses the tail (higher loss, lower bandwidth, etc.) that actually determines feasibility, ie. successful Leios rounds. -
Baseline traffic: run Praos with mainnet-scale block production, plus synthetic tx-submission load matching mainnet mempool arrival rates. The Leios pipeline itself may or may not be running; if it is, you're measuring end-to-end; if it isn't, you're measuring the underlying transport under representative load.
-
Instrumentation:
TraceRecvDeltaQSampleon every peer for aggregates. RawTraceRecvDeltaQObservationon 3–5 designated "measurement nodes" (one per region) for high-resolution offline analysis. -
Duration: a week, per §5 of the mempool-measurements dataset. Any shorter and you miss diurnal loss patterns — the day-night cycle of network usage, where packet loss on the same path can swing by orders of magnitude between low-traffic hours (~1e-5) and evening peak hours (~1e-3). A short measurement biases the observed
ptoward whichever part of the cycle you sampled; a week captures the full cycle plus weekend-vs-weekday variation, giving stable tail estimates. Directly plottable fromtcpi_retransagainst local time-of-day. -
Controlled perturbations: on a sub-mesh, inject
tc netemshaping to force known p, RTT, and loss patterns. This gives you the ground-truth pairs needed to falsify Mathis vs CUBIC (i.e., Experiment 1 fromleios-overlap.md, run inside the testnet rather than on a two-node isolated rig). -
LeiosFetch-scheme validation (if a candidate scheme is deployed on the testnet). Compare the four configurations from
leios-fetch-scheme.md's suggested experimental design: memo's scheme as written (baseline), memo + Improvement #1 (hybrid classification only), memo + Improvements #1–#8 (full adaptive variant with fusion and diversity-aware churn), and the erasure-coded variant (Alternative B, if prototyped). Metrics per configuration: empirical$F_{\text{full}\mid C}(14)$ , P99 completion time, redundant egress per round, and adversarial resistance under the injection scenarios in item 7 below. -
Adversarial injection: designated adversarial nodes on the sub-mesh with controlled attack profiles. Cheap to add (mostly
tc netemon the designated nodes) and tests defensive mechanisms that would otherwise be untested until real-world adversaries appear:-
Slow-loris: adversarial node accepts fetch requests then
delays response indefinitely. Tests Improvement #3
(
estBurstS-based detection) and its pacing-attack variant (delivering just above the detection threshold). -
RTT inflation: adversarial node adds artificial delay to all
responses. Tests the multi-signal fusion cross-checks
(
PeerRTT.quantilevstcpi_rttdivergence, geographic minimum RTT). Both are named inleios-fetch-scheme.md's fusion section. - Chunk-hedge slow-loris: adversary is one of many NBL peers each getting a chunk; it slow-lorises its assigned chunk. Directly tests the memo's key adversarial concern about block-completion under partial-peer failure.
-
Topology-induced peer concentration (non-adversarial but
shares the measurement path): configure a sub-mesh with a
stake-concentrated "dense" region and a sparse region with
only 2–3 high-stake SPOs. Measure whether churn drives
mesh-wide big-ledger peer sets toward the dense region (as
predicted by the per-block-origin model in
leios-fetch-scheme.md's Improvement #8) and whether sparse-origin blocks then see low mesh-wide seed-hop coverage. Compare against a diversity-aware-churn deployment to quantify how much the mitigation buys.
Sub-mesh scale for adversarial injection should mirror the real-world adversary size assumption (e.g., ~4% of the big-ledger pool, per the arithmetic in
leios-fetch-scheme.md's seed-node section). -
Slow-loris: adversarial node accepts fetch requests then
delays response indefinitely. Tests Improvement #3
(
The mempool-measurements dataset that fed pi1_derivation.md is already
collecting some of what you'd need — per-node tx-arrival timestamps.
Extending that pipeline to also collect this branch's DeltaQ traces gives you
π₁ and the network side from the same nodes in the same time window,
which lets you cross-validate: does a period of high π₁ correlate with
degraded estBurstS (i.e., is mempool divergence caused by network
stress)? That's an interesting question the report can't answer today.
Similarly, the IOG benchmarking cluster that runs network-benchmark
topologies is a natural fit — it's already designed to run cross-continental
Cardano nodes under controlled load.
Yes, a real cross-continental testnet is the right validation vehicle,
especially for parameter-driving Leios. The traces are already collectible
via the existing cardano-tracer infrastructure. Combining testnet
measurement with a controlled tc netem microbench gives you both the
inputs (empirical RTT/S distributions on real paths) and the
falsification (does Mathis or CUBIC fit at known p) that the report
currently lacks. The main gaps are (a) adversarial-path coverage — pure-AWS
meshes under-represent the tail, and (b) the MiniProtocolNum enrichment
needing to be on the deployed nodes if you want to test the 1-hop
pre-diffusion assumption. Neither is a fundamental obstacle.
That covers the validation-and-parameter-driving frame. The rest of this document covers three topics that don't fit inside that frame:
- Production cost of the DeltaQ machinery — running the branch's RTT/DeltaQ machinery on public relays (with hundreds of inbound peers) has real cost. What that cost is, what mitigations exist, and how they interact with the two Leios frames.
-
Adaptive Leios via the
PeerRTTreader view — the branch enables Leios mini-protocols to observe their own network conditions at runtime and adapt behaviour, rather than baking assumed conditions into CIP-0164 forever. This is the reader-view expansion below. - Fully-blended diffusion when 1-hop fails — what happens, how to diagnose it, and how DeltaQ traces expose dynamics the report itself doesn't model. Covered further down.
Existing Cardano practice keeps DeltaQ analysis strictly on the trace
path (rather than in-band with protocol logic) precisely because it's
potentially expensive, and BlockFetch derives its PeerGSV from
KeepAlive-driven samples (once every ~10 s) rather than a richer
signal for the same reason. This part covers what the branch adds on
top of that existing cost, when it matters, and how to mitigate.
Main already emits TraceRecvDeltaQObservation per SDU and runs
TraceStats.step on every observation. That cost is proportional to
SDU rate across all connections. The branch layers on:
-
Cookie mint (egress). PRNG draw +
OrdPSQinsert per SDU, amortised by 1 ms mint-batching to roughly "one cookie per outbound burst" rather than per SDU. -
Cookie match (ingress).
PSQ.atMostViewper received SDU: matched-echo lookup + age-out of expired cookies in one operation. O(log n) where n = outstanding sends. -
Per-protocol StatsA lookup.
Map MiniProtocolNumaround the existing per-size record structure. Constant-factor increase (~5x for 5 active mini-protocols). - Burst tracker. Single-slot cursor per connection, essentially free.
-
PeerRTTt-digest update. O(log δ) per matched echo, δ = 100. -
TVarwrite for the reader view: one STM commit per matched echo.
The per-SDU addition is roughly a doubling of main's existing DeltaQ work. Storage per connection: a few kB for the t-digest, a few kB for the per-protocol StatsA state, plus the cookie PSQ (capped at a few thousand outstanding × ~8 B ≈ tens of kB).
Rough arithmetic for a heavily-loaded public relay (500+ connections, ~10 k SDUs/s aggregate, ~5–10 µs of DeltaQ work per SDU): 5–15% of a core and 15–30 MB of cookie PSQ storage. Not catastrophic in isolation, but additive with everything else on the node — and the kind of overhead current Cardano practice explicitly refuses to pay in the block-fetch decision path.
Almost every Cardano mini-protocol carries data from responder to
initiator — block-fetch, chain-sync, keep-alive. Tx-submission is
inverted: the initiator sends transactions to the responder. See
track.md's cross-cutting note on this
for the general framing.
Practical consequence for cost mitigation: from a relay's perspective, the tx-submission traffic we care about for pre-diffusion monitoring arrives on inbound connections — where this node is the responder, and where peer count is highest (tens to hundreds). Blocks arrive on outbound connections, which is the low-peer-count side.
Any mitigation that turns off DeltaQ machinery "on inbound because no Leios logic reads it" is therefore wrong — it silences the exact tx-submission signal Frame 2's pre-diffusion diagnostic depends on (see The failure-mode diagnostic table). Direction-based gating is not a safe cost-reduction strategy.
Ordered by leverage. Choose a combination based on which frame you're supporting and how much per-peer fidelity the consumer actually needs.
1. Statistical sampling across inbound peers.
Frame 2's pre-diffusion diagnostic asks a mesh-aggregate question — "is gossip healthy across my peers?" — not a per-peer one. Instrument a random 30–50 of 500 inbound peers rather than all 500. Statistically indistinguishable for aggregate purposes at ~10x lower cost. Rotate the sample every few minutes to avoid systematically favouring a subset.
Does not help if the consumer needs per-peer signals, but for the pre-diffusion diagnostic specifically it's a large, safe reduction.
2. Protocol-scoped enablement.
Only run cookie/burst machinery for mini-protocols whose signals are consumed:
- Tx-submission on inbound → for pre-diffusion monitoring.
- Block-fetch on outbound → for peer selection.
- Skip chain-sync (no consumer for its RTT signal here) and keep-alive (already provides a lightweight RTT signal, doesn't need cookies).
Roughly halves per-connection state and per-SDU cost by trimming the
per-MiniProtocolNum map to just the protocols in use.
3. Probe sampling per SDU.
Cookie 1-in-N SDUs rather than every SDU. Reduces PSQ churn linearly. RTT is stationary enough that 1-in-4 or 1-in-10 sampling still gives hundreds of samples per minute per peer — well above KeepAlive's 6-per-minute baseline.
4. Aggregate-only mode.
For consumers that only ever ask "median across my peers", collapse the per-peer RTT windows into a single shared window per protocol. Trade per-peer visibility for cost. Not compatible with peer-selection use cases (which need per-peer numbers) but fits Frame 2 pre-diffusion monitoring cleanly.
5. Compile-time flag.
Gate the whole Network.Mux.RTT module behind a deltaq_rtt cabal
flag, mirroring the existing tracetcpinfo pattern. Off by default.
Ultimate opt-out for operators unwilling to accept any DeltaQ cost.
Downstream consequence: a node with the flag off cannot participate in any Frame-2 behaviour. This bifurcates the network into "Frame-2-capable" and "vanilla" nodes — a real deployment concern requiring governance consideration, not just an ops decision.
6. Consumer-side aggregation.
Move StatsA aggregation off the mux path; ship raw
TraceRecvDeltaQObservation and TraceRecvBurstSDU events to
cardano-tracer and aggregate at the consumer. Trades in-mux CPU for
trace-forwarding bandwidth. Practical for testnet measurement nodes
where the consumer is close by; impractical for production nodes
where raw per-SDU trace volume would swamp the forwarder.
Frame 1 (validation / parameter driving) runs on ~30–50 instrumented measurement nodes with a bounded connection count. Full machinery is affordable at that scale — no mitigation needed for the campaign itself.
Frame 2 (adaptive Leios in production) requires the machinery to run on public relays with hundreds of inbound connections. A defensible production configuration:
- Statistical sampling across inbound peers (~30–50 of ~500), with rotation.
- Protocol-scoped enablement (tx-submission on inbound, block-fetch on outbound).
- Probe sampling at 1-in-4 or 1-in-10.
- Compile-time flag available as the final opt-out for operators who refuse the cost.
The compile-time flag creates a network bifurcation. Nodes with
the flag off can't participate in Frame-2 behaviours (voter
self-throttle, adaptive S_EB_tx, runtime DeltaQ report's Rec 3 enforcement).
Whether Frame-2 behaviours are advisory (nodes MAY adapt) or mandatory
(nodes MUST adapt) is a CIP-0164 governance question the branch
doesn't answer.
Frame 2 changes the shape of the network's protocol behaviour in a
way Frame 1 does not. In Frame 1 the branch only measures — nodes
either produce more or less data, but the protocol is unchanged. In
Frame 2, nodes voluntarily deviate (throttle, opt out) based on
local observation. That deviation is only sound if the deviation
criteria are so rare that variation doesn't move P_cert, or if
every node's deviation happens under sufficiently correlated
conditions.
The cost mitigations above interact with this. Statistical sampling
introduces variance in what each node observes, which introduces
variance in when each node throttles. If observation is
uncorrelated across nodes, the network gets graceful degradation. If
observation is correlated (all nodes throttle at the same moment
because they observe the same shock), the mesh loses quorum en masse
and P_cert collapses. This is the cross-node covariance question
from the blended-diffusion section, applied at the level of adaptive
decisions rather than pre-diffusion state.
So cost mitigation isn't just an engineering optimisation — it interacts with the operational safety of the Frame-2 lever. That interaction is worth measuring on the testnet before committing to any particular mitigation combination in production.
The Leios report and CIP-0164 both operate in what one might call the
static-analytical mode: pick network conditions (RTT distribution,
congestion model, loss rate), solve for parameters (L_vote, L_diff,
S_EB_tx) such that P_cert ≥ threshold, freeze those parameters into the
protocol. Once frozen, every node applies them identically, blind to whether
the actual mesh conditions at that moment resemble the assumed ones. A voter
with degraded upstream RTT still votes on the same deadline as a voter on a
healthy link; a block producer still packs closures to the same S_EB_tx
regardless of what its actual peers can absorb.
The PeerRTT reader view breaks this because a live Leios voter (or block
producer, or non-voter fetcher) can read, at runtime, what the actual RTT
quantile is right now to each of its peers. That's a category shift from
offline-analytical to online closed-loop. The mini-protocol suddenly has
a signal that lets it be a proper control system rather than an open-loop
feed-forward one.
Ordered roughly by conservatism:
-
Self-diagnosis / operator alerting. The mildest use. Compare the running node's observed
PeerRTT.quantile 0.95against the values CIP-0164 assumed. If measured p95 exceeds assumed p95 by some margin, log a warning. Doesn't change protocol behavior; just gives operators a signal that their node is operating outside the CIP-0164 design envelope. -
Adaptive peer preference. BlockFetch already selects peers by
PeerGSV, but its update path is via KeepAlive's ~10 s cadence — coarse. The window-based signal from this branch is per-connection, updated on every response, and covers all miniprotocols. Peer-selection could react to degradation seconds faster, and could demote peers whose measured RTT has drifted from the initial handshake expectation. -
Adaptive
S_EB_txsizing at production time. A block producer preparing an EB knows, from its peer RTT window, roughly how much bandwidth it has budgeted for closure diffusion. If p95 RTT to typical peers has doubled since CIP-0164 assumed values, the producer could cap the closure size belowS_EB_tx_max— voluntarily accepting a smaller EB to keep certification probability up. Global CIP-0164 sets a ceiling; the node sets the actual size per-round from observations. This is also the mesh's stabilizing feedback against sustained-overload livelock — see the Cascade to livelock section below. -
Adaptive Freshest-First Delivery (FFD). FFD is the "when I'm behind on diffusion, prioritise the newest EB and drop the older" mechanism the report defers modelling (§7 limitation 7). The trigger for FFD is fundamentally "am I going to make my deadline?" — which requires knowing (a) time remaining, (b) work remaining, (c) achievable throughput. Item (c) is exactly
PeerRTT+estBurstS. Static FFD thresholds are guesses; adaptive FFD becomes possible with a reader view. -
Voter self-throttling. The most aggressive use. A voter observing
PeerRTT.quantile 0.95far above the CIP-0164 assumption could conclude "I have no realistic chance of completing the full pipeline in 7 s" and refuse to vote for that round — better than voting and later failing to diffuse the certRB. This trades quorum size for quorum quality: fewer votes, but the ones cast are more likely to actually diffuse.
The interesting property that runs through 3–5: they let a node voluntarily
degrade under stress in ways the static analysis can't. The report's
P_cert collapses to ≈ 0 under catastrophic pre-diffusion failure because
every voter tries and every voter fails. An adaptive scheme where
stressed voters bow out could keep the quorum threshold met among the
healthier subset — turning a hard cliff into a graceful degradation.
Three problems, in decreasing order of severity:
-
Adversarial gaming. A peer that deliberately delays echoing our cookies inflates our locally-observed RTT to that peer. If we react by demoting the peer, that's fine (self-correcting). But if we react by throttling our own participation (self-throttling, item 5), a small colluding set of peers can push a targeted voter out of the committee. Mitigation: aggregate across peers (a single bad peer only pollutes one bucket in the RTT window), and require the degradation to be broad — measured against the median of our peers, not the worst.
-
Feedback loops in the mesh. If some nodes self-throttle and others don't, the ones still voting have to carry more of the diffusion load, potentially degrading the observed RTT for them, which could cascade. This is a classic control-theory pitfall. Any adaptive behavior needs damping — a hysteresis band, or a stochastic component in the throttle decision — to avoid synchronized oscillation across the mesh.
-
Governance / spec-compliance. CIP-0164 is a consensus-critical spec; adaptive voter behaviour that varies decisions based on local observation is a soft deviation from "every voter runs the same protocol." Whether an adaptive voter's cast/not-cast decision is spec-compliant, or whether the CIP needs to explicitly allow (or mandate) it, is a governance question — not a technical one. The technical prerequisite (the reader view) is there; the political prerequisite isn't.
Praos already has adaptive elements (peer selection, BlockFetch churn,
ChainSync candidate ordering) that consume PeerGSV. So the pattern —
miniprotocol reads network telemetry, adjusts behavior — is not new to
Cardano. What's new is:
-
Leios's deadlines are tighter. Praos has a slot budget of 20 s and typically delivers within 1–2 s; a factor of 10 headroom absorbs a lot of RTT variance without behavioral change. Leios's 7 s voter deadline against a 4.4 s modelled long-haul fetch has a factor of ~1.6 headroom. Variance that Praos absorbed silently starts to matter.
-
Certification is atomic. A slow block in Praos still gets adopted eventually; a slow EB simply doesn't certify. There's no "eventually" — either you make the 7 s deadline or you don't. That's exactly the regime where local decision-making beats global static settings.
-
The report's own recommendation 3 depends on it. "Ensure effective tx-submission pre-diffusion" (
report.md:1584-1588) is currently unsatisfiable at protocol design time because pre-diffusion is a runtime property. But it's satisfiable at runtime: a node observing degraded pre-diffusion (via per-mini-protocol DeltaQ traces on tx-submission) can react — refuse to vote, reduce closure size, alert. ThePeerRTTreader view (and its per-protocol siblings) is the API that turns Recommendation 3 from unsatisfiable to enforceable.
The reader view means Leios doesn't have to bet its safety on the network conditions assumed at CIP-0164 design time being the ones present at runtime. It can measure, and adjust. That's a lever the report's static-analytical framing doesn't consider, and probably the single largest place where the branch's work changes what Leios can do, as distinct from what the report can verify.
The reader-view section covered adaptive protocol behaviour in the good
case, where the mesh is broadly healthy and a node is fine-tuning around
CIP-0164's assumed baseline. This part covers the degraded case: when
1-hop pre-diffusion has failed and the full EB closure has to traverse the
multi-hop mesh, with the report's α · P_{cert,1-hop} mixture collapsing
towards the blended-diffusion tail. Two subsections — one on diagnosing
which failure mode you're in, one on investigating the dynamics of the
mode itself.
The report's Limitation 1 and Recommendation 3 both hinge on
pre-diffusion — the assumption that transactions have already reached
local mempools via tx-submission gossip before the EB referencing them
is produced. Testing whether that holds, and diagnosing why when it
doesn't, needs two signals from different layers. Neither is sufficient
on its own; conflating them (as the report's α mixture parameter
implicitly does at report.md:1584-1588) loses information a production
node needs.
Transport-layer (mux-layer, from the branch's traces).
Per-mini-protocol DeltaQ traces bucketed to tx-submission give per-peer
RTT for RequestTxIds → ReplyTxIds and RequestTxs → ReplyTxs
exchanges, throughput of ReplyTxs bodies (bytes/sec of tx traffic
actually flowing), and channel liveness (is the peer responding at
all?). Interpretable as "how healthy is the tx-gossip pipeline right
now, per peer?"
Application-layer (from EB processing, not mux). At each EB arrival, cross-reference the EB's referenced tx-hash list against the local mempool. The fraction not present is the observed π₁ for that EB, at this node, at this moment. Interpretable as "how out of sync was my mempool at the moment I needed it?"
The report's mempool-measurements dataset already collects the outcome
signal at coarse granularity (per-node, per-block). The mux traces
contribute the transport signal, per-connection, at higher temporal
resolution. Both are needed.
Composing the two gives a diagnostic that distinguishes qualitatively different failure modes:
| Transport health | Observed π₁ | Interpretation | Response |
|---|---|---|---|
| Normal | Normal | Healthy pre-diffusion. | — |
| Degraded | Elevated | Slow gossip → mempool lagging. The characteristic transient-stress signature (peer churn, bufferbloat, brief network hiccups). | Prefer healthier peers via peer-selection churn; wait it out. Escalate if severity persists or grows (see below). |
| Normal | Elevated | Pipeline fine yet mempool out of sync. Points at adversarial withholding, a targeted partition affecting only tx-submission for a subset of peers, or a Cardano-specific gossip pathology. | Alert operators; refuse to vote in the affected round; force reconnect to fresh peers. Distinct from network stress and warrants a stronger response. |
| Degraded | Normal | Slow gossip but overall state healthy — a caching/burst effect, or a lagging monitor whose window hasn't caught up. | No action; sanity-check the transport metric. |
The Degraded × Elevated row deserves a severity distinction in practice. A mild version — transport RTT up 2×, π₁ from 0.06 to 0.15 — is the transient signature this row identifies. A severe version — transport RTT up 10×, π₁ from 0.06 to 0.4 — is a compound failure warranting the same response as Normal × Elevated (throttle production, refuse to vote). Baseline calibration on the testnet is what tells you where "mild" ends and "severe" begins for each region-pair.
The value of the split is that "pre-diffusion is failing" is currently a single conflated signal in the report. A production node armed with the transport-vs-outcome split can react to which kind of failure is in play, and reserve the strongest responses (refusing to vote, alerting operators) for cases that actually warrant them.
The table's "Normal" and "Elevated" categorisations are only useful with a per-region-pair baseline distribution — mean and tail of tx-submission RTT and throughput, mean and tail of observed π₁, all measured under representative load. A week of the testnet campaign's baseline collection (see What a good testnet campaign looks like above) establishes those baselines. Without them, the categorisation is guesswork.
Forced-blended experiments in the next section intentionally drive the mesh into the Normal × Elevated quadrant on the suppressed nodes — their tx-submission is fine with peers that also don't suppress, but their local π₁ shoots up. Confirmatory: the diagnostic table should reproduce the induced failure mode. If it doesn't, either the induction is not doing what you think or the diagnostic is not measuring what you think — both worth debugging.
Collected and analyzed DeltaQ data fits well as inputs to the report's blended-diffusion model, indirectly but usefully covers the composed end-to-end multi-hop dynamics, and — most valuably — can reveal a family of dynamics the report itself doesn't model.
The report constructs its blended-diffusion CDF (report.md:359-436) by
convolving:
- A per-hop transfer-time CDF, parameterised by the throughput model (Mathis or CUBIC) at assumed p and RTT bin (short/medium/long).
- A path-length distribution (1..5 hops with the report's regular-random-graph probabilities).
- An RTT-bin mixture (short/medium/long equally likely per hop).
Every piece of that has to hold up empirically for the report's conclusion (14 s delivery only 14% under Mathis, 99% under CUBIC) to reflect reality.
The single-hop CDF — item 1 above — is exactly what per-connection
estBurstS and PeerRTT produce. On a real testnet:
- Every burst response (blockfetch chunk, EB body, missing-closure fetch)
generates an
estBurstSsample: throughput of that hop under the actual congestion regime, actualp, actual buffering. No Mathis/CUBIC assumption in sight. - Every matched cookie produces an RTT sample; a
PeerRTTquantile per peer gives you empirical per-hop CDFs binned by peer-distance category.
Plugging those CDFs into the report's convolution instead of the
analytical Mathis/CUBIC ones gives you a directly-empirical estimate of the
blended-diffusion CDF at each S_EB_tx. That's the cleanest validation
path: keep the report's convolution engine, replace its analytical inputs
with measurements, compare outputs.
This alone would settle whether the 14% (Mathis) or 99% (CUBIC) figure at 12 MB is closer to reality on a given mesh.
One blended-diffusion input is answerable from the peer graph alone —
no DeltaQ traces, no per-EB tagging, no consumer plumbing. The main
one is structural path-length distribution, the assumption the
report leans on hardest for its blended-diffusion CDF
(report.md:359-436).
Operational shape:
- Query each testnet node's peer-selection state (already introspectable via existing node interfaces).
- Dump the graph — edges are directed peer connections; vertices are nodes.
- Compute the shortest-graph-path distribution, degree distribution, clustering coefficient, and hub concentration.
What it answers. Does the mesh's structure resemble the report's regular-random-graph assumption (degree ~10, no significant clustering, path-length ~3.6)?
What it does not answer. What paths EBs actually take. Peer-selection preferences and BlockFetch decisions can route diffusion onto longer or shorter paths than the shortest-graph-paths. That gap is filled by reconstruction (next subsection).
Ordering the two. Topology snapshot first, reconstruction second:
- Topology snapshot is a one-day exercise. Immediate feedback on whether the mesh's structure resembles what the report assumes. If the answer is "no", that alone is a finding worth reporting before running the more expensive reconstruction. Repeat weekly on a live testnet to catch topology drift.
- Reconstruction (next subsection) is the higher-fidelity but more expensive measurement, and its number is what the report's convolution actually depends on.
The comparison between the two produces one of four outcomes, each telling a different story about what should happen next:
| Topology says | Reconstruction says | Interpretation | Follow-up |
|---|---|---|---|
| Matches assumed ~3.6 | Matches topology | Mesh is what the report assumed; peer-selection isn't biasing diffusion. | Report's convolution well-founded; confidence in 12 MB feasibility increases. |
| Matches assumed ~3.6 | Longer than topology (e.g. ~4.8) | Structure is fine but peer-selection pushes diffusion onto longer paths. | Investigate peer-selection behaviour; unexplained bias in the diffusion routing. |
| Longer than assumed (e.g. ~5.2) | Matches topology | Mesh structure is worse than assumed; diffusion follows what the structure allows. | Recalculate the report's convolution with the empirical path-length. |
| Longer than assumed | Shorter than topology | Peer-selection is routing around long paths (via hubs, for instance). | Model has a hidden resilience mechanism worth documenting. |
Doing only one of the two measurements leaves ambiguity that the other resolves.
The convolution assumes hops are independent and identically distributed. The mesh may not honour that. To check, you need to observe end-to-end delivery, not just single-hop:
-
Tag every EB (or synthetic bulk payload) with a stable ID, log
(node, ts, EB_id, arrival_or_forward)events across the whole testnet. -
Also tag each BlockFetch / LeiosFetch fetch session at each node
with a local session ID that references the EB hash it's pulling.
The EB-arrival log above is application-layer and answers "when did
EB X arrive at node Y"; a per-fetch session tag on the local traces
answers "which mux-layer signal belongs to which fetch". Under the
interface-saturation scenario in Dynamics the report doesn't model
(item 1), this makes the cross-node correlation direct: "during
session
$S$ for EB$X$ on connection B↔C, B's other Wantons saw oldest-byte-age rise by$\Delta$ , and peers D/E/F sawestBurstSdrop by$\varepsilon$ " — instead of timestamp-guessing which spike belongs to which fetch. No wire-format change needed: the EB hash is already on the wire (BlockFetch / LeiosFetch requests reference EBs by hash), so the session ID can be derived deterministically from(peer, EB_hash, fetch_start_time)and only needs to appear in the local BlockFetch / LeiosFetch client trace stream to key mux-layer signals against. - Reconstruct actual paths by matching each node's arrival time against its forwarding events, plus the known peer graph. You now have the actual multi-hop trajectory of each EB across the mesh.
- Compare the observed end-to-end arrival CDF against the DeltaQ- convolved prediction. If they diverge, the independence assumption is wrong — head-of-line effects at intermediate hops, or graph-topology skew, are the likely culprits.
This isn't in the mux traces themselves — it's a higher-level analysis
layered on top. But the mux traces plus a modest per-EB-arrival log gives
you enough to do it. cardano-tracer already emits block-arrival events;
the same pattern for EBs would suffice.
The same per-EB arrival log that enables path-length reconstruction
also lets us directly measure Yves Hauser's §5.6 conditional
probability: given certification succeeded at $t_v = 7\text{ s}$,
did all $N$ honest nodes receive the EB body by $t = 14\text{ s}$?
See leios-conditional-diffusion.md
for the full analysis; the operational recipe is:
- Log
(node, EB_id, arrival_ts)at every measurement node (same log as the cross-node correlation section above). - Log certification outcome per EB (from
cardano-tracer's block-diffusion / EB-certification traces). - For each EB
$j$ with$C_j$ (certification succeeded), check whether$\max_i T_j^{(i)} \le 14\text{ s}$ . - Empirical estimator:
$\hat{F}_{\text{full}\mid C}(14) = \frac{\left|{j : C_j \text{ AND all arrived by 14 s}}\right|}{\left|{j : C_j}\right|}$ .
Yves's formula predicts
As a by-product, the same data gives:
- The identity of the slowest node per EB
(
$\arg\max_i T_j^{(i)}$ ) and the temporal regime of that identity across rounds (persistent / rotating / bimodal). Per-node operational intervention pays off only under the persistent regime; the rotating and bimodal (churn-induced) regimes each call for different levers. Seeleios-conditional-diffusion.md's "Slowest-node identity and its temporal structure". - Empirical vs modelled
$G(t)$ — divergence tells us whether$G$ is over- or under-estimated at each body size. - The correlation matrix between per-node arrival times — directly
addresses Yves's caveat 1 (i.i.d. assumption) and gap 2 of
leios-report-gaps.md.
The appendix in
leios-fetch-scheme.md
identifies a tendency for peer-selection churn to concentrate the
mesh's big-ledger peer sets around block-production regions,
producing bimodal per-round coverage (high on dense-origin rounds,
low on sparse-origin rounds). The actual strength of this tendency
on real networks is an empirical question. The same per-EB arrival
log used for
1. Per-round orphan-set identification. For each certified EB, identify the set of nodes that did not receive delivery from a big-ledger seed (their winning arrival was via a non-big-ledger path, or arrived after a threshold indicating multi-hop). Peer-metadata (big-ledger flag per connection) distinguishes the winning path.
2. Block-origin classification per round. For each certified EB, identify the block producer's geographic / ASN region. Classify the round as dense-origin or sparse-origin based on the producer's location (or, more robustly, based on stake-weighted region density in a rolling window). This is the key axis of the analysis.
3. Per-origin coverage rates (
-
$c_D$ = fraction of dense-origin rounds where most of the mesh had seed-hop delivery. -
$c_S$ = same for sparse-origin rounds. - Empirical
$k = c_S / c_D$ .
If
4. Per-round bimodality analysis. Instead of asking "which nodes are persistently orphaned", ask "which rounds have widespread orphaning". Histogram the mesh-wide orphan fraction across all rounds. Under the churn tendency, expect a bimodal distribution (peak near zero for dense-origin rounds, peak near 0.75–0.8 for sparse-origin rounds). Under weak tendency, expect a unimodal distribution centered on the mesh average.
5. Cross-node covariance within rounds. On sparse-origin rounds, compute the covariance between arrival times across nodes. High within-round covariance is the signature of a shared bottleneck (the multi-hop diffusion route from a sparse origin). This directly measures Yves's caveat 1 applied to the seed-node lottery.
6. Peer-graph diversity metrics (secondary). For each node, compute ASN / country / geographic diversity of the 5 big-ledger peers, peer tenure, and average RTT. Correlate diversity with per-node orphan-frequency. Under the tendency, diversity should correlate positively with fewer sparse-origin orphanings; under weak tendency, no strong correlation.
7. Effect on
- Peer-metadata service — MaxMind or equivalent for ASN / country lookups from IP addresses. Roughly a few MB static database, daily refresh. Cheap.
- Peer-graph tracking — per-node record of which peers were big-ledger vs NBL at each round. Small addition to the per-EB arrival log.
-
Block-producer identity per round — required to classify
rounds as dense-origin or sparse-origin. Available from the
block header / chain-sync metadata already emitted by
cardano-tracer; needs to be joined into the per-round dataset. - Regional partitioning of stake — a rough "dense vs sparse" region cutoff for classifying block-origins. Could be geographic (continents), by-ASN, or by empirical stake density. Multiple partitionings for robustness against a bad partition choice.
Under the four-configuration experiment (item 6 of "What a good testnet campaign looks like"):
-
Memo baseline: establish empirical
$c_D$ ,$c_S$ ,$k$ , and the per-round bimodality profile. If$k \approx 1$ (no strong concentration), the tendency isn't dominant on this mesh and the other configurations may not add much. If$k \ll 1$ (strong concentration), we have a real problem to fix. - +Improvement #1 (hybrid classification): minimal effect on churn dynamics — classification refines within the existing peer set but doesn't change churn selection. Concentration should be similar to baseline.
-
+Improvements #1–#8 (full adaptive): Improvement #8's
diversity-aware churn should measurably raise
$c_S$ (sparse-origin coverage) and hence$k$ . Regional variance in$F_{\text{full}\mid C}$ across round-types should shrink. - Erasure-coded variant: orphaning behaviour differs entirely (no single seed peer needed). Different question — not directly comparable but useful as an alternative.
The dominant question the measurement answers: how much does
diversity-aware churn actually raise coverage on sparse-origin
rounds? If the answer is "meaningful gain" (
Blended diffusion only matters when 1-hop pre-diffusion has failed. To exercise it on a testnet you have to force pre-diffusion to fail:
- Suppress tx-submission on a controlled subset of nodes (or the whole mesh) for a window. Every EB in that window has to be blended-diffused.
- Introduce artificial mempool divergence by having a fraction of nodes accept transactions from a private endpoint that others don't see. π₁ rises artificially; blended-diffusion becomes the norm.
- Withhold: an adversarial-simulation variant where a bloc of nodes deliberately don't forward tx-submission but do forward blocks. Tests the report's §7 limitation 5 (adversarial withholding).
Under any of these, DeltaQ traces then show you the actual blended-diffusion dynamics under load. The report predicts what should happen; the trace shows what does.
This is where DeltaQ trace collection is most valuable, because it can challenge the report's framing rather than just confirming its numbers.
-
Inter-connection interface contention at forwarding nodes. When node B is forwarding a 12 MB closure from A to C, the fat LeiosFetch flow to C consumes a large fraction of B's outbound interface bandwidth. B's concurrent thin flows on other connections — tx-submission to D, chain-sync to E, KeepAlive echoes to F — share the interface with the fat flow. Note this is not intra-connection head-of-line blocking (the mux is fair at the SDU level, so tx-submission on the B↔C connection interleaves with LeiosFetch SDUs, not queues behind them). It's inter-connection competition for B's shared network interface, which degrades the thin flows only if the interface is genuinely saturated. Detecting this can go via cross-node correlation or local self-monitoring at B, using different signals:
-
Cross-node.
estBurstSis receiver-side — each of B's peers logs its ownestBurstSfor traffic from B, and a simultaneous drop across multiple peers of B during B's bulk-transfer window is the signature. -
Local at B (self-monitoring). Under NIC saturation, kernel
TCP throttles B's socket-to-D (the thin flow), the socket's
send buffer fills, and the mux write from the tx-submission
Wanton blocks — so bytes accumulate in the Wanton and
oldest-byte-age on B's per-mini-protocol egress queue grows.
A rising oldest-byte-age on B's thin-flow Wantons during B's
fat-flow window is the local signature of interface saturation
— per-mini-protocol, per-connection granularity, exactly what
we need. The dual signal is socket write-block latency:
time the mux egress thread spent blocked on a socket write
with the kernel send buffer full — the mux-visible echo of
the kernel-side congestion. Both traces are proposed in
track.md's "Measurements blocked on missing traces" (items 2 and 6) but not yet emitted; adding them would give B direct self-monitoring for this scenario, covering both sides of the stall (queue backing up, mux blocking on the socket). Complementary signals available today: aggregate outbound bandwidth from OS-level interface counters, and TCPInfo (tcpi_snd_cwnd,tcpi_retrans,tcpi_lost) which shows the kernel-side congestion state driving the mux stall.
The report models per-hop transfer time as if each connection has independent access to the wire (see
leios-report-gaps.mdgap 5 — per-node interface contention across concurrent connections is not modelled). -
Cross-node.
-
Round-to-round feedback. A round with heavy blended diffusion consumes mesh bandwidth that would otherwise carry tx-submission, which raises π₁ for the next round, which raises the blended-diffusion load again, which... The report treats rounds as independent Bernoulli trials. Time-series DeltaQ traces across many consecutive rounds show whether the mesh has this positive-feedback autocorrelation. If it does, the tail probability of consecutive-round failure is worse than the report's Bernoulli model implies.
-
α as a time-varying observable rather than a scalar. The report defers α (probability that pre-diffusion is operating normally) to a single number in the
α · P_cert,1-hopmixture, and treats it as a system-wide constant. But at each moment, per node, the observed fraction of arriving EBs whose π₁ stays below the 1-hop threshold is a direct sample of the α distribution — computable from EB arrival processing joined against local mempool state. That converts a hidden static parameter into a time series with a distribution, a tail, and cross-node covariance — the last of which is the important one: whether pre-diffusion failures hit the mesh in lockstep or independently is the difference between a globalP_certcollapse and quorum still meeting from healthier nodes, and the report's single-scalar α silently assumes the lockstep case. -
Recovery dynamics. After a pre-diffusion failure, how does the mesh recover? Do voters flag the miss and re-fetch aggressively? Does the tx-submission backlog burst-catch-up? DeltaQ traces around the failure event show the recovery signature — most importantly, whether recovery is monotone or oscillatory. Monotone recovery is safe; oscillation is a warning about latent instability.
-
Storm dynamics under concurrent EBs. Nothing forces exactly one EB per round to be certified concurrently — there could be multiple candidates propagating simultaneously. DeltaQ traces during multi-EB windows probe whether the mesh gracefully shares bandwidth or whether one EB starves the others.
-
Path-length skew. The report assumes a regular random graph. Real testnets have topology bias (regional clustering, hub nodes, degree variance). Reconstructed EB paths from cross-node correlation reveal the actual path-length distribution and whether it matches the report's assumed distribution. If typical paths are actually 4.5 hops rather than 3.6, the whole convolution shifts.
Item 2 above (round-to-round feedback) names the mechanism; this subsection names the pathological outcome and enumerates the measurements that bound it.
The failure mode. Sustained mempool arrival at or above the
level at which max-size EBs are produced imposes network cost
(EB body diffusion, closure fetch, vote diffusion, certRB
diffusion) and CPU cost (apply/reapply for validation) each
round. If certification fails at that operating point, the work
is not wasted — TxCache retains the TX bodies for reuse — but the
transactions themselves stay in the mempool, the next producer
sees a similar-or-larger backlog, and produces another max-size
EB. If the reason certification failed is a saturation in the
components TxCache does not amortize (network capacity for EB body
/ votes / certRB, per-node validation CPU, slow-node tail
dominance of
TxCache is necessary but not sufficient. TxCache amortizes the TX-body diffusion component of the closure and (if it caches validation state deltas) some of the apply/reapply cost. Without it, retries pay full closure and full validation cost and the livelock enters much faster. But TxCache does not add capacity to the pieces it doesn't cover:
- The EB body itself is a distinct network artifact and diffuses per round regardless of what's in TxCache.
- Vote and certRB diffusion are per-EB, TxCache-independent.
- Interface-level network saturation (per
leios-report-gaps.mdgap 5) is a capacity problem TxCache doesn't touch. - Persistent slow nodes dominating
$F_{\text{full}\mid C}(14)^N$ don't get faster because their TX-fetch was cached. - Under bursty multi-producer EBs with disjoint TX sets, cache locality erodes exactly when it's most needed.
Under sustained saturation on any of these axes, TxCache lowers the marginal cost of a failed round but does not raise the certification success rate above the underlying capacity ceiling.
The stabilizing lever is adaptive body sizing at production
time, not TxCache. A producer observing degraded mesh health
(previous-round certification outcome, local PeerRTT /
estBurstS degradation, mempool-vs-pre-diffusion gap) voluntarily
caps leios-conditional-diffusion.md's lever 2
and the reader-view section
above. Voter self-throttle (runtime Rec 3 enforcement, lever 3)
is complementary but weaker — it prevents committing to failing
rounds but doesn't reduce the load producing them.
TxCache's role in the safe regime is to make the transient retry period survivable while the adaptive lever converges to a sustainable body size. Under a well-tuned adaptive-sizing loop, TxCache is the amortization that keeps retry cost bounded during convergence. Under a mis-tuned or absent adaptive lever, TxCache alone does not prevent the runaway.
Ordered from cheapest (existing traces) to most involved (induced- failure experiments).
Detecting the feedback loop. Available today or with minimal instrumentation.
-
Per-round certification outcome autocorrelation. From
cardano-tracer's EB-certification traces, compute$\mathrm{Corr}(\mathrm{fail}(R), \mathrm{fail}(R+k))$ for$k = 1, 2, \ldots$ . Positive autocorrelation is the cascade signature; the decay rate quantifies memory depth. The independent-Bernoulli null hypothesis gives$\mathrm{Corr} = 0$ . -
EB body size vs prior-round outcome. Cross-tabulate round
$R+1$ 's body size against$\mathrm{fail}(R)$ . If body size systematically grows after a failure, that's the direct feedback signature. Available today from block-production traces. - Mempool depth trajectory across consecutive-failure runs. Does depth grow monotonically during a failure sequence, or does it stabilize? Unbounded growth signals the runaway. From the mempool-measurements dataset.
Quantifying TxCache's role. Splits the retry-cost savings attributable to TxCache from other sources.
-
Per-node TxCache hit rate, split by "TX belongs to a failed
EB from round
$R-k$ " vs "TX arrived via ordinary tx-submission". Reveals what fraction of retry savings is TxCache's contribution. - Closure size on retry. For consecutive EBs sharing overlapping TX sets, measure the actual closure-fetch bytes pulled at each node. Reduction vs full closure is TxCache's realised savings — per node, per round, per overlap fraction.
-
CPU cost of apply/reapply on retry, split by cache-hit status.
If TxCache caches validation state, retry cost should drop
sharply; if only TX bodies, revalidation cost is largely
unchanged. Uses existing
post-cip/apply-reapplyinstrumentation.
Finding the collapse threshold and recovery signature. Controlled experiments that induce the failure mode.
- Sustained-load-to-collapse sweep. Increase tx-submission arrival rate until certification failure rate crosses a threshold (e.g., >5% consecutive failures over a rolling window). Drop the arrival rate back to baseline and measure whether certification recovers. If certification stays stuck after load drops → livelock confirmed. Report the smallest load level above which recovery does not occur (the "livelock onset" boundary).
-
Induced-failure recovery experiment. Force a round to fail —
withhold votes at a controlled slice of the committee, or
inject a controlled network shock via
tc netem— then observe recovery: how many rounds until certification returns to baseline, and whether the trajectory is monotone or oscillatory. Signatures per item 4 above. -
Time-to-recovery distribution. Across many induced failures
at different load levels, measure
$\Pr(\text{recovery within } k \text{ rounds})$ as a function of load. A regime where recovery time diverges beyond the tx-arrival timescale is where livelock lives.
Tuning the stabilizing lever. Once producers use adaptive body sizing, calibrate its response.
-
Adaptive body sizing calibration. At the collapse threshold,
how much body-size reduction restores certification? Report
the operating curve
$S_{EB\text{-tx}}(\mathrm{load})$ that keeps the certification success rate above a target. -
Adaptive-sizing loop stability. When producers throttle,
next-round body size shrinks, certification recovers, mempool
grows, next-round producer sees lower degradation, body size
grows again. Whether this loop converges to a fixed point or
oscillates is the open question flagged in
leios-conditional-diffusion.md's follow-ups. Measure the loop-gain from perturbation experiments. - Voter self-throttle activation rate. How often does the self-throttle fire, and does the fire rate correlate with load? A throttle firing so often that certification never happens is a different failure mode (throttle-induced stall) but it's how the mesh avoids the livelock. Measurable from voter-participation traces once the runtime lever is enabled.
Cross-referenced signals from other measurements.
- Per-EB arrival log with certification outcome — the same log
powering
$\hat{F}_{\text{full}\mid C}(14)$ (perleios-priority-measurement.md). -
estBurstSandPeerRTTdegradation cross-referenced against the failure-autocorrelation series — links the transport-layer signal to the round-outcome signal. - Interface-saturation self-monitoring (oldest-byte-age and
socket-write-block latency, per
track.mditems 2 and 6) during heavy-round windows — signals whether the network layer is the binding constraint.
-
leios-report-gaps.mdgap 4 — the modelling gap this analysis is a downstream consumer of. - Item 2 (round-to-round feedback) and item 4 (recovery dynamics) above — the surrounding dynamics this section makes concrete.
-
leios-conditional-diffusion.mdlever 2 — the actual stabilizing lever this section relies on. -
leios-overlap.md's "Where the fit is not clean" — treats TxCache as a scalar π₁, which is the framing this section extends into dynamic-stability terms.
If this is your goal, the testnet setup differs slightly from the plain validation campaign above:
- Explicit forcing knob: a scripted way to enable/disable tx-submission per node. Cardano-node already supports peer-filtering hooks that could do this.
-
Per-EB arrival log: augment
cardano-traceroutput to include(node, EB_id, arrival_ts, forward_target_ts)records. Not currently emitted per-EB but the trace event exists at block-diffusion level. - Round-cadenced captures: raw DeltaQ traces on measurement nodes during a specific window around a forced-blending event, not just steady-state sampling. Higher temporal resolution during the interesting events, aggregated the rest of the time.
- Multi-round runs: at least 100 rounds under each of {full pre-diffusion, forced-blended, adversarial-withholding} to get tail estimates. The report's rare-event probabilities (14%, 31%) need substantial sample sizes to validate.
-
Tail estimation. The report's most stressed predictions are p99/p99.9 events. A week-long testnet with ~100 nodes running Leios at 1 EB/20s gives ~30k EBs. That's plenty for p95, borderline for p99, thin for p99.9. Some conclusions in the report about rare-event certification failure will remain paper-only unless you run longer or with more nodes.
-
Testnet vs mainnet mesh topology. Even if you match the number of nodes and regions, real SPO topology has network-of-network effects (relays behind stake pools, edge nodes on residential uplinks, community relays), that a controlled testnet doesn't reproduce. The blended-diffusion path distribution on mainnet may look quite different from a synthetic mesh. This is the same caveat as before but bites harder for blended-diffusion because path-length skew propagates through the convolution multiplicatively.
DeltaQ traces give you (a) the single-hop CDF inputs to the report's convolution directly, (b) with modest additional per-EB arrival logging, the end-to-end multi-hop composed behavior, and (c) — most interestingly — exposure to dynamics the report doesn't model at all: inter-protocol contention, round-to-round feedback, recovery signatures. To exercise blended diffusion specifically, you also need a way to force pre-diffusion to fail on the testnet. The report's static-scalar α becomes a measurable time series once you're collecting traces this way, which is a meaningful qualitative upgrade to the analysis.