SATROOT · Launch note
SATROOT turns one native BSV satoshi into the root of a deterministic, replayable semantic ledger — and we anchored one for real, on mainnet, with every step reproducible from raw bytes by anyone who fetches them.
THE FLOOR: 1 NATIVE SATOSHI1 SAT
Bitcoin's smallest native unit is the satoshi. Most token designs respond to that floor in one of two ways: pretend to subdivide it, or ignore the chain entirely and keep balances in a database. SATROOT takes a third position:
The satoshi is not subdivided. The satoshi anchors a protocol-defined state space.
One specific one-satoshi UTXO becomes a root witness — the namespace handle for a ledger whose state is computed purely by replaying signed events. Token units, machine credits, receipts, identities, licenses, and event-stream custody all live as overlay state above that root. The chain provides the anchor and the publication; ordering comes from the events themselves, via sequence numbers and a hash chain. The protocol provides deterministic meaning. Nothing about the satoshi itself changes, and moving it is never mistaken for a semantic transfer: state follows valid signed events, not UTXO activity.
It never was. A forged, empty or absent signature on the genesis record — the one that fixes the mint authority, the max supply and the entire opening allocation — replayed clean under every scheme. So the root of every ledger was forgeable, and every later event was being verified against a root anyone could have written.
It was found by someone implementing the specification from scratch and reading only the document. Seven rounds of that produced twenty-six specification defects and grew the conformance corpus from 33 vectors to 68. None of the serious ones were reachable by 1,751 tests, two implementations or twelve earlier review rounds, because all of those were written against the code.
Authenticating genesis changes its event_id, and therefore every state hash, so a v1 ledger does not replay under v2. The alternative was leaving the root of every ledger forgeable, which is not a trade. See MIGRATION.md.
The corpus is the standing invitation: 68 vectors — 19 that must replay, 49 that must be rejected — with a runner that needs nothing but Python.
python vectors/run.py --impl your_verifier.py
If your verifier disagrees with EXPECTED.txt, that disagreement is the most useful thing anyone can send this project — whichever of us turns out to be wrong. It is how v2.0.0 happened.
The reference implementation is a dependency-free, pure-Python kernel — a canonical event format, a replay engine with strict sequence and hash-chain enforcement, and three signature schemes (a demo placeholder, hmac-sha256, and ed25519). Above the kernel sit six released profiles — stable reference units, machine credits, receipts, identities, licenses, and event-stream heads. They add required genesis metadata and validation to the same token-and-account reducer; they do not define their own state or transitions. Above them sits a full publication ladder that packages ledgers into signed bundles, releases, catalogs, and registry workspaces, each layer carrying its own manifest hashes and verification tooling.
Nineteen tagged releases and ~1,766 tests behind a single release gate. Install it:
pip install satroot
satroot1 replay examples/events_floor1.json
A protocol document can claim anything. So instead of claiming, we ran the whole loop against the real chain and recorded every artifact. The loop has four steps, and each one is reproducible:
root_id of a demo namespace, its full lifecycle signed and verified with ed25519.OP_RETURN envelope.38ff9da029e66ee9b6a1b175025388caf7fb6d3bb0273812737d7dd6b347c473:0sha256:34049329f152c388cad547440b32213d48be583c0fa16d93a94582f7399fde587f5946898440a96e18526440ed7140eda85e7dad7e753c7d0b88d09f008b1f83Don't take the article's word for it. Save the raw transaction hex to a file and run the offline verifier yourself:
python scripts/run_envelope_verification_smoke.py \
--raw-tx-hex-file rawtx.hex \
--root-id 38ff9da029e66ee9b6a1b175025388caf7fb6d3bb0273812737d7dd6b347c473:0 \
--state-hash sha256:34049329f152c388cad547440b32213d48be583c0fa16d93a94582f7399fde58 \
--expected-txid 7f5946898440a96e18526440ed7140eda85e7dad7e753c7d0b88d09f008b1f83
No network access, and no trust in us once you have fetched the raw transaction and the expected root and state hash from a source you choose — take them from this page and you have checked consistency with this page's claims, not independent truth. The verifier parses the bytes, hashes them, finds the envelope output, and compares it byte-for-byte against the commitment it rebuilds from scratch. The complete record of every intentional anchored run lives in ANCHORS.md — the only place in the repository a real outpoint may appear.
SATROOT's documentation spends as much effort on boundaries as on features, because overlay protocols die of overclaiming:
The profile system is the point, within a limit worth stating: SATROOT is a typed token-and-account ledger with domain-labelled profiles, not a general application-state framework. A namespace rooted in one satoshi can label the custody lineage of a telemetry stream, the prepaid credit balance of an autonomous agent, or the assignment history of a license, mapping each onto the same account and balance operations — deterministically, with offline verification, for the cost of almost nothing. The machine-credit and event-stream profiles are aimed squarely at the emerging problem of proving what autonomous agents consumed, published, and were authorized to do.
The kernel is frozen; the profiles are open. If you want to build an object class on a one-satoshi root, the repository ships everything this article described — including the tooling that produced its own proof.