Commitment
A public fingerprint.
Points to a private note and has to bind it exactly. It's a reference, not an encrypted copy of the note.
Protocol overview
Ghostie is designing a bridge that checks cross-chain actions with cryptographic proofs, so you reveal less about yourself to move value from one chain to another.
See how it works, step by stepThe bridge, in plain English
Concept animationOne example, four steps. Walk through the intended bridge flow. Nothing is sent.
The idea
100 USDC · exampleOne idea to remember
Picture proving that a sealed envelope holds the right document without opening it in front of everyone. That's the goal. A real zero-knowledge proof needs a precisely written statement and cryptographic verification; the envelope is only the intuition.
Commitment
Points to a private note and has to bind it exactly. It's a reference, not an encrypted copy of the note.
Proof
Shows that the rules written into the circuit hold, without publishing the private inputs (the witness).
Nullifier
Lets the protocol refuse a note that was already used. Across chains, this needs one shared design.
Who can see what?
Zero-knowledge protects the witness behind a proof. Transparent payouts, public inputs and network metadata each need their own privacy analysis.
What exists today
| Component | Status | Role |
|---|---|---|
| Ghostie interface | Available · demo | Asset selection, demo quotes, the exchange flow, tracking and cashback requests, all simulated in the browser. |
| Quote & order service | Not connected | Live quotes, order creation, verified deposit instructions and status updates will come from an execution service. |
| ZK bridge backend | Not built | Orchestration and settlement for the protocol described on this page. |
| Circuits & proving stack | Not specified | The proof system, its parameters and the circuits will be documented with the implementation. |
| Source & destination contracts | Not deployed | No contract addresses, bytecode or verifier versions exist yet. |
| Cashback register | Demo only | Requests are saved in your browser. No payout operator is connected. |
Target architecture
This is a reference design, not a description of something running. Before a bridge accepts value it has to define custody, supported chains, finality rules, fees and how assets exist on the destination.
After an eligible deposit or lock, a source contract records a commitment. The commitment root only counts once the source chain has reached the required finality. How the destination verifier comes to trust that root is a separate security decision.
The client builds a proof from its private note and the note's membership path in the commitment tree. The circuit enforces ownership and value rules. Whether proving happens in the browser or on a server, and how a lost witness is recovered, are implementation choices still to be made.
The destination checks the proof, its public inputs, the accepted source root and the spend marker. Only when all of them pass can the settlement mechanism release or issue value.
A note is your private record of a position in the protocol. A commitment is the public, cryptographic stand-in for that note. A sound construction binds every field the circuit uses, with unambiguous encoding, domain separation and enough secret randomness.
Illustrative only. Not a production circuit.
C = Commit(protocol_version, source_domain,
asset_id, value, owner_secret, randomness)
Public record: C
Private witness: note fields + membership path
Still to be chosen: the commitment function and its encoding
A note is not your wallet's seed phrase. How notes are stored, backed up, encrypted and recovered needs its own design. Publishing a commitment proves nothing about a deposit on its own, and it doesn't hide a transparent deposit transaction.
"I know a valid, authorized note in an accepted source state, and this destination action follows the protocol's spending rules."
| Private witness (intended) | Public statement (to be defined) |
|---|---|
| Note secrets and randomness | Protocol, circuit and verifier versions |
| Membership path | Accepted source root and source domain |
| Ownership witness | Destination domain and the action it authorizes |
| Value and asset data, where the design allows | Spend marker and any amounts or assets settled in public |
The final circuit has to constrain every field that affects authorization or value: range checks, conservation of value, fees, domain separation and binding to the recipient and action. A proof establishes only what the circuit actually encodes. It can't make up for a missing constraint.
A nullifier marks a note as spent without revealing the note's secrets. The protocol must stop a note being spent twice on any destination it can reach. Separate nullifier lists per chain aren't enough if the same note could be redeemed on two chains independently; notes need to be bound to one destination, or spends need one consistent authorization across chains.
A valid proof about a note doesn't prove the source chain has finalized. The bridge has to authenticate source state on its own and refuse stale, forged or reorganized roots.
A relayer can carry messages and pay gas, but must never be able to change the recipient, amount or destination. If settlement relies on a signer set or an operator, that trust assumption has to be stated plainly.
The aim is to disclose as little as possible while keeping everything independently checkable. Any privacy claim has to name the observer it holds against and follow from the circuit and transaction flow that are actually deployed.
| Observer | What they can see |
|---|---|
| Public blockchain observer | Transparent deposits and payouts show addresses, assets, amounts and timing. A proof doesn't erase those records. |
| Verifier | The proof and every public input. A private witness doesn't mean the public inputs are hidden. |
| Relayer or backend | Requests, IP addresses and routing data, unless the design specifically prevents it. |
| A future execution service | The pair, networks and amount for every quote. Creating an order adds the recipient, memo/tag and your IP address. |
| This demo app | Runs only in your browser. Routes, amounts and addresses are saved in this browser's local storage and sent to no Ghostie server. The page loads its fonts from Google Fonts. |
An external exchange service doesn't shield balances, doesn't produce Ghostie proofs and doesn't hide transfers from itself. Private balances or selective disclosure would need extra mechanisms that are actually built. Routing through a privacy-focused asset doesn't by itself mean a shielded transfer happened.
Nothing here claims an audit, a trusted-setup ceremony, production proving performance or a mainnet deployment. Those claims need published artifacts behind them.
Planned · not live
The endpoints the app is designed to call once an execution service is connected. They cover the exchange lifecycle only; none of them generates Ghostie proofs. In demo mode the app calls none of them: js/catalog.js stands in.
GET /api/assetsThe asset and network catalogue.
GET /api/quote?send=ETH&receive=USDC&amount=0.1&sendNetwork=ETH&receiveNetwork=SOLAn estimated quote for the route, with the minimum amount and timing when available.
GET /api/configWhich features are switched on: quotes, order execution.
POST /api/ordersCreates a floating-rate exchange after the destination is validated and a fresh quote is taken. Body: the route, amount, recipient, optional memo/tag, a request ID and a recovery token.
GET /api/orders/{requestId}The verified order and its latest status. Header: Authorization: Bearer <private recovery token>
The Ghostie economy
After a completed swap you can ask for 100% of the actual service fee back, paid manually in native SOL. Network fees, gas, slippage and rate differences aren't included. Holding $GHOSTIE on its own doesn't earn cashback.
The refund is based on the actual service fee that wasn't refunded. For each payout the operator records the fee and its currency, the conversion rate with its source and time, the final amount in lamports and the payment transaction. Processing time isn't fixed. If the fee can't be verified, the request stays pending; a zero fee pays nothing.
cashback = 100% of the verified service fee payoutSOL = verified fee value / SOL price at review one completed exchange → at most one cashback request
Requests are meant to live on the server, not only in your browser. Your Solana address is shared with the payout operator and linked to your exchange; the payout register isn't public. Anyone holding your recovery link can view or submit that exchange's request, so keep it private. Never enter a seed phrase or private key. Nothing is paid automatically.
In demo mode: cashback requests are saved only in your browser, and nothing is reviewed or paid.
The plan is to put all platform revenue toward buying back $GHOSTIE. SOL cashback comes from a separate budget, so the same revenue is never counted twice. Swap principal and pass-through network fees aren't platform revenue. Buybacks aren't active: the token address, treasury, execution rules and reporting all have to exist first.
No launch date is promised. This page changes as reviewable code and deployments exist.
For a general introduction to zero-knowledge proofs, read Zcash: What are zk-SNARKs? For circuit concepts, see the Circom documentation. These explain the techniques; Ghostie isn't affiliated with either project and doesn't inherit their security.