ZUL://DOCSPRIVACY LAYER 2 — SETTLED ON SOLANA
INDEX
INTERFACES — /docs/indexer-explorer

Indexer & explorer

The node answers point queries; it does not answer "show me everything, newest first." That is the indexer's job: a TypeScript worker that walks the chain into PostgreSQL, which the explorer reads through Prisma.

Indexer

SLOT WALK
subscribe to WS slot notifications
  → getBlock(slot) for each new slot
  → upsert: block, transactions (logs, CU, programs,
    fee payer, account keys), address↔signature index,
    shielded-pool public stats
  → cursor row records last indexed slot

backfill: idempotent from slot 0 — restarting or
re-running over the same range converges to the same rows
  • Idempotent by construction — every write is keyed on (slot) or (signature), so crash-and-restart needs no special recovery.
  • One writer — the indexer owns the database; the explorer only reads. Schema lives with the web workspace and migrates with standard Prisma tooling.
  • Pool stats are counters — commitments, nullifiers, the current root. Nothing private exists to index; see Shielded pool.

What the explorer shows

VIEWCONTENT
OverviewLive slot height, totals, latest blocks and transactions.
Blocks / TransactionsPaged history with status, fees, programs.
Block / transaction / address detailSpec-sheet views: hashes, state roots, account lists, program logs, account activity.
ShieldedPool counters, tree fill, per-transaction note deltas — with amounts rendered as sealed, because they are.
THIS SITE

The explorer you are browsing runs in design-review mode against a deterministic mock chain (wall-clock slots, seeded data) so every page renders without a live node. Wiring it to the real indexer swaps one data module — the views don't change.