v0.15.8 — testnet recovery release (teranode-cli rewindblockchain) #1357
oskarszoon
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
v0.15.8 — testnet recovery release (
teranode-cli rewindblockchain)Released: 2026-07-27
GitHub: https://github.com/bsv-blockchain/teranode/releases/tag/v0.15.8
Container:
ghcr.io/bsv-blockchain/teranode:v0.15.8Upgrade priority
Required for any testnet operator whose node was wedged by the pre-v0.15.7
OP_RETURNspend bug (Discussion #1344). Everyone else on v0.15.x is fine to stay on v0.15.7 — v0.15.8 does not change the validation pipeline, it only ships the recovery tool.Mainnet operators: v0.15.8 is safe to deploy but not required.
The recovery path
The pre-v0.15.7 bug caused a bare
OP_RETURNoutput to be dropped from the UTXO set at store time; when a later block later spent it, the block cannot validate and the node loops on it forever. v0.15.7 fixed store-time behaviour but did not un-drop rows already lost. v0.15.8 shipsteranode-cli rewindblockchain, which rewinds the local blockchain past the bad block so the node re-syncs those blocks fresh with the fix in effect.Recovering a wedged testnet node (docker / teranode-quickstart)
The rewind is destructive and refuses to run against a live node. The steps below stop everything except the blockchain container, run the rewind inside it, then bring the rest back.
1. Force the FSM into
IDLEwhile the node is still on the old versionIf the node is stuck mid-
CATCHINGBLOCKS(which is common for the wedge scenario), transition throughrunningfirst:2. Update the image tag to
v0.15.8Edit
docker-compose.yml(or your compose override) so every teranode service referencesghcr.io/bsv-blockchain/teranode:v0.15.8, then:3. Stop every teranode service except
blockchain(Adjust the service names to match your compose file — the goal is: everything down except
blockchain.)4. Recreate the blockchain container on
v0.15.8Wait a few seconds for it to come healthy, then confirm the FSM is still
IDLE:5. Run the rewind inside the blockchain container
1749330is a known-safe testnet height BEFORE the wedge block.--verifyruns post-rewind consistency checks.Type
ywhen prompted. The tool logs each phase (preflight,unmined,blocks,finalize,verify) and exits with a summary.6. Bring the rest of the stack back up and return the FSM to
runningThe node will now sync forward from the rewound height. With the v0.15.7 store-time fix in effect, the block that previously wedged it will validate cleanly.
Kubernetes / EKS operators
The same recovery pattern applies (set FSM to
IDLE, scale everything exceptblockchainto zero, exec into the blockchain pod to runteranode-cli rewindblockchain, scale back, set FSM torunning), but the exact commands depend on how your cluster is provisioned. Reach out in #teranode-support with your setup details before running rewind on a k8s deployment — mistakes on the wrong pod are hard to undo.What changed
rewindblockchainsubcommand (backport feat(teranode-cli): register rewindblockchain subcommand (#1341) #1345 / Ship rewindblockchain: not a teranode-cli subcommand, not in the image, no docs — repair tool unreachable on a deployed node #1341) — makes the destructive-rewind recovery tool available as ateranode-clisubcommand with all flags, prompt handling, and a positional-argument guard.BlockPersisterHeightforward on rewind (backport fix(rewindblockchain): never move BlockPersisterHeight forward on rewind (#1340) #1342 / rewindblockchain: resetBlockPersisterHeight moves the persister forward when it is behind the rewind target, silently skipping persistence #1340) — clampsstate[BlockPersisterHeight]against the blocks-table ground truth so the rewind tool cannot accidentally fast-forward the persister and drive irreversible blob deletion.hashPrefix(backport fix(rewindblockchain): open the subtree store with the node's hashPrefix (#1351) #1352 / rewindblockchain: subtree store opened without WithHashPrefix — every subtree read misses, Phase 2 cannot rewind any file:// deployment #1351) — reads?hashPrefix=from the subtree store URL and passes it intoNewStore, so the rewind tool shares the node's exact blob path layout and its Del calls actually match what the node wrote.Known issues
None new.
Full changelog
All reactions