Releases: trusts-stack-network/tsn-releases
Release list
v3.0.0-rc.28 — block-builder fix (oversized blocks)
Recommended update — fixes a block-builder bug that could stall the chain
rc.28 fixes a bug in the block producer that could build oversized blocks which fail to propagate, stalling block production. Recommended for everyone; important if you run a miner/producer.
What was wrong
When the work-attestation pool grew large, the producer packed the entire pool (up to 4096 attestations) into a single block instead of the per-block cap (64). Those blocks (~12 MB) exceed the 1 MiB gossip limit, so peers never receive them — and the chain stops advancing.
What changed
- The producer now caps work-attestations per block at 64, keeping blocks small (tens of KB) so they propagate normally.
- Consensus-compatible with rc.27 — no wire-format change, no re-mining. This only changes how a producer builds a block; rc.27 and rc.28 validate each other's blocks identically. It is a producer-side fix.
Verify
As with rc.27, the internal version string still reads 3.0.0-rc.26; the definitive checks are:
curl -s http://localhost:9437/v2/consensus-params
→ "pow_cachehard_activation_height":280000 and "pow_cachehard_armed":true, and the SHA256 below.
SHA256 (tsn-3.0.0-rc.28-linux-x86_64.tar.gz):
6b3931149c420e4725a808a1e7bb3e9ced5a959ad810ad423da21fa8ab95181a
v3.0.0-rc.27 — PoW hardfork (activates at block 280000)
PoW hardfork — MANDATORY update before block 280000
At block height 280000 the TSN network switches from the current proof-of-work to a memory-hard, CPU-friendly PoW. Every node carries the same baked activation height.
You must update to this build before block 280000. Nodes still on an earlier build will reject post-fork blocks and stop following the live chain after that height.
What changes at 280000
- Mining becomes memory-hard: CPUs are the intended miners; GPUs lose their advantage.
- No wire-format change and no re-mining of existing blocks — only the PoW function changes, at that height.
Verify you have the armed build
After starting ./tsn service-node, run:
curl -s http://localhost:9437/v2/consensus-params
It must show "pow_cachehard_activation_height":280000 and "pow_cachehard_armed":true.
The internal version string still reads
3.0.0-rc.26; the definitive check is the field above and the SHA256 below.
Install (Linux / WSL2)
wget https://github.com/trusts-stack-network/tsn-releases/releases/download/v3.0.0-rc.27/tsn-3.0.0-rc.27-linux-x86_64.tar.gz
tar xzf tsn-3.0.0-rc.27-linux-x86_64.tar.gz
chmod +x tsn
./tsn service-node
SHA256
212fb4392741e7fc5fcd251712fe3bb095cfe89fb5e0efcd3cdac605dc872310 tsn-3.0.0-rc.27-linux-x86_64.tar.gz
v3.0.0-rc.26
The first green middlestone on DevnetV2 gen4, and the wallet fixes that make the post-fork spend path work.
A live 5-node soak came back green on every gate at once. No freezes for the whole run; the mesh never stalled. Five nodes held the same height and the same block — tip spread zero. Fourteen of fourteen transactions were included and still durable about 31 minutes later. No fork, and no theft — the no-theft property was exercised earlier in a dedicated two-miner adversarial run. This is the first time gen4 has held all of these gates at once.
The AuthBound spend-authorization hardfork is live. It activated at height 233000, and the whole backbone crossed it cleanly — no partition, every node on the same post-fork hash. AuthBound hardens how a note is authorized to be spent.
Three wallet-side defects on the post-fork spend path are fixed. The chain was healthy throughout; these are wallet and CLI changes only, with no consensus change.
A spend that returns change could not prove itself. An AuthBound spend with change failed to produce a valid proof on the post-fork ingress path. Proof generation for the spend-with-change case is corrected.
Note selection could pick notes it could not spend. The wallet could select notes stranded by the fork — not spendable under the post-fork AuthBound rules — and assemble a spend that could never complete. Selection now excludes fork-stranded notes.
A spent balance did not settle. After a post-fork spend the wallet failed to reconcile which notes had become spent, leaving a stale local balance. Reconciliation now derives the AuthBound nullifier and clears the spent notes.
Nodes on rc.25 and rc.26 are compatible — this is a wallet/CLI release, not a network upgrade.
tar xzf tsn-3.0.0-rc.26-linux-x86_64.tar.gz
./tsn new-wallet # note the Address it prints
./tsn miner-v2 --miner-pk-hash <64-hex> --data-dir ./tsn-data -t <threads>
v3.0.0-rc.22
Four production failures found and fixed, each one measured on the live chain.
A wallet that could not scan printed 0 TSN. A miner with 759 unclaimed
coinbases read "you own nothing" and concluded the rewards were lost. Three
defects behind one symptom: the scan reported success as a bare bool; a miner
and a service node answer /health but 404 every scan route, so pointing
balance at your own node gave a permanent silent zero; and the first scan of
a fresh wallet took 112 s against a 120 s budget. balance now falls back to
the public indexer on its own, and says so when it could not look.
Coinbase rewards are claimed automatically. No claim-coinbase to type.
Nodes stacked one new connection per re-dial. A dial by multiaddr carries no
PeerCondition, so libp2p cannot deduplicate it, and the 45 s self-heal loop
opened a fresh connection every tick to whichever peer answered. One host held
850 established connections to a single peer, still open 1 h 48 after the last
dial. Fixed in three layers: the driver skips an address it already holds, a
per-peer connection limit makes the pathological case impossible on every path
including inbound, and identify returns to its 5 min default so the idle
timeout can reclaim duplicates. Measured on the fleet afterwards: one connection
per peer, and an operator's internet link went from 25.5 Mbit/s of TSN traffic
to 3.3.
A soak certificate expired onto the binary it attests. Four public seeds
crash-looped about 6 200 times each over thirteen hours because the calendar
moved seven days past a certificate for the build they were still running. The
expiry now applies only when the certificate names a different build.
Also in this release: HTTP responses are gzipped (a block is 20 383 bytes of
JSON carrying 5 453 bytes of payload); the bootstrap snapshot is downloaded once
per machine instead of once per role, and no longer fills the disk it caches to;
a failed snapshot restore no longer discards the chain the node already had; and
peers below 3.0.0-rc.18 are refused.
tar xzf tsn-3.0.0-rc.22-linux-x86_64.tar.gz
./tsn new-wallet # note the Address it prints
./tsn miner-v2 --miner-pk-hash <64-hex> --data-dir ./tsn-data -t <threads>
TSN v3.0.0-rc.20
Run it like this:
./tsn new-wallet # note the Address it prints
./tsn miner-v2 --miner-pk-hash <64-hex> \
--data-dir ./tsn-data -t <threads>
No --peer needed: the node dials the default seeds and bootstraps from a
published snapshot. Pass --data-dir explicitly — without it the node falls
back to /var/lib/tsn-devnet-v2, which needs root and may already hold another
node's state.
Other roles: service-node, cortex-v2, ingress.
What rc.19 and rc.20 fix
rc.18 shipped with two traps for a first-time user, both found by running the
published tarball in a clean directory:
./tsn --data-dir ./x -t 10— the obvious command — started a v1 node on
tsn-testnet-v13, a network retired in May with no peers. It printed
"Creating new blockchain", "Node synced (height: 0)" and "MINING ACTIVE",
so it looked healthy while mining a private chain alone. That path now
refuses and prints the command above.- The rc.19 guidance omitted
--data-dir, and following it verbatim failed
with "bincode: io error: unexpected end of file". Fixed, and the reason is
now stated in the message.
Everything from rc.18 is included
A mining live-lock: rebuilding the note accumulator walked the whole chain on
any re-org or multi-block jump (~196,000 block reads, no cancellation point),
so one producer could stop hashing entirely for dozens of blocks. Runs of 50+
consecutive blocks by one producer are gone.
Memory: the accumulator walk no longer materialises every block body since
genesis (1,366 MB to 87 MB, identical root); caches and allocator arenas are
bounded. Across seven machines, resident memory went from roughly 60 GB to 7.
Bandwidth: settled registry events are no longer re-announced in every block —
229,804 to 8,707 byte blocks.
Shielded transactions are proved with Plonky2. The Plonky3 AIR scaffold was
benchmarked and dropped: it constrained no hash at all.
sha256: d59e03c12a8240a40b1e9eb43ce6d90c60b1e6c51cc601193f8eb2d04f5d53fe
TSN v3.0.0-rc.19
Fixes the first thing a new user hits.
In rc.18, ./tsn --data-dir ./miner-data -t 10 started a v1 node on
tsn-testnet-v13 — a network retired in May with no peers left. It printed
"Creating new blockchain", "Node synced (height: 0)" and "MINING ACTIVE",
so it looked healthy while mining a private chain from height 0, alone.
A gen4 build now refuses that path and prints the command that works.
Running it
./tsn new-wallet # note the Address it prints
./tsn miner-v2 --miner-pk-hash <64-hex> -t <threads>
No --peer needed: the node discovers the mesh and bootstraps from a
published snapshot on its own. Other roles: service-node, cortex-v2,
ingress.
Everything from rc.18 is included — the mining live-lock fix, the memory work
(fleet 60 GB to 7), blocks from 229,804 to 8,707 bytes, and the self-heal
wiring guard.
sha256: 1c1ff8fe034f0476741a879f9e59d6545fb3d1418689e5284a581a4965442fd4
TSN v3.0.0-rc.18
DevnetV2 gen4 node, built from main.
This build ends a mining live-lock: rebuilding the note-commitment accumulator
walked the whole chain on any re-org or multi-block jump, with no cancellation
point, so one producer could stop hashing entirely for dozens of blocks while
the other won every race. Block reads per round went from ~196,000 to a bounded
walk; measured on the fleet, runs of 50+ consecutive blocks by a single producer
are gone.
Also in this build:
- Memory: streaming accumulator walk (1366 MB to 87 MB, identical root), sled
cache caps, glibc arena caps. Fleet resident memory fell from roughly 60 GB to
7 across seven machines. - Bandwidth: settled service-node registry events are no longer re-announced in
every block (229804 to 8707 byte blocks), and work attestations are bounded
per block instead of by pool size. - Self-heal: a wiring-parity test now breaks the build when a self-healing
module has no production caller; the cross-peer cumulative-work check was
read from the wrong field and never fired. - Relay: the producer block push now bounds its connect phase, so a filtered
port no longer stretches a 2 s cycle to 63 s.
Shielded transactions are proved with Plonky2. The Plonky3 AIR scaffold was
evaluated and dropped: it constrained no hash at all. See the README.
sha256: 72cfd2d1b2f387e30c517b90393841c492f1db18b79dc0659c7d1e64b33f7f8d
v3.0.0-rc.14 — behaves like production out of the box
Public test network release. Recommended for everyone — replace any earlier binary.
Network: tsn-devnet-v2-gen4 · Chain ID: 28ee68e414994c39
Just run it
./tsn-linux-x86_64 service-node --data-dir ./tsn-data
Dials the network's seeds on its own and bootstraps from the latest signed
snapshot — caught up in a couple of minutes.
To mine (uses 4 cores here; drop -t for one):
./tsn-linux-x86_64 miner-v2 --data-dir ./miner-data -t 4 --miner-pk-hash <YOUR_PK_HASH>
Check your balance / claim rewards:
./tsn-linux-x86_64 balance --wallet ./wallet.json
./tsn-linux-x86_64 claim-coinbase --block <HEIGHT> --wallet ./wallet.json
What changed since rc.13
The public binary now behaves like our own nodes instead of a stripped-down
version. Concretely, without any configuration:
- Mining uses all the cores you ask for (
-t N) — it was single-threaded
before, one core whatever you passed. - Claiming your rewards works —
claim-coinbasereaches your own miner, which
mines the claim into its next block. balancefinds a node on its own — it was looking at an endpoint your
miner does not serve, so it always failed.- Running a plain
service-nodenow earns — it creates its reward identity on
first start (kept in the data dir; back it up), no setup needed. - Transactions can flow — miners include them by default.
- Refuses to mine without
--miner-pk-hash(was silently burning rewards),
self-heals when it holds peers but stops receiving blocks, re-delivers its
mined blocks so they are not lost to orphans, and checks for updates on its own.
Downloads
| Platform | File |
|---|---|
| Linux x86_64 (glibc 2.34+) | tsn-linux-x86_64 |
Tested on Ubuntu 24.04/26.04 and Fedora 41. Verify with sha256sum -c SHA256SUMS.
Upgrading: replace the binary, start from an empty data directory. If you
ever mined while disconnected, delete that data dir — it holds a private chain.
Binaries only — no source code is published in this repository.