Zylem Data Layer
Zylem

A verifiable data layer for Zcash

Don’t trust the server. Verify every block with Zylem.

Zylem separates who serves Zcash data from who you trust. History travels as portable Ring files, each about a day of blocks, that anyone can host, and every client checks what it receives before using it. Wallets are the first application.

  • No trusted server: every block is checked on your side
  • Any host can serve the history
  • No full node: Rings verify on their own, and proofs make them light enough for phones

Testnet prototypeWorks with ZakuraHeader proofs in SP1

Each growth ring is a Ring: 4,096 testnet blocks in one file that anyone can host, because every block in it is re-verified. The outer dashed ring is the open tail, still growing.

What it rejects

See what Zylem rejects.

Conventional light wallets rely on their server for their view of the chain. Pick a manipulation to see what a wallet shows today and what happens through Zylem.

Malicious server

Adds a note paying you to the compact data of a real block.

A wallet today

Shows funds that were never sent.

Through Zylem

Rejected
The altered transaction's rebuilt ID no longer matches what the block header committed to.

Illustrative errorREJECT Ring 4518274..=4522369 rejected: transaction 4 at height 4521980: rebuilt ID does not match

These are the manipulations Zylem's demo runs against an unmodified testnet wallet. Error lines follow Zylem's real format; the heights are illustrative.

Where Zylem sits

Stronger than any light wallet, far lighter than a full node.

A light wallet trusts its server; a full node checks everything and needs a server's worth of resources. Zylem checks every block you use on your own device, with one small proof standing in for every historical header.

Light wallet todayZylem, light Rings + proofFull node
Block data authentic and completeServer's wordChecked on your sideYes
Proof of work and difficultyNot checkedProven once; the proof checks in 50 to 350 msYes
Transaction validity (proofs, signatures)Not checkedNot yet; planned for transactions that touch youEvery transaction
Double spends and supplyNot checkedNot yet; planned supply guard and proven nullifier setYes
Served by any static hostNo: each server runs a nodeYesIt is the source
Header data to downloadNone, unverifiedOne proof: 356 bytes, or 1.27 MB without a trusted setupEverything, hundreds of GB unpruned
Runs onPhones and browsersPhones, browsers and, through the 356-byte proof, other chainsServers and desktops
What you trustThe serverA checkpoint, honest-majority hashpower, SP1 and Zylem's proving programsIts own software

What Zylem doesn't do yet

  • Re-check other people's transactions. Like any light client, it relies on most hashpower enforcing the rules for transactions that never touch you.
  • Validate the transactions that touch you, guard supply and catch double spends. Planned: local proof and signature checks for your own transactions, pool-balance tracking, and a proven nullifier set.
  • Watch the mempool. Payments are verified once they are mined.
  • Protect a fresh install whose every source is eclipsed. Minimum chain work and several sources narrow this; they cannot remove it.

One verified history, many consumers

Who serves the data no longer decides what you trust.

Zylem separates data availability from verification. Anyone can build Rings and proofs, any host can serve them, and every consumer checks them itself. Wallets are the first consumer, not the last.

PRODUCE SERVE VERIFY AND USE Zcash blocks and headers from any node Anyone builds Rings and the shared history proof Any host CDN, mirror, IPFS not trusted Wallets verified sync, no full node testnet Services and watchers inclusion receipts, spend monitoring next Other chains on-chain light client, inclusion local EVM A host can withhold or replay data, never alter it undetected. Switching hosts changes nothing about what a consumer trusts.

Verify

Working on testnet

Authenticate Zcash data independently: every transaction ID, Merkle root and tree state in a block, checked against the headers and the proof of work.

Access

Rings now, verified queries next

Fetch only the history you need, from any provider: Rings by height range today, then verified range queries and transaction-inclusion receipts.

Connect

Tested locally

Bring verified Zcash facts into other applications and other chains, through a wrapped history proof and inclusion evidence. SP1's verifier contract already accepts Zylem's 356-byte proof in a local EVM for about 304,000 gas; nothing is deployed on a chain yet.

How it works

Portable history, one shared proof, checked on your side.

SP1 1 · Rings portable Zcash history that anyone can host 2 · Prove SP1 checks Equihash and every header rule 3 · Aggregate many leaf proofs become one history proof 4 · Verify the client checks the proof and each Ring locally
Rings, native verification and GPU proving all run on testnet today. The live demo checks real Rings and real proofs in your browser.

How Zylem works, in detail

Two ways to verify

Rings work on their own. Proofs make them light.

Every Ring can be checked without a proof. A shared history proof replaces the heavy part, the headers, for clients that cannot afford it.

Full Rings

Working on testnet

Each Ring carries its blocks' headers, so the client checks every header's Equihash, difficulty and link itself, from a checkpoint. No proof system to trust.

  • Best for desktops, servers and the proxy
  • About 1.5 KB of header per block to download and check
  • History checked in order from the checkpoint

Light Rings + history proof

Next on testnet

Rings carry 104-byte block records instead of headers, and one SP1 proof shows every header followed Zcash's rules, Equihash included.

  • One proof of about 0.8 MB instead of about 2.7 GB of headers for mainnet since NU5
  • One check in about 40 ms instead of 1.84 million Equihash checks
  • Jump straight to any Ring; the proof can start at genesis at no cost to clients
  • Small enough for phones, browsers and, wrapped, other chains

Where it applies

Wallets first, then anything that reads Zcash.

WhoWhat Zylem gives themStatus
WalletsVerified sync without a full node or a trusted serverTestnet
Light-server operatorsServe history as Ring files from a CDN, backed by a pruned nodeTestnet
Channel and DLC watchersComplete, verified spend monitoring: a server cannot hide a close or a spendNext
Payment processors and agentsVerified payment and confirmation evidence, as inclusion receiptsNext
Explorers and analyticsHistorical queries whose answers can be checkedPlanned
Bridges and contracts on other chainsProof-backed Zcash facts under stated assumptions: a proven block hash today, inclusion facts nextTested locally

Benchmarks

Measured, not promised.

Each figure comes from a recorded run. The measurements list names the file behind each one.

Native Ring verification9 sfor 29,571 testnet blocks, every check, M2 ProSource
History check37.6 msone proof in WebAssembly, instead of 1.84 million Equihash checks for mainnet since NU5Source
History download0.8 MBcompressed proof, instead of about 2.7 GB of headers for mainnet since NU5Source
Proving all of NU5 onward~$323once, projected from 1.88 headers/s with full Equihash on one RTX 5090Source

Developer quickstart

Try verified Zcash sync without rewriting your wallet.

Point an existing light wallet at the Zylem proxy instead of its usual server. It speaks the same protocol, so the wallet only needs a new server address.

1 Run the proxy with the shipped checkpoint
./target/release/zylem-proxy --rings http://127.0.0.1:8090 \
    --headers-rpc http://user:pass@127.0.0.1:18232/ \
    --upstream https://testnet.zec.rocks:443 \
    --checkpoint "$(jq -r .checkpoint checkpoints/testnet.json)"
2 Sync an existing wallet through it
zcash-devtool wallet -w my-wallet sync --server 127.0.0.1:9067
3 What a rejection looks likeexample output
WARN zylem: REJECT Ring 4518274..=4522369 rejected: transaction 4 at height 4521980: rebuilt ID does not match
WARN zylem_proxy: serving only the verified range up to 4518273

Testnet only, from the Zylem repository. The proxy reads Rings from a host such as zylem-build serve --out data/testnet --rpc http://127.0.0.1:18232/, and zylem-build probe --lwd http://127.0.0.1:9067 shows whether it accepts its current tip.

Build Rings, prove them and verify them yourself

Status · October 2026

Working on testnet. Mainnet is next.