Skip to content

Latest commit

 

History

History
98 lines (81 loc) · 7.89 KB

File metadata and controls

98 lines (81 loc) · 7.89 KB

Example workspaces: sources and verification

The nine bundled examples are real public transactions retrieved through Chaingraph's own read-only Core/Electrum proxy and stored as snapshots in src/App/Examples/templateData/. Labels, notes, icons, bookmarks and tags are original educational annotations. Tags describe observed amounts, script forms and exact spending links; none of them is an ownership or participant claim.

Catalog

Example Network Chain reference Transactions Initial nodes
Whirlpool: five equal outputs mainnet seed, successor 15 37
An on-chain message mainnet OP_RETURN 2 5
Follow the largest output mainnet 15-input split, funding hop 16 36
One input, 143 outputs mainnet fan-out 2 146
A large WabiSabi CoinJoin mainnet 327 in / 279 out 1 607
Explore a public demo wallet mainnet change-branch funding 10 21
Follow an exact spent output testnet4 creator, spender 3 8
Explore 53 outputs testnet4 fan-out 2 56
From mixed scripts to a spend testnet4 mixed scripts, successor 4 10

Initial nodes counts the loaded evidence. Every example opens on the complete input and output set of its root transactions, because each one is curated around comparing that whole width. Where the count is higher than the opening canvas, the difference is context: a parent transaction kept for its values but not placed on the canvas itself.

Discovery credits

The Whirlpool, WabiSabi, 143-output and OP_RETURN transaction IDs come from the public test fixtures of the MIT-licensed Am I Exposed project. Only the identifiers were used; snapshot JSON was fetched independently, and the protocol names are the publisher's. Chaingraph does not verify protocol provenance, participant identities or the success of any privacy technique. Testnet4 candidates were found through mempool.space testnet4 pages and then fetched from the configured Electrum server. The large split was a public transaction ID supplied during testing.

The public demo wallet

The wallet example uses the intentionally published BIP84 account-0 test zpub (the BIP84 test vector, CC0, also used as Am I Exposed's homepage example). Its seed is public, so never send funds to these addresses, and a match to them establishes nothing about ownership. The snapshot derives receive and change indexes 0 to 9, records 214 known transaction IDs across 11 used addresses, includes 10 complete transaction records (two funding/spending stories with their immediate parents) and keeps the other 204 IDs as pending. The wallet is saved with scanComplete: false, scanLimit: 10 and scanGap: 20; continuing discovery queries the user's backend. A change-branch match is a derivation fact, not proof that an output is economically change.

Snapshot shape

A snapshot holds network, retrievedAt, roots and transactions. Labels, notes, icons, bookmarks, tags and the opening view are built in code in src/App/Examples/workspaceTemplates.ts, not stored in the JSON, so editing prose never means refetching chain data.

An input's funding output can be recorded two ways:

  • attach it to the spending input as vin[].prevout, the same representation Chaingraph's own verbosity-2 fetch produces (see docs/spender-index.md);
  • load the whole parent transaction and scope its display through inputContext, which lists the outputs an example draws.

Prefer the attached prevout unless the example actually puts the parent on the canvas. A loaded parent also loads every output the example never draws, and every one of its own inputs becomes a placeholder node with unknown value and unknown address. createTemplateWorkspace builds inputContext only for parents the snapshot loads in full, and a test caps each snapshot at 400 KB.

Verification

Every snapshot record passed fetchRawInspection: the txid was recomputed from serialized bytes and compared with the saved data along with exact input outpoints, output amounts and script bytes. Raw bytes are not shipped, so raw inspection of an example still needs the backend. The WabiSabi snapshot records the CoinJoin alone and attaches each consumed output to the input that spends it, so all 327 input amounts and scripts are present without the parent transactions. The parents were never drawn on the canvas, and exploring the CoinJoin outward is the point of that example, so fetching a parent is left to the user's backend.

node --use-system-ca --import tsx scripts/verify-examples.ts re-checks the examples against a running backend (CHAINGRAPH_PROXY_URL, default http://127.0.0.1:4000): configured networks, transaction identity and I/O counts, Core versus Electrum serialized bytes, referenced funding outputs and, for testnet4, bounded address histories and known spends. It loads no environment file and prints no endpoints. Histories grow and test networks can reset, so verification describes a moment, not a guarantee. A pruned node may not serve historical transactions.

Snapshot confirmation counts are historical. The end of a bundled path is not a final destination, and a missing spender never proves an output is unspent.