Skip to content

Releases: trusts-stack-network/tsn-releases

v3.0.0-rc.28 — block-builder fix (oversized blocks)

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 16 Aug 01:11

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)

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 15 Aug 00:58

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

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 11 Aug 09:43

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

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 07 Aug 12:46

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

TSN v3.0.0-rc.20 Pre-release
Pre-release

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 05 Aug 11:33

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

TSN v3.0.0-rc.19 Pre-release
Pre-release

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 05 Aug 11:15

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

TSN v3.0.0-rc.18 Pre-release
Pre-release

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 05 Aug 10:14

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

Choose a tag to compare

@trusts-stack-network trusts-stack-network released this 22 Jul 11:01

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 worksclaim-coinbase reaches your own miner, which
    mines the claim into its next block.
  • balance finds a node on its own — it was looking at an endpoint your
    miner does not serve, so it always failed.
  • Running a plain service-node now 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.