The Light Client
A wallet on a phone cannot run a Bitcoin node. The usual answer is to trust a server. Cheshire’s wallet trusts no single server: it checks Bitcoin’s headers itself, finds every settlement in its block, and hides the phone’s address with Tor. A node can withhold information; it cannot lie about the pool. (How the phone hides its address is on the Tor page.)
Built 2026-11-06, in wallet-core and the iOS app.
Built for Bitcoin mainnet as for the signets the pool runs on today.
What the wallet checks
Section titled “What the wallet checks”Headers. The wallet keeps the last 2,160 block headers and the work they add up to.
- On a signet (gsr-net, a local demo signet), every block’s signature is checked, from its coinbase, along with its proof of work.
- On mainnet and the testnets, proof of work and every difficulty retarget are checked from a pinned checkpoint.
- A fork is taken only if it has more work than what it replaces.
Each settlement. The wallet applies a settlement only if all of these hold:
- its block is on the checked chain, with enough confirmations;
- its txid is in that block’s Merkle root;
- it spends the pool coin the previous settlement made, and its first output is the pool’s script;
- its caboose commits to the very state the wallet’s own replay of the records reaches;
- its payouts are the ones the caboose commits to.
So a node can fake none of the pool’s history.
Compact and full forms. A real settlement is about 180 KB of raw transaction, almost all of it the verifier’s witness. The wallet needs only the records. By default it fetches a compact form: the transaction without its witness (the txid still covers it), the caboose’s preimage, the payouts and the records. The compact form does not bind the encrypted memo words, so a node could hide a payment from you, though never invent one (a note you find must be in the tree). The wallet therefore asks several nodes and compares. If two disagree, it fetches the full transaction and checks it against the block. One honest source is enough.
Measured on a test run: a first sync of 9 settlements read about 117 KB; one more settlement read about 24 KB.
Bitcoin’s own peers
Section titled “Bitcoin’s own peers”The wallet also speaks Bitcoin’s peer-to-peer protocol directly:
- headers from Bitcoin peers join the nodes’ headers as another source;
- compact block filters (BIP157/158) show every block that touches the pool’s script. The filter headers are compared across peers, so one peer cannot hide a block unless all agree to. A Cheshire node that withholds a settlement is caught, and the settlement is read from the block itself;
- the same filters find the wallet’s own Bitcoin coins, so no block explorer learns its addresses.
With the pool’s script and genesis pinned in the app, a wallet can sync from Bitcoin peers alone, with no Cheshire node at all.
Status
Section titled “Status”Checked against a real throwaway signet, real mainnet peers (through Tor as well), and the stand-in regtest run, and run end to end in the iOS simulator. Unaudited.