Tempnet: 2027 Chipnet Upgrade & Pre-Upgrade Testing

PSA: orphan rate on tempnet is expected to be artificially higher due to testnets dropping difficulty to 1 if no block has been found in 2x the target time.

When baseline difficulty is low (now it is ~3) the impact of this is low, but this would change if someone were to point an ASIC at it and blow up the baseline difficulty.

At normal difficulty, 13.5% of block intervals are expected to exceed 2x the target time (Poisson distribution), which triggers the drop to difficulty 1 (just ~4.3 GHashes to find a block, matching ~72 MH/s at the 60s target time).
When that happens, the network will find the next block much faster.
How much faster?
It depends on the baseline difficulty.
If dropping from 3 to 1 (as is currently the case on tempnet) then the expected time to find the next block will go down from 60s to 20s.

Combined expected orphan rate is thus:

  • testnet_orphan_rate = 0.865 * orphan_rate(60s) + 0.135 * orphan_rate(60s / baseline_difficulty)

If we expect 1% on 60s mainnet then on tempnet (with baseline difficulty 3) it would grow to about 1.27%.
But if the baseline difficulty were higher, e.g. 1000, then the network would find a block 60ms after the difficulty drop! This is assuming miners are optimized to make use of difficulty=1 as soon as it becomes available.

If they’re not optimized and their getblocktemplate polling straddles the boundary, then the impact will be lessened, as they won’t all start mining at difficulty=1 at the same time, and so the risk of an orphan race will be lower.

PS I ported this CPU miner https://github.com/A60AB5450353F40E/bitcoin_solo_miner

  • git clone https://github.com/A60AB5450353F40E/bitcoin_solo_miner.git,
  • build with cargo build --release and
  • copy the repo’s .env and *.txt files into the binary’s folder, edit as necessary, and then
  • just run ./bch_solo_miner

Notes:

  • Use the Bitcoin legacy address format, because I didn’t bother implementing CashAddress.
  • The BCHN RPC needs to be patched to add target_time to getblocktemplate (the wip2 branch has it now).
  • My miner was broken and was producing lots of orphans due to staleness; it’s fixed now.
2 Likes

Note 1: This theoretical orphan rate is no higher than the calculated orphan rate for testnet 10-mins using the simplified model that BCA is operating from.

Note 2: We don’t see this theoretical orphan rate in practice on testnets because the math used to generate this prediction threw out information from the real world.

Note 3: It’s important that your models do not toss out information from reality inadvertently. Often scientists defend their failed theories with “Well the math checks out”.

This is a false statement. It is not expected to be.

2 Likes

Because criterion is 2x the target time, Poisson process means 14% of blocks will have difficulty=1, no matter the target time, but that doesn’t mean each such block will have a competitor.

We DON’T expect exactly 14% orphans - that’s just the upper bound, and will depend on number of active miners, their hashrates and configurations.

Anyway, I need to resist the urge to go further down this rabbit hole, porting that Rust miner was enough curiosity satisfaction for the day :slight_smile:

1 Like

I didn’t. Now we have a Rust-based testnet miner that uses midstate optimization, pulls 90–100 MH/s with a 6-core Xeon, and is optimized to switch to difficulty=1 as soon as it becomes available.

See my updated post above :slight_smile:

I suspect ASIC miners aren’t optimized to exploit the difficulty=1 drop as soon as it is available. It would be interesting to go further down the rabbit hole and optimize them, then see what happens with testnet’s orphan rates.

Hi all, we are PulseHawk, independent blockchain measurement. We counted Tempnet block headers from activation to 21 Oct 10:00 UTC and want to share the numbers, mostly for the MTP and tick questions above.

Window 15 Oct 12:56 to 21 Oct 09:59 UTC, heights 327,989 to 335,560, 7,572 blocks. Our own headers over P2P, chain and PoW checked, cross checked with two Tempnet peers (500 of 500 hashes equal).

counted expected at 60 s
mean interval 67.07 s 60 s
median interval 43.0 s 41.6 s
p90 / p99 125 s / 232 s 138 s / 276 s
over 5 min 0.38% (29 blocks) 0.67%
block time minus MTP before it, median / p90 / p99 335 / 524 / 765 s 340 / 557 / 786 s
10 blocks, median / p99 568 / 1,229 s one 600 s block 416 / 2,763 s

On MTP (@Rufitnes). A block timestamp sits a median 335 s ahead of the MTP before it, 765 s for 1 block in 100. That matches what 11 blocks at 60 s predict. So with 1 minute blocks MTP trails block time by about 5.6 minutes typically and up to about 13 minutes, and anything that locks on MTP should plan for that spread.

On 10 block windows. Ten 1 minute blocks took a median 568 s with p99 1,229 s, against 416 s and 2,763 s for one 600 s block. Similar median, much smaller spread.

What we cannot judge yet. 3,455 of the 7,572 blocks carry minimum difficulty (all of them on 15 and 17 Oct, 87 on 21 Oct), so difficulty adjustment after hashrate jumps cannot be read cleanly. The longest gap was 20,863 s at height 328,223 on 16 Oct, on a testnet with few miners.

We keep counting and post here every Wednesday until 15 Nov, with a final summary that day. If there is a number you want counted for your tests, ask here.

6 Likes

Hi and welcome, and thanks for the freebie!

independent on-chain counts. we measure fast proof of work chains under load.

TIL such a service exist (https://pulsehawk.io/), it may come in handy (and prices are approachable)!

Interesting measurement on ZCash’s 25s blocks:

In our listener window on 17 October 2026, 14:51 to 20:21 UTC, 5 of 780 announced blocks did not land in the chain, 0.64%, each at depth 1.

1 Like

Welcome to Bitcoin Cash Research! Very cool to see this independent verification. Will you be putting in a statement about the upgrade itself? Are you for/neutral/against 1 minute blocks? https://www.consensus.cash/

It’s the endorsement and lock in window right now so it’s very interesting to get perspectives from people who are just appearing in the community as to their initial impression.

2 Likes

Thanks both, glad it’s useful.

@BitcoinCashPodcast we stay neutral on the CHIP by design, and we won’t sign a statement for or against. Our job is to count what the network does and publish it with the method, so anyone can check it, whatever they think of 1 minute blocks.

@bitcoincashautist thanks for the kind words. With the lock in window open, is there one number you’d find most useful from tempnet before 15 Nov? For example how often a block is announced but does not land in the chain, which we counted on Zcash, or how far MTP trails real time after a fast run of blocks. If it helps your tests, we’ll add it to Wednesday’s count.

4 Likes

I have added tempnet support in my block explorer at https://BlockExplorer.cash and also to the transaction visualiser at https://aquarium.cash

Node stats at https://node.galt.cash

This is not a statement of support or rejection for 1 minute blocks.

3 Likes

Yes, this; generally, the data that does NOT become part of the canonical chain is the most valuable, things like:

  • orphaned blocks
  • node-local receive/accept times (so we can compare vs header timestamps)
  • whether the compact blocks fast relay path was exercised (and info on missing TXs count if not)
  • propagation time from watching INV messages
1 Like

I vibecoded this this evening I hope is useful.

https://github.com/rufitnes/tempnet-data — live dashboard: BCH tempnet · live telemetry

Short version: node-local receive/accept times :heavy_check_mark: · compact relay exercised, with missing-tx counts :heavy_check_mark: (none so far) · reorgs/orphans ✘ (none yet, watching) · INV-level propagation ✘ (not possible with stock logging). Method, definitions and caveats are in the README, and the raw CSV is there if anyone wants to slice it differently.

PulseHawk counts what ends up in the chain; this captures what a node sees on the way there and the parts that never get there. (Our full-range numbers line up with theirs.)

If someone runs the same capture from a different network path, we can compare.

4 Likes

Cool, looks nice! Note that receive_delay is a bit misleading, suggest timestamp_deviation, because a miner can timestamp anywhere in the <MTP, FTL> range (about -5min / +2h tolerance), and they don’t have to update the timestamp after every hash so even if honest – there could be some delay behind real miner’s time.

Re “Why these numbers look odd”:

  1. Flat hash and difficulty Poisson distribution would have average 1 minute but median ~0.693 x 60 = 42s!
  2. Distribution is skewed due to testnet rule which drops difficulty to 1 whenever no block has been found for 2x the target time (2 minutes) - there can’t really be stalls for hours on such testnet unless nobody’s mining or is mining with such low hash that the lowest difficulty block takes some time, or miner is not configured to immediately “exploit” the difficulty drop.
2 Likes

Public Electrum endpoints for tempnet:

tempnet.pub.rapids.cash
TCP 65001 / SSL 65002 / WS 65003 / WSS 65004

(Also available: mainnet, chipnet, testnet3, testnet4)

Uptime not guaranteed, regular short downtime with code updates still expected on all chains.

2 Likes

thanks, that list is exactly what we were after. and thanks to rufitnes for the capture and for checking it against ours, good to see the full range line up.

on the 42 s point, our window from 15 oct to 21 oct came out at a median of 43.0 s against the 41.6 s a flat Poisson process gives. so the median alone looks healthy and the testnet difficulty drop shows up in the tail instead.

for the weekly count on wed 28 oct we are looking at adding a capture from our own P2P client on a separate network path, with first announce times per block and anything announced that never ends up in the chain, using timestamp_deviation as suggested. if it holds up we will post it next to rufitnes’ numbers so the two paths can be compared.

1 Like

PSA I did some patches to @9500’s build, ran a private "tempnet’, and then, using a live node, I mined 115 blocks to test some specific cases: verified halvings, ABLA, ASERT, coinbase maturity, locktimes, and sequences all behave correctly across the seam. Also, verified the duplicate coinbase shape rule escapes (locktime or version). Technically, if you patch chainparams to match mine you can turn it into a live network and continue mining. :slight_smile: (mainnet params with some overrides: all past upgrades active from block 1, halving interval 21 blocks, and ASERT half-life 3600s).

I’ll release this mini chain soon, and I intend to make it into a unit tests fixture in BCHN.
Notice the 2 big blocks, that’s testing ABLA at the seam and mining exactly at max. for the last 600s block and first 60s block, which tempnet can’t do now.
And I ramped difficulty up enough before activation to test the ASERT seam, too.

N=101 time=2026-10-16 01:16:04 UTC mediantime=2026-10-16 01:13:53 UTC difficulty=8.390489522240577 size=147
N=102 time=2026-10-16 01:16:16 UTC mediantime=2026-10-16 01:15:25 UTC difficulty=9.396351449137374 size=147
N=103 time=2026-10-16 01:17:28 UTC mediantime=2026-10-16 01:15:28 UTC difficulty=10.52396643513509 size=32000000
N=104 time=2026-10-16 01:18:28 UTC mediantime=2026-10-16 01:15:40 UTC difficulty=1.165087379331188 size=3200188
N=105 time=2026-10-16 01:19:28 UTC mediantime=2026-10-16 01:15:52 UTC difficulty=1.165087379331188 size=147
N=106 time=2026-10-16 01:20:28 UTC mediantime=2026-10-16 01:16:04 UTC difficulty=1.165087379331188 size=217
N=107 time=2026-10-16 01:20:40 UTC mediantime=2026-10-16 01:16:16 UTC difficulty=1.165087379331188 size=147
N=108 time=2026-10-16 01:20:52 UTC mediantime=2026-10-16 01:17:28 UTC difficulty=1.175895356348238 size=147
N=109 time=2026-10-16 01:21:04 UTC mediantime=2026-10-16 01:18:28 UTC difficulty=1.186798261499457 size=147
N=110 time=2026-10-16 01:21:16 UTC mediantime=2026-10-16 01:19:28 UTC difficulty=1.197817663401082 size=147
N=111 time=2026-10-16 01:21:28 UTC mediantime=2026-10-16 01:20:28 UTC difficulty=1.208932096146396 size=147
N=112 time=2026-10-16 01:22:28 UTC mediantime=2026-10-16 01:20:40 UTC difficulty=1.220163842859803 size=147
N=113 time=2026-10-16 01:23:28 UTC mediantime=2026-10-16 01:20:52 UTC difficulty=1.220163842859803 size=212
N=114 time=2026-10-16 01:24:28 UTC mediantime=2026-10-16 01:21:04 UTC difficulty=1.220163842859803 size=212
N=115 time=2026-10-16 01:25:28 UTC mediantime=2026-10-16 01:21:16 UTC difficulty=1.220163842859803 size=152
4 Likes

Please update your repo – it doesn’t contain the latest code fixes.

Latest code is here: Commits · blocktime/wip2 · Calin Culianu / Bitcoin Cash Node · GitLab

EVERYONE: 9500’s build has bugs in it please have him resynch it from my upstream and release a patched version that is synched to latest. It has p2p network bugs and other assorted nonsense – it’s 15 days old at this point and the code wan’t in great shape back then.

URGENT please have 9500 update this!!!

5 Likes

I applied his patches on top of latest wip2, here: Files · tempnet · ac-0353f40e / Bitcoin Cash Node · GitLab

git clone https://gitlab.com/0353F40E/bitcoin-cash-node.git
cd bitcoin-cash-node
./contrib/tempnet/build.sh

apply config to ~/.bitcoin/bitcoin.conf then just:

cd build/src
./bitcoind
4 Likes

Repo updated, planned to do it sooner but didn’t get to it. Will try to keep it in sync. Thanks @bitcoincashautist for quick reaction and publishing updated fork.

4 Likes

Verified tempnet blocks using CHIP’s implementation of consensus rules:

[ABLA Ticks] Auto-configured epsilonMax: 2837960626724546304, betaMax: 9459868755748488064
seeded schedule from --activation-height=327988
loaded 3913 checkpoint prevouts
loaded 21584 ABLA rows
loaded 21583 header rows
replaying 230137203 bytes from chain_327900.raw, checkpoint height 327899 tick 196739400 tau 600->600
  verified 20 blocks, height 327919 (000000000000163fa5ead574bb7d66512365946c14e12d21c434e5a5b32525ec)
  verified 40 blocks, height 327939 (00000000000012b3eb87341896ade8af956f9e1d6dbce8369cbeefdb17b76dc9)
  verified 60 blocks, height 327959 (0000000000001d7875561c623341f792867750809e50471b2ad7965d11c85032)
  verified 80 blocks, height 327979 (0000000000000025955d6377c459b14cfdf13c38e80759c71d150a64549f7cdc)
H_a confirmed at height 327988 by the CHIP predicate
interval change at height 327989: 600 -> 60 (tick 196792860)
  verified 100 blocks, height 327999 (0000000000d618c0f13bf85a15b57a9ea234d14bc6b997658dc569bbacc7d7cf)

...

  verified 21580 blocks, height 349479 (000000000000740ab2dd68eee07db95e8cd2d2d213322bd9d9543116a1113eba)

=== blockchain_test ===
network:            chipnet
blocks verified:    21583
height range:       327900..349482
tip hash:           00000000000077f75f32327def108bd904adb35eef79ff147b1dac7aa705b283
tip tick:           198082440
transactions:       314784 (non-coinbase 293201)
2027 activation:    height 327988
abla activation:    checkpoint
abla rows compared: 21583
header rows checked:21583
subsidy total:      5596000000000 sats
fees (known):       489305902 sats over 21583 blocks (0 txs with unknown inputs)
work since start:   00000000000000000000000000000000000000000000000005d5ebc973fabc33
timelock checks:    314784 ok, 0 skipped (utxo gap)
warnings:           0
failures:           0
PASS

Details and reproduction: “Full-Chain Replay Verification”

4 Likes

Week two of our tempnet counts, this time with a listener on our own network path. We said Wednesday and this is two days late, sorry for that.

How we count. A listener without its own node keeps connections only to tempnet peers that confirm the fork at block 327,989 and logs every block announcement with its message type (inv, headers, cmpctblock), a peer label such as peer_1 and the arrival time in milliseconds. We then match the announcements by hash against our own header chain, fetched over p2p and checked for linkage and proof of work. For each block we request one cmpctblock from the first announcer and estimate missing transactions from the BIP152 short IDs against the transactions announced to us by inv.

Coverage. The listener ran from 25 Oct 09:15 utc to 28 Oct 07:36 utc in 14 segments, 71.7 h in total. There are two gaps between segments, of 6 min 57 s on 25 Oct from 09:27:47 utc and of 1 min 35 s on 26 Oct from 12:37:49 utc. Each segment held 31 to 47 peers that confirm the fork.

Block intervals, 21 Oct 10:00 utc to 28 Oct 10:00 utc, blocks 335,561 to 345,613

counted computed for 60 s
intervals 10,053
mean 60.16 s 60 s
median 45.0 s 41.6 s
p90 132.0 s 138.2 s
p99 212.5 s 276.3 s
share above 5 min 0.02 % (2) 0.67 %
longest gap 334 s, before block 335,881 on 21 Oct 15:45:56 utc about 588 s
timestamp minus median time past, median / p90 / p99 355 / 518 / 658 s 340 / 557 / 786 s

In the same week 1,364 blocks carry the minimum difficulty.

Listener, blocks 341,252 to 345,470 (4,207 blocks)

We saw every one of the 4,207 chain blocks announced, in the median by 22 peers.

counted
first seen by inv 4,205
first seen by headers 2
first seen by cmpctblock 0
timestamp_deviation, median / p90 / p99 0.78 / 3.40 / 31.1 s
timestamp_deviation, smallest / largest 0.08 / 196.0 s
propagation_spread, median / p90 / p99 7.6 / 10.8 / 16.7 s
stale blocks after 6 confirmations 16 of 4,223 announced (0.38 %)
cmpctblock received on request 4,204
cmpctblock received unsolicited 0
short IDs per block, median / p90 / largest 5 / 25 / 78
missing transactions (estimate), median / p99 / largest 0 / 1 / 10

timestamp_deviation is first seen minus the header timestamp, the name bitcoincashautist suggested in this thread. It is not a pure propagation value because miners set the timestamp within the rules. Of the 42 blocks above the 99th percentile, 41 carry a header timestamp exactly 120 s after their parent, and none of them carries the minimum difficulty.

propagation_spread is the last minus the first announcement across our peers, for blocks seen from at least two peers. It describes the spread at one listener over 20 to 50 connections, not the propagation time across the network.

A stale block here is a block that was announced to us but is not in the chain 6 blocks later. The full list with height, hash, header time, first seen and number of announcing peers is in the CSV linked below.

Why the compact block numbers are an estimate. We run no mempool. We count the short IDs that match no transaction announced to us by inv. A real node also knows transactions it validated itself, so this approximates what a node would have to request.

Why cmpctblock almost never arrives as an announcement. Under BIP152 a node pushes new blocks as cmpctblock right away to at most three peers that it picks itself as high bandwidth peers, usually the peers that recently delivered blocks first. A listener that never relays blocks is never picked, so every other peer announces by inv or headers and sends the cmpctblock only on request.

Next to rufitnes/tempnet-data. We matched our 4,207 blocks by hash with the public data at commit 787f561 (snapshot 345,617), and all of them are in both sets.

counted source rufitnes/tempnet-data
timestamp_deviation, median / p90 / p99 0.78 / 3.4 / 31.1 s 1 / 4 / 33 s
blocks via compact 4,204 (on request) 4,189
missing or requested transactions, median / p99 / largest 0 / 1 / 10 0 / 1 / 10
stale blocks or reorg events 16 stale blocks 0 reorg events

The reorg count and our stale count measure different things. A node logs a reorg only if it had already moved its tip to the block that later lost, and a node that receives the winning block first never logs one. The time columns use whole seconds on his side and milliseconds on ours, and the two clocks are not aligned.

One caveat after cculianu’s note on the 9500 build. Our listener window ends on 28 Oct, before that build was resynced on 29 Oct, so the announcement and stale numbers above come from a network where some peers may still have run the older code. For the count on Wed 4 Nov we will split the week at that change and show both halves side by side, so any p2p effect of the fix becomes visible.

Data, one row per block, is at github.com/neoalphavault-png/kaspa-pulse on branch messung/bch-tempnet, file data/bch/tempnet-woche2-bloecke-2026-10-28.csv. The listener keeps running until the tempnet ends on 15 Nov.

3 Likes