Reports

Long-running capacity scaling tests.

The committee was grown from a single node to ten across three continents under saturating load, a relay and two edge leaves were attached, and then it was torn back down to one — a full 1→10→1 ladder. Twice, independently, on real cross-region infrastructure.

Each stage had to clear three gates before the ladder moved on: a committed-TPS floor, a committed-bytes floor, and chainHash agreement across every node. Both runs cleared all of them. The second run exists because one clean pass does not distinguish a fix from luck.

These runs are complete and final — the fleet was destroyed after the second report, so the numbers below will not change. Both ran the same build (9a5d58c) against the same genesis configuration.

Reading the tables

TPS is committed transactions per second, taken from each node's [block-commit] lines rather than from client receipts — what the chain agreed, not what was offered to it. n is the committee size. p50/p90 are submit→commit latency in milliseconds over a closed-loop cohort; a dash or n/a is the known small-cohort measurement artifact at large committee sizes, not a missing gate — the gates were still evaluated.

The runs

Run 1 · 22 July 2026 · automated harness PASS all 22 stages green
Result
Pass
Duration
2 h 07 m
Fleet
13 nodes
Committee
1 → 10 → 1
Regions
3

17:49:35Z → 19:57:15Z UTC. This was the acceptance retest after three consensus and persistence fixes landed that day. Its predecessor, on the same fleet, had failed fatally at stage 07 on a leader-election divergence wedge; this run completed the entire ladder.

Fleet

Thirteen c5.xlarge instances (4 vCPU, 7.5 GB), 48 GB EBS each, Ubuntu 24.04 on OpenJDK 21: ten committee nodes q0–q9, one relay r0, and two leaves l0/l1 that dial only the relay. Committee members were spread round-robin across eu-central-1, us-east-1 and ap-southeast-1.

This is an inter-continental deployment, not a LAN rig. WAN round-trips dominate quorum-certificate formation, which is why committed throughput here is round-trip-bound rather than CPU-bound.

Load

Open-loop TpsClient with 256 in-flight requests per client, a 90-second flood per committee checkpoint, and 3 to 6 clients scaled by committee size so offered load stayed above single-node capacity. Mixed workload — core owner claims plus application-ledger transactions with id-only bodies — submitted round-robin across every committee endpoint.

Per-stage results

StagenRegionsTPSCommitted B/s p50 msp90 msGateChange
011eu923.0193 854706806PASSbaseline
022eu,us354.274 385812856PASS+q1
033ap,eu,us547.3114 93210211037PASS+q2
044ap,eu,us558.9117 3799971229PASS+q3
055ap,eu,us620.6130 34210181846PASS+q4
066ap,eu,us457.896 140——PASS+q5
077ap,eu,us504.0105 853——PASS+q6 — prior run's FATAL point; clean here
088ap,eu,us471.899 09010691212PASS+q7
099ap,eu,us675.2141 794n/an/aPASS+q8
1010ap,eu,us541.2113 659——PASS+q9 (full committee)
1110ap,eu,us781.2164 06012243031PASSrelay + 2 leaves attached; convergence PASS
129ap,eu,us777.1163 20412231330PASS−q9
138ap,eu,us713.0149 74211601313PASS−q8
147ap,eu,us631.1132 55111401227PASS−q7
156ap,eu,us550.8115 67711121156PASS−q6
165ap,eu,us373.878 5269311016PASS−q5
174ap,eu,us284.959 8579991119PASS−q4
183ap,eu,us284.259 69510271123PASS−q3
192eu,us197.641 533819920PASS−q2
201eu1000.3210 094714756PASS−q1 (single node)
FINAL1eu1009.8215 118679760PASS1 quorum + 2 leaves via relay; convergence PASS
Stage 11 attaches the relay and leaves; FINAL re-verifies convergence.

Single-node throughput sits at roughly 920–1010 TPS, falls towards a WAN-bound floor as the committee grows, and recovers on the shrink path. Every stage passed all three gates.

Overload behaviour

In the multi-node WAN stages offered load exceeded committed throughput by roughly 2×, and the bounded mempool applied 503 queue_full backpressure — 143 events across the run — while the chain kept committing. Committed TPS is therefore a saturation ceiling, bound by BLS verification, block apply and WAN round-trips, rather than a limit on offered load.

What this does not prove. The offered-load figures are approximate: the client double-prints its summary, and committed TPS is measured over the block-commit span rather than the full 90-second wall window. At n=1 the relationship is measurement-sensitive rather than a clean overload demonstration. The robust evidence is the committee stages plus the presence of backpressure. Turning “holds under higher load” into a measurement needs a dedicated fixed-committee overload-curve stage, which this harness does not have.

Correctness

Across all ten committee nodes: zero pin-rejects, zero whole-block rejects, and zero stall-watchdog trips. Each node fired 3 to 13 explicit ownership checkpoints with no watchdog, deadline or hard-cap trip, and [qc-signers] was logged on every committed block — the parent-QC signer bitmask round-tripping correctly on every cross-node proposal, with no duelling proposers. Stage 07, the prior run's failure point, committed cleanly.

Storage

Every node ended below 12 % of its 48 GB volume. On q0, the busiest committee node, the chain database held 668 MB of backing store against 0.28 GB of logical committed payload — HSQLDB row and index overhead, not payload growth — across 8 703 blocks and 1 418 499 transactions. The redo log stayed at about 88 MB against a 512 MB threshold, sawtoothing rather than growing: the unbounded-growth failure mode the checkpoint discipline exists to prevent did not occur.

Verdict

Acceptance pass. The full ladder plus relay and edge topology completed with every gate green, at throughput consistent with the established baseline, with all three of that day's fixes validated on live cross-region infrastructure.

Run 2 · 22 July 2026 · operator hand-run PASS all 22 stages green · independent reproduction
Result
Pass
Duration
2 h 09 m
Fleet
13 nodes
Committee
1 → 10 → 1
Regions
3

20:10:58Z → 22:19:52Z UTC. A second, independent acceptance run, launched by hand on the same fleet directly after the automated pass, with the default harness invocation verified from the live process — no dry-run, no stage skipping, no environment overrides. Same fleet shape, same load profile, same build.

Per-stage results

StagenRegionsTPSCommitted B/s p50 msp90 msGateChange
011eu924.6194 187678696PASSbaseline
022eu,us301.263 259818853PASS+q1
033ap,eu,us490.3102 97110221064PASS+q2
044ap,eu,us569.1119 51910221036PASS+q3
055ap,eu,us438.892 157——PASS+q4
066ap,eu,us401.784 375——PASS+q5
077ap,eu,us536.8112 742——PASS+q6 — prior-run FATAL point; clean
088ap,eu,us724.4152 133——PASS+q7
099ap,eu,us650.4136 581n/an/aPASS+q8
1010ap,eu,us658.9138 384——PASS+q9 (full committee)
1110ap,eu,us773.5162 44312271328PASSrelay + 2 leaves; convergence PASS
129ap,eu,us788.2165 54512281283PASS−q9
138ap,eu,us750.4157 58712211338PASS−q8
147ap,eu,us731.7153 67011311229PASS−q7
156ap,eu,us568.3119 35711241228PASS−q6
165ap,eu,us426.589 57310251102PASS−q5
174ap,eu,us362.876 20110471126PASS−q4
183ap,eu,us291.961 32910241055PASS−q3
192eu,us201.742 382845920PASS−q2
201eu999.1209 839715750PASS−q1
FINAL1eu999.0212 818715738PASS1 quorum + 2 leaves via relay; convergence PASS
Stage 11 attaches the relay and leaves; FINAL re-verifies convergence.

The profile tracks run 1 closely — n=1 at 924 rising to 999 on the way back down, n=10 at 659, the relay stage at 773 — which is the point of the run: cross-run stability, not a new number.

Correctness

Sampled across q0, q5 and q9: zero pin-rejects, zero whole-block rejects, zero stall-watchdog trips, [qc-signers] on every committed block, and explicit checkpoints firing with no trips. Stage 07 clean again.

Storage

All nodes again ended below 12 % of 48 GB. q0 committed 8 231 blocks and 1 470 096 transactions for 0.29 GB of logical payload against 710 MB of backing store, with the redo log bounded at 174 MB under the same 512 MB threshold.

Verdict

Acceptance pass, second independent run. Two consecutive clean end-to-end passes on real cross-region infrastructure. The fleet was destroyed after this report.

Provenance

Both runs came from the 130-ec2-scaling-test harness (run-scaling-test.sh). The numbers above are transcribed from each run's report.md, which is kept alongside this site's source together with the run manifests. The raw evidence — per-node DEBUG logs and per-client submit summaries, several gigabytes per run — is archived outside the repository.