Qlyphs Docs

Verified by design

How purchase proofs bind an offer to state signed by trusted witnesses, and what remains trusted.

The question

How does your wallet know an offer is real before paying for it?

Token balances and reservations are computed on top of Quantus. A false reservation could ask a buyer to pay for tokens they will not receive, so the signing wallet requires more than an unsigned server response before a purchase.

Replay from a fixed checkpoint

QLYP interprets blocks after a published activation anchor, in order. The anchor itself is excluded. Identical inputs and rules produce identical state. Provisional views may change during a reorganization; purchase proofs bind a finalized checkpoint.

  • Sent 3 QTCblock #184,222
  • Received 12.5 QTCblock #184,220
  1. 01 / 05

    Blocks keep arriving

    New Quantus blocks can be provisional and may be replaced by a reorganization. A configured node reports both its best head and finalized checkpoint; their gap is compressed in this illustration.

  2. 02 / 05

    Finalized and provisional are separate

    Witness proofs describe finalized state. Finality is reported by the configured node, not assumed after one newer block. The service may also expose provisional state, which can change before finality.

  3. 03 / 05

    Read in order, from a fixed start

    Replay begins with empty QLYP state at the excluded activation anchor. The next block is the first interpreted block; subsequent finalized blocks are processed in order without gaps.

  4. 04 / 05

    The same chain gives the same result

    Identical blocks and protocol rules produce identical state. This makes replay reproducible, but does not independently verify node consensus or establish that a witness implementation is correct.

  5. 05 / 05

    Attestation keys are not spending keys

    An indexer does not need user spending keys to derive balances. Witnesses have their own attestation keys, which authenticate state and cannot spend from a user account.

Finality comes from the configured node. Replaying state is reproducibility, not independent consensus verification. A service can maintain provisional state while keeping its durable finalized checkpoint separate.

Two trusted witnesses

The development deployment provides TypeScript and Python witness implementations. A purchase policy requires signatures from two configured witness operators over the same state root and finalized checkpoint. Each uses ML-DSA-87. The policy binds the public keys, network, runtime, rules and freshness limits in the wallet build; a website cannot substitute a key.

Separate implementations reduce shared implementation risk. Independent operation and separate node infrastructure are deployment requirements, not properties established by the code alone. The signatures authenticate what those witnesses attest; they do not prove the witnesses are honest or replace the chain's consensus.

Fresh, bound and never rolled back

Each witness statement binds its state root to the network's genesis, the activation anchor, the runtime, the rules, the finalized block and a fresh 256-bit challenge chosen by your wallet. A statement is valid for at most 60 seconds. The wallet also remembers the highest checkpoint it has accepted, so a witness cannot later show it an older state, or two different states at the same height.

Selective proofs: only what you are buying

In development

Selective proofs (QPA2) are being developed together with open listings on a development track.

Today the wallet checks the reservation inside the full signed state. The next proof format commits to that state in eight sections (assets, balances, sequences, multisigs, tickets for reservations, symbols, inscriptions and listings), each with its own SHA-512 Merkle tree. The witnesses sign one root over the section roots and their sizes. Your wallet then receives only the listing it is buying, its asset and their inclusion paths, instead of a whole snapshot.

listingroot
Witness 1 · ML-DSA-87 ✓Witness 2 · ML-DSA-87 ✓
  1. 01 / 05

    One entry arrives

    The wallet receives the reservation it is about to buy and the proof data needed to check it. This small tree illustrates how one entry can be bound to a signed state root.

  2. 02 / 05

    A neighbour joins it

    Along with the listing comes one hash per level of the tree. The wallet hashes the listing together with its neighbour, the entry next to it. The result is a new hash that stands for both of them.

  3. 03 / 05

    And again, level by level

    It repeats the step: the result is paired with the next hash it was given, and so on, climbing one level at a time. Proof size grows with tree depth. This drawing has a few entries; it does not establish a latency guarantee.

  4. 04 / 05

    It reaches a root

    At the top there is a single hash, the root. The wallet computed it itself, from the very listing it will pay for. It is a fingerprint of the whole market that changes if any single entry changes.

  5. 05 / 05

    The witnesses’ root must match

    That root must match the checkpoint signed by both trusted witnesses with ML-DSA-87. A changed entry fails the proof check. Valid signatures authenticate what the witnesses attested; dishonest witnesses or compromised implementations remain risks.

A path needs at most one sibling hash per tree level, so it grows with the logarithm of the section size:

Entries in the section100,000
Sibling hashes in one path, at most
17
Path size, SHA-512
1,088 bytes
081624110¹10²10³10⁴10⁵10⁶10⁷
Try a section size

A section of 100,000 entries needs at most 17 sibling hashes. The whole reply also carries headers, entries and signatures, and is capped at 256 KiB. The service that gathers the proofs is untrusted: it cannot swap witness keys, and a missing entry is an error, never an empty balance.

Each check rules something out

CheckWhat it rules out
Two signatures from keys compiled into the walletA website or server inventing a state
Both witnesses sign the same rootOne faulty or compromised replay engine
A fresh challenge, at most 60 seconds oldReplaying an old, once-true statement
A finalized block, never older than the last one seenPaying on a state that can still be reorganized or rolled back
The reservation is found in the signed stateAn entry that was changed or made up
The purchase is built from the proven termsA site changing the price, amount or payee

What the wallet checks before paying

  • The required witness signatures against the compiled trust policy.
  • Agreement on the state root, finalized checkpoint and bound network/runtime/rules, within the policy's freshness limits.
  • The reservation proof and named buyer, then the native proposal's exact call, membership, approval state and expiry through its configured Quantus node.
  • The purchase it constructs against those committed terms, followed by your approval on the wallet's own screen.

Any failed required check refuses the purchase. Builds without the purchase policy refuse purchases, and witnesses remain disabled on mainnet. A valid proof authenticates an attested checkpoint; it cannot guarantee a later transaction will still succeed. Check the eventual transaction result and finality.

On this page