Skip to content

Instantly share code, notes, and snippets.

@zmanian
Created July 26, 2026 21:08
Show Gist options
  • Select an option

  • Save zmanian/8d0b2e3221320c7b1602116bf8e87691 to your computer and use it in GitHub Desktop.

Select an option

Save zmanian/8d0b2e3221320c7b1602116bf8e87691 to your computer and use it in GitHub Desktop.
Did the July 18 zcashd deprecation change Zcash orphan (stale block) rates? Measurements from the Sovright relay network observatory, 2026-07-26

Did the July 18 zcashd deprecation change Zcash orphan rates?

Short answer: no evidence that it did. Two independent instruments both show flat-to-slightly-lower stale-block rates after 2026-07-18. A subtle effect cannot be excluded, and a clean answer was structurally impossible for reasons worth stating up front.

Data current as of 2026-07-26. Measurements come from the Sovright relay's network observatory.


The public data

https://relay.sovright.com/public_telemetry.json

No key, refreshes every 30s. Relevant fields:

field meaning
orphan.orphan_rate_pct / .orphans / .judged trailing-24h stale rate
orphan.history[] {ts, orphans, total, orphan_rate_pct}, hourly, 7-day sliding window
orphan.by_pool[] per-pool orphans / blocks

How the number is produced

Heard-vs-canonical. Our P2P ingress records the consensus_hash of every block it hears on the network. After a ~10-minute settle, each is checked against a local Zebra full node's main chain. A block that was heard but is not on the chain is an orphan.

The ingress hears ~1160 distinct blocks per 24h against ~1150 produced, so coverage is effectively complete including the losers — which is the part naive methods miss.

Two methods we tried and rejected, in case you are tempted by either:

  • Explorer polling under-counts to ~0.03%. It misses fast reorgs entirely.
  • Zebra's chain fork log over-counts ~3x. Roughly 2/3 of those events are a node's own out-of-order block receipt and candidate-chain switching, not genuine network orphans. See the caveat below — this matters.

Limitation: the authoritative series cannot see July 18

The orphan history is a rolling 7-day window. As of today it begins 2026-07-19. The deprecation date has already been pruned, and it slides further out of reach daily. Nobody was archiving the long record.

So the only pre-deprecation comparison available from the authoritative instrument is a single spot reading:

stale rate
Pre-deprecation, 2026-07-08 (one full 24h window) 0.521%
Post-deprecation week, 169 hourly windows (07-19 → 07-26) mean 0.432%, median 0.360%, range 0.090–0.918%

The July 8 reading sits at the 63rd percentile of the post-deprecation distribution, with 62 of 169 post-windows running higher. Nothing anomalous.

That is one "before" against 169 "after". It rules out a large step change. It says nothing about a subtle one.

Day-to-day variance you would be reading against

Daily medians of the trailing-24h rate:

07-20  0.582%    07-21  0.536%    07-22  0.354%    07-23  0.179%
07-24  0.352%    07-25  0.792%    07-26  0.269%

A 4x swing across a week with no trend. At ~1150 blocks/day, a 0.5% rate is about 6 events — single days are dominated by Poisson noise. Any real deprecation effect needs weeks to separate from this.


Second instrument: Zebra chain-fork counts, which do span July 18

Zebra's journal retains ~2 months, so this proxy reaches back before the deprecation. Critically, the fleet ran zebrad 6.0.0 from 07-12 to 07-22, which gives a same-version window either side of July 18 — no instrument change confounding the comparison. (July 18 itself is excluded as the transition day.)

Three geographically independent full nodes:

node region pre/day (07-13→17) post/day (07-19→22) ratio
us-central1 11.60 7.50 0.65x
europe-west4 7.20 7.75 1.08x
asia-east1 8.80 6.25 0.71x
pooled 9.20 7.17 0.78x

All three are flat-to-lower, scattered around 1.0 with europe slightly up. One-sided p for an increase = 0.97.

The caveat that limits this

This proxy is not merely biased — it does not track the authoritative metric. Over the 7-day overlap where both exist, daily pooled chain-fork counts vs the authoritative daily rate give Pearson r = -0.45 (Spearman -0.29). n=7, so weak either way, but it is certainly not positive tracking. The local-artifact component dominates day-to-day movement.

Consequence: the proxy's stability across July 18 is decent evidence that nothing dramatic happened to fork/reorg behavior, and poor evidence about the true orphan rate. We do not use it to put a numeric bound on a change in the real rate, and neither should you.

One more open thread: there is an unexplained step in chain-fork volume on 2026-07-01 (~24/day in June → ~9/day in July) that is not a Zebra version change. It falls well before July 18 and so does not affect this comparison, but it is unexplained, and we would want it understood before leaning on this proxy for anything load-bearing.


Do not read by_pool from a single snapshot

Per-pool stale rates are the easiest thing here to over-read.

  • 2026-07-25: ViaBTC held 6 of 9 orphans — 1.16% vs 0.48% for everyone else.
  • 2026-07-26, one day later: Foundry 3/150 = 2.00%, ViaBTC 1/519 = 0.19%.

The ranking inverted in a day. ViaBTC's apparent skew was its 44.4% share of blocks, not a defect: expected 4.09 of 9 at the network rate, Fisher one-tailed p = 0.17. Attributing every canonical block to a pool showed ViaBTC at the network median propagation latency with the smallest blocks of any major pool — no mechanism.

Exposure dominates. A pool mining 44% of blocks collects ~44% of orphans with nothing wrong. Per-pool claims need the blocks denominator and weeks of accumulation.


Terminology

"Uncle" is Ethereum's term for a stale block that still earns a partial reward. Zcash has no uncle mechanism — an orphaned block earns nothing. The quantity here is the orphan/stale rate: blocks that were validly mined and propagated but lost the race and pay out zero.


Summary

  1. No evidence that the July 18 zcashd deprecation raised orphan rates. Two independent instruments both read flat-to-lower.
  2. A subtle effect cannot be excluded. The authoritative window had already slid past July 18, and the proxy that does span it is not a reliable measure of the true rate.
  3. Current network stale rate is ~0.4%, consistent with the ~0.5% we have measured since early July.

Corrections welcome — the endpoint above is live and open, so anyone can check this independently.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment