Zcash Without a Node
Zylem

Zylem · Zcash testnet

Verifiable Zcash data, no node required

The data comes from this page's host as plain files: Rings of 4,096 real testnet blocks and history proofs made on a GPU. Your browser checks all of it with the same Rust code a Zylem client runs, so the host never has to be trusted.

Nothing downloaded yet.
1

Open a Ring

A Ring is one file holding 4,096 consecutive Zcash blocks, about a day of the chain, packaged so any website can host it. Inside are the block headers, every transaction in the compact form wallets already download, short digests that let each transaction's ID be rebuilt, and the state the Ring starts from.

In about a minute you will check 4,096 real Zcash blocks in this browser and catch a server trying to fake a payment.

2

Check the whole Ring

The full client check, block by block. This is what lets any mirror, CDN or stranger host Rings: a client accepts nothing it cannot rebuild.

Opens after step 1.

  • Every header has a valid Equihash solution, meets its own target and links to the one before; the difficulty and time rules apply once 113 earlier headers are known.
  • Every transaction ID is rebuilt from the compact data and digests, and the IDs reproduce each header's Merkle root.
  • The history tree, replayed block by block, matches what every following header commits to, which authenticates each block's tree roots.
  • The Ring's note commitments, appended to its starting tree state, reproduce those authenticated roots, so every tree state inside is authenticated too.

You rely on the cryptography and the code running in this tab, not on the host that served the file.

3

Find a payment

Look up a transaction by its ID among the IDs rebuilt in step 2. A server can only make a payment appear if the Ring's own data rebuilds that exact ID inside an authenticated block.

Opens after step 2.

4

Try to lie

Each button makes a copy of the open Ring altered the way a dishonest server would, then runs the step 2 check on it. The server would also publish a matching file hash, so only verification can catch it. The target follows the block opened in step 1; any transaction works.

Opens after step 3.

Invent an incoming note

Adds a fake Ironwood action, as if someone had paid the wallet.

Hide a payment

Leaves one transaction out of its block, so the wallet never sees it.

Serve a wrong tree state

Swaps the starting Ironwood tree for another of the same size, so a wallet would build unspendable anchors.

Simulations change a copy held in this tab. Nothing is sent anywhere, and the chain is untouched.
5

Verify succinct proof on mobile and on-chain

A succinct proof of Zcash data stays small and quick to check however many blocks it covers. One SP1 proof states that every header in a range passed Equihash, its target and the difficulty rules, and commits to a 104-byte record of each block. Wrapped in Groth16, the whole claim fits in 356 bytes that a phone and a smart contract both verify.

Opens after step 4.

On mobile and on-chain

356 bytes

The proof wrapped in Groth16 over BN254. This browser verifies it in a few hundred ms, and SP1's own verifier contract accepted these exact bytes in a local EVM for about 304,000 gas. No contract is deployed on a chain yet. Its one extra assumption is SP1's Groth16 trusted setup.

Without a trusted setup

1.27 MB

The compressed STARK the wrap is made from. It needs no trusted setup and verifies here in a few dozen ms, for clients that want the fewest assumptions.

Check the STARK proofs

Check the 356-byte proof

Your phone verifies it the way this page does. A contract that accepts it learns, from the proof alone, the Zcash block hash at the top of the range, the total work behind it and a commitment to every block's record, so bridges and other chains can build on Zcash without running a node.

Tested on an EVM
SP1's v6.1.0 verifier contract, run locally with Foundry
Verify this proof
303,762 gas, accepted
Example oracle
334,361 gas to verify, read the claim and store block 4,529,025's hash
Refused
a changed claim, a changed proof, another program's key
On a real chain
Not deployed yet
Same blocks, two waysCheck every headerCheck the proof

Light wallet vs Zylem

Don't trust, verify

Today's Zcash light wallets download compact blocks from a light-wallet server and take them as given. Zylem gives the same wallets data they can check. Steps 2 to 5 above are the checks in the Zylem columns, run on this page.

Light wallet todayZylem, full RingsZylem, Rings with a proof
Who you trust for balances and paymentsThe light-wallet serverNo data server; your device verifies, from a checkpoint and the cryptographyNo data server; your device verifies, also relying on SP1 and two pinned programs for the headers
Proof of work and difficultyNot checkedEvery headerEvery header, inside the proof
Transaction IDsNot rebuilt; compact data alone cannot rebuild themRebuilt and matched to the Merkle rootRebuilt and matched to the proven Merkle root
A fake incoming paymentShown as receivedRefused (step 4)Refused
A hidden paymentMissed without a signRefused (step 4)Refused
A wrong tree stateUsed; spends fail laterRefused (step 4)Refused
Who can serve the dataA server you trustAny host or mirrorAny host or mirror
Download per 4,096 blockscompact data only
Runs on a phoneYesYesYes
Works with today's wallet appsYesYes, by pointing them at zylem-proxyNot yet: light Rings are measured, not shipped