Tempnet: 2026 Chipnet Upgrade & Pre-Upgrade Testing

Hi all, it’s time to test-upgrade Chipnet for 2026 :rocket:

Having a live test network makes it a bit easier for ecosystem software to experiment with CHIPs, perform integration testing, and demo new use cases.

For anyone interested, I plan to fork from chipnet at 1757937600 MTP (2025-09-15T12:00:00.000Z) – that’s the same time (on September 15) as the typical chipnet upgrade (on November 15) and mainnet upgrade (on May 15).

I’ll spin up some new “september-net” infrastructure and keep it online through November 15, at which point I’ll redirect everything to chipnet. I plan to use this BCHN branch:

Big thanks to @cculianu for tirelessly testing and optimizing BCHN’s implementation over many months now. :pray:

The 2026 upgrade activation code isn’t expected to differ from last year’s upgrade, but if other node implementations would find it useful, we could maybe also plan another coordinated test upgrade for 1760529600 MTP (“october-net”, 2025-10-15T12:00:00.000Z). (For stability in test applications and block explorers, I’ll likely still keep my infrastructure pointing to the Sept. 15 fork until the actual chipnet upgrade.)

Any volunteers to run nodes and mine are appreciated – I’ll post more detailed instructions here next week on setting up a node and connecting to the network.

Please post connection info, links to software patches, links to your projects, and testing-related tips below. Thanks!

9 Likes

Sounds awesome.
May I suggest to plant a poison pill in this branch so the network self dies at Nov 15th?
That way there is no way we will end up with (yet another) testnet.

3 Likes

FWIW, as one of the few chipnet operators I have no plans of supporting september/octobernet, just vanilla chipnet. I doubt anyone other than jason will run the infrastructure, so the forked networks should die on their own

Hi all, I created a BCHN patch to make connecting to the pre-upgrade “tempnet” easier – you can clone the tempnet branch here, build BCHN normally, and set tempnet=1.

Tempnet

  • Tempnet is a temporary network designation that’s easy to fork from chipnet (just hard-code a new activation MTP)
  • Uses its own storage – doesn’t corrupt your chipnet data even if running in the same data directory
  • Automatically expires shortly after the real chipnet upgrade (thanks for the idea @Jonas!)

If you setup a tempnet node following the instructions below: shortly after the Nov 15 upgrade, your node will automatically restart itself, keep an archive of the old tempnet chain data, and re-join chipnet.

The hard-coded tempnet configuration in the patch has seed nodes, a DNS seeder, and a block explorer here. I’m also forwarding transactions from chipnet to tempnet, so if you’re careful to start with pre-Sept 15 chipnet UTXOs, any demo transactions you create on tempnet can be re-sent on chipnet in November.

getblockchaininfo.upgrade_status

For convenience, the patch also adds an upgrade_status field to getblockchaininfo (screenshot from a previous tempnet):

Here are the fields currently (before the Sept 15 tempnet upgrade):

"upgrade_status": {
        "name": "May 2026 Upgrade (tempnet)",
        "mempool_activation_mtp": 1757937600,
        "block_activation_height": null,
        "block_activation_hash": null,
        "software_expiration_mtp": 1763208000,
        "mempool_activated": false
    }

Activation Covenant & Activation Transaction

The tempnet configured in this patch forks cleanly by requiring a specific hard-coded activation transaction to appear in the next block following activation. The “activation covenant” is already on chipnet here:

It’s a P2S output (nonstandard until the upgrade, but was manually mined directly into a block), and it contains a covenant requiring all of the 2026 proposals. If you’re curious, here’s a Bitauth IDE import for the activation covenant.

Activation transaction hex

Here’s the activation transaction – TXID: a746c4381e63b2aea80a6ea13951a4ba79d70b39829fe833bbd904adf39be946:

020000000130d1c3a524c4b208e6c1b558b110749f4ae1d431373b10a963f3ff9d873db75700000000040279015d00000000010000000000000000a9ef30d1c3a524c4b208e6c1b558b110749f4ae1d431373b10a963f3ff9d873db757608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a043230323600000000

And here’s a P2SH20 version that’s preloaded on chipnet as well (might be easier to broadcast from some software that has trouble with P2S inputs before the first-activated block) – TXID: a40668a130ae4f081fa102c4450fa98644d3379790988a5c8e548b9b8ccf8329:

0200000001354ecde42b3e8506067bbab450e2965d7929a49400c2597ab167cad570b2884700000000450279015d400d00517b658c6b7d936c739166774f89564f8a885d4f8ac252c451c5cc006ed36fcbcd830695fbcdcfcdc952568d00d2827c810000c800d16588749166c3518700000000010000000000000000a9ef354ecde42b3e8506067bbab450e2965d7929a49400c2597ab167cad570b28847608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a043230323600000000

Setup a tempnet node

Finally, here’s how you could setup a tempnet node on a new Ubuntu machine (building yourself for lower trust and easier patching):

git clone https://github.com/bitjson/bchn.git # defaults to "tempnet" branch
cd bchn

# Install dependencies (Ubuntu) 
sudo apt install build-essential cmake git libboost-chrono-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libevent-dev libminiupnpc-dev libssl-dev libzmq3-dev help2man ninja-build python3 libgmp-dev zlib1g-dev

# Build BCHN
mkdir build && cd build
cmake -GNinja .. -DBUILD_BITCOIN_WALLET=OFF -DBUILD_BITCOIN_QT=OFF -DENABLE_NATPMP=OFF -DCMAKE_BUILD_TYPE=Release
ninja

If you’re running on a very low-memory machine (cheap VPS), you’ll need some swap to build (skip this if ninja succeeded above):

sudo dd if=/dev/zero of=/swapfile bs=64M count=64
sudo mkswap /swapfile
sudo swapon /swapfile
ninja

Then install the BCHN you built:

sudo ninja install
mkdir ~/.bitcoin
nano ~/.bitcoin/bitcoin.conf

When the nano editor appears, paste:

txindex=1 # not required, but useful to have around
tempnet=1

Ctrl+S to save, Ctrl+X to close.

Then setup the service by running nano /etc/systemd/system/bitcoind.service, and paste: (assuming you’re root in a cheap VPS, if not, run pwd to see your build and/or user directory path)

[Unit]
Description=Bitcoin Cash Node service

[Service]
WorkingDirectory=/root/
ExecStart=/root/bchn/build/src/bitcoind -datadir=/root/.bitcoin
Restart=on-failure
RestartSec=5
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

Ctrl+S to save, Ctrl+X to close. Then setup bitcoind to run automatically:

systemctl daemon-reload
sudo systemctl enable bitcoind.service

You’re done – make sure your node starts on boot by trying it now: sudo reboot. When you reconnect, tail the logs to see if it’s alive: tail -f ~/.bitcoin/tempnet/debug.log.

Summary

3 Likes

The September 15 tempnet automatically forked cleanly from chipnet :rocket:

Block #271016 differs between tempnet and chipnet. The activation transaction spent a P2S covenant that requires the loops, functions, p2s, and bitwise CHIPs.

Thanks @ichundes for reporting a sync issue for the tempnet branch (I messed up the final Git squash last night) – I also clarified the upgrade_status response mentioned above:

Example output before an upgrade activates:

  "upgrade_status": {
    "name": "May 2026 Upgrade (tempnet)",
    "mempool_activation_mtp": 1757937600,
    "block_preactivation_height": null,
    "block_preactivation_hash": null,
    "block_postactivation_height": null,
    "block_postactivation_hash": null,
    "software_expiration_mtp": 1763208000,
    "mempool_activated": false
  },

And after an upgrade activates – i.e. the final details for this tempnet:

  "upgrade_status": {
    "name": "May 2026 Upgrade (tempnet)",
    "mempool_activation_mtp": 1757937600,
    "block_preactivation_height": 271015,
    "block_preactivation_hash": "00000000023062becd19275fa2ec7cbe32d3eb5329708ccb006143865f010af7",
    "block_postactivation_height": 271016,
    "block_postactivation_hash": "00000000163a426b4dfe4a484b8753c918f58b8cb9bf716cbf7be2d871867bc4",
    "software_expiration_mtp": 1763208000,
    "mempool_activated": true
  },
3 Likes

If anyone else wants to set up transaction rebroadcasting from chipnet to tempnet, here’s a very brute-force bash script (i.e. rebroadcast.sh; you’ll need each node running and RPC configured):

CHIP_CLI="/.../bchn/build/src/bitcoin-cli -datadir=/.../bitcoin-bchn-chipnet"
TEMP_CLI="/.../bchn/build/src/bitcoin-cli -datadir=/.../bitcoin-bchn-tempnet"

# Get current height on Chipnet and compute the starting height for last 10 blocks
height=$($CHIP_CLI getblockcount)
start_height=$((height - 10))

for ((h=start_height; h<=height; h++)); do
    blockhash=$($CHIP_CLI getblockhash $h)
    txids=$($CHIP_CLI getblock "$blockhash" 1 | jq -r '.tx[]')
    skip=1
    for txid in $txids; do
        if [ $skip -eq 1 ]; then
            skip=0
            continue
        fi
        raw=$($CHIP_CLI getrawtransaction "$txid" 0 "$blockhash")
        # Only broadcast if we got a raw tx hex back
        if [ -n "$raw" ]; then
            # The second argument (allowhighfees) is optional; use true to allow any fee
            $TEMP_CLI sendrawtransaction "$raw" true >/dev/null 2>&1 || true
        fi
    done
done

Then chmod +x ./rebroadcast.sh and in a tmux or screen session: while true; do ./rebroadcast.sh; sleep 5; done. (Or on ubuntu, you could set it up as a service – see above.)

2 Likes

Just noting here that I opened a tracking/draft MR with more explanation about the BCHN features in the tempnet branch:

Copying here too for easy searching:

This is a very rough draft implementing several user/developer experience features surrounding network upgrades. It’s the same code originally published here: https://github.com/bitjson/bchn/tree/tempnet and discussed here: Tempnet: 2026 Chipnet Upgrade & Pre-Upgrade Testing - #4 by bitjson

I hope this is a good starting point for discussing implementing some (not all) of these features in BCHN.

Caveat: I’m perpetually a C++ amateur. This implementation is a combination of me hacking things together + test-driven LLM autocompletion + manual review and testing. I only polished the parts where I expected this draft could be useful – UX and documentation. The code is just beyond “works”, probably not “correct”, and definitely not “fast”.

Ultimately, if any of these features are pulled into BCHN, I think the C++ code in this initial implementation should tossed in the trash, and only the user-facing design, RPC calls, descriptions, naming, docs, etc. should be pulled into focused MRs.

Tempnet” network designation

It’s very useful for pre-chipnet upgrade testing to have a designation for temporary networks. Avoids clobbering your chipnet data directory, simplifies setup for testers, allows us to polish the UX/DevX by e.g. (as implemented here) making tempnet nodes expire shortly after the expected chipnet upgrade (so that properly configured nodes will simply stop and re-join the real chipnet when automatically restarted).

getblockchaininfo.upgrade_status

Every year, it’s a pain to follow when exactly the upgrade is happening, and people rely on hacked-together scripts or single-points-of-failure to monitor the upgrade. (Coincidentally, one of the best sources every year, http://cash.coin.dance/, happens to be down at the moment I’m writing this.)

IMO, anyone running BCHN should be able to easily see the status of the most relevant upgrade(s) for the node’s currently configured network. This was actually available in 2015 at getblockchaininfo.softforks (see BTC docs here), but was deleted without replacement after the BCH-BTC split.

Example output before an upgrade activates:

  "upgrade_status": {
    "name": "May 2026 Upgrade (tempnet)",
    "mempool_activation_mtp": 1757937600,
    "block_preactivation_height": null,
    "block_preactivation_hash": null,
    "block_postactivation_height": null,
    "block_postactivation_hash": null,
    "software_expiration_mtp": 1763208000,
    "mempool_activated": false
  },

And after an upgrade activates (the locked-in status for the Sept 2025 tempnet):

  "upgrade_status": {
    "name": "May 2026 Upgrade (tempnet)",
    "mempool_activation_mtp": 1757937600,
    "block_preactivation_height": 271015,
    "block_preactivation_hash": "00000000023062becd19275fa2ec7cbe32d3eb5329708ccb006143865f010af7",
    "block_postactivation_height": 271016,
    "block_postactivation_hash": "00000000163a426b4dfe4a484b8753c918f58b8cb9bf716cbf7be2d871867bc4",
    "software_expiration_mtp": 1763208000,
    "mempool_activated": true
  },

I iterated a bit on upgrade status information that’s most useful to application developers. I actually confused myself (and LLMs in several places) with the existing “activation block” terminology in the first commit; the second commit adopts a clearer terminology that is harder for application developers to misunderstand:

Clarify “Preactivation” and “postactivation” block

I didn’t fully find-replace “activation block” with the clarified “preactivation” and “postactivation” terminology throughout the whole codebase, but I think that might be a good idea to make off-by-one errors/underhandedness harder to miss. This MR just implements the terminology in upgrade_status and some of the new code/tests.

RPC: Transaction Broadcast Queue: queuebroadcasttx, gettxbroadcastqueue, cancelbroadcasttx

A simple, local broadcast queue (where sends are triggered by a locktime MTP or height being hit) would significantly simplify tooling for a lot of DeFi and advanced applications, like time-locked security vaults, inheritance systems, etc.

Currently, these applications need stateful monitoring infrastructure that is error prone, hard to test, and easily broken by local networking issues. Instead, it would be ideal if application developers can control (via RPC: queuebroadcasttx, gettxbroadcastqueue, cancelbroadcasttx) a simple, local BCHN-managed queue.

Such a local queue also happens to be extremely useful for network upgrades too by allowing developers and companies to easily queue of post-activation transactions. This really reduces the effort required to demonstrate clean launches right after network upgrades – devs should be on podcasts, livestreams, at conferences, etc. bragging about their product at the moment of upgrade – not babysitting their hacked together launch tooling :grinning_face_with_smiling_eyes:

This draft implementation is ultra simple: in memory only, queue is deleted on shutdown. If it’s not too difficult, I’d request (for ~20% more value) that queuebroadcasttx accept an optional persist option (default: false) that saves the queued transaction to disk in case the node shuts down before it’s sent.

I wasn’t confident I’d be implementing this reasonably, so I only implemented the default non-persistent behavior – dropping the transaction – (which I think is safer against application-level bugs that accidentally queue too many transactions and get the node OOM killed). But making persistence an option would add another chunk of value (especially for upgrades), by making very long-term persistence more reliable.

Tempnet/Chipnet “activation transaction” support

This item makes Tempnet/Chipnet upgrades more predictable by letting nodes require that a specific transaction be included in the postactivation block. Today, this is done manually by large miners on whichever network is being upgraded. In the same sense as above – we want developers to be free to livestream/celebrate upgrades, not waiting around to park blocks via RPC.

Having a built-in capability to set your node to require “following the upgrade” makes it a lot easier to prevent shenanigans on Tempnet and Chipnet upgrade days. (We haven’t had this problem yet, but it would be trivial to aggressively re-org a tempnet or chipnet right around the upgrade to cause chaos and hurt confidence. We usually have a lot of mining power standing by ready to defend, but it would be a lot nicer if every BCHN node could simply be preset to refuse a postactivation block which doesn’t have a previously-prepared, trustless covenant transaction like the one I’ve prepared for the 2025 Nov Chipnet upgrade. This would again free up BCH devs during the actual upgrades.)


Again, these are proposed BCHN features, not necessarily related to the 2026 CHIPs. These features could reasonably be contributed to master (one at a time), and the 2026 CHIPs then rebased on top. I hacked these features into this WIP branch to make the Sept. 15 Tempnet a little easier to launch, but please consider this MR a UX draft/prototype.

4 Likes

100%.

This is a straightforward (although not necessarily quick or easy) improvement the community can make. Automate all the infrastructure (& the on-upgrade launches) so we can make a really big splash as it happens.

The signal of having that all handled is as important as the upgrade launches themselves. Sophisticated observers will notice and be impressed.

5 Likes

Some polish for bch-rpc-explorer instances:

The 2023 ABLA support PR (screenshots here) hasn’t been merged in @sickpig’s repo yet, but it’s manually deployed (from this fork) by several of the community-run instances. The above PR builds on top of that with P2S, tempnet, and upgrade_status support:

Just added some UI to display the new blockchaininfo.upgrade_status data. The upgrade name comes from the RPC call along with the data, so it also won’t necessarily require annual updates in bch-rpc-explorer.

Multiple days before the upgrade:

1 day (showing tooltip too):

Less than 24 hours:

Less than 1 hour:

Preactivation block mined (first block past activation MTP):

Postactivation block mined:

Postactivation, the status won’t change until you update to a version of BCHN (or other compatible node software) that returns the details for the next upgrade, e.g.:

This branch is already deployed at https://2026-tempnet.chaingraph.cash/

P2S outputs are labeled correctly:

And ABLA enhancements working for tempnet too:

Screenshot 2025-10-14 at 11 07 28 PM

2 Likes