Private access layer for Solana · devnet beta

Every app.None of your wallet.

Zero-knowledgeSolanaApache-2.0

01 The connection

Every app starts the same way: connect your wallet. One click, and it can read your address, your balance, your history — and every other app you have ever touched. Then it asks you to sign bytes no human can read. One wrong approval, and it is all gone.

02 Exposure

You connect.

Hand over your address, and your balances, your history and your other apps become readable by anyone who looks.

You approve.

Then it asks you to sign. The popup shows bytes no person reads. Approving is an act of faith in someone else's frontend.

You hope.

One malicious approval and the wallet is gone — drainer kits are an industry now. Access should never have meant exposure.

03 The break

GhostLink cuts the chain.

For apps that integrate GhostLink, access can start with a proof instead of a wallet address.

03 Set up once

Start with a signed message.

The trusted setup page asks for the same message twice to check deterministic signing. Treat the resulting identity secret like a key.

03 Prove, don't reveal

Apps get a proof. Not your address.

A verifier checks a claim such as “holds at least 100 USDC” plus an app ID, session binding and other public inputs. The proof omits the wallet address.

03 Ghost mode

Your wallet goes dark.

Proofs reduce disclosure. Pockets add spending limits and owner recovery. Deposits, swaps and home addresses remain visible on-chain.

04 How it works

Three steps.
Less disclosure.

01Identity
Sign message1 of 2

‹GhostLink domain› wants you to sign in with your Solana account:
7xF3…9Ka2

This signature derives your private GhostLink identity.

Typemessage · no transaction
Keep privateidentity secret

Set up once

Sign a plain message to derive an identity in a trusted page. Registration is a separate on-chain step; the low-level SDK does not isolate secrets from its host page.

02Proof
Login proof● verified
holds ≥ 100 USDC
Proof systemBN254 Groth16
Public inputs11
Wallet address████████████
App seesapp_id · yes

Share a proof

Apps check eligibility against a zero-knowledge proof built on your device. The proof discloses the claim and a per-app ID without including the wallet address. Other metadata and on-chain activity may still link users.

03Spending
Pocket · exampledevnet
125.00 USDC
Daily cap12.40 / 50.00
Owner sweephome only
Change homesecret + 24h timelock

Spend from a pocket

Each app gets its own small account with hard limits. It requests outcomes, never signatures — and the chain enforces the deal, or nothing moves.

05 The boundaries

Give each app a boundary.
Keep the limits on-chain.

  1. G—01

    Session keys for app actions

    The wallet adapter supports message sign-in. App actions use limited session keys. A malicious host page can still misuse identity secrets supplied to the low-level SDK.

    registry: one binding per wallet, no update, no admin
  2. G—02

    Proofs, not addresses

    Each app sees a stable ID derived for that app alone. Proof IDs differ by origin. Public funding, home addresses and network metadata can still link activity; the registration set alone does not guarantee anonymity.

    app_id = Poseidon(secret, domain, 1)
  3. G—03

    Atomic outcomes, explicit limits

    Pockets fill intents atomically: the promised outcome arrives in the same transaction, or everything reverts. Configured oracle checks bound slippage; unsupported routes use a separate conservative cap.

    fill_begin ⇄ fill_end, introspected in one transaction
  4. G—04

    An owner-controlled way home

    Owner sweeps return funds home. Swap fills can transfer input tokens to counterparties. Home changes require an owner proof and a 216,000-slot delay, roughly 24 hours.

    sweep_home always available, even with no session

06 Measured, not promised

0
app transactions your wallet ever signs
SDK has no signTransaction
2
proof circuits: login and owner
circuits/login.circom · owner.circom
11
public inputs in the login circuit
circuits/login.circom
128
Merkle roots of history kept on-chain
verifier::merkle::ROOT_HISTORY
216,000
slots before a home change executes
roughly 24 hours; slot time varies
8
program integration test scenarios
programs/itests/tests/flows.rs

07 Compare

Different models.
Different boundaries.

GhostLinkDirect wallet connectEmbedded app-walletsSession-key wallets
Address omitted from sign-in proofYes; host-page trust still mattersAddress shared on connectDepends on architectureDepends on architecture
Prove holdings without revealing themZero-knowledge claimNoNoNo
Main wallet signs app transactionsSession keys sign intentsWallet approves transactionsSeparate app keysA delegated key signs
Hard per-app daily cap enforced on-chainYesNoRarelySometimes
Price floor on every swap, checked on-chainConfigured routes; capped fallbackApp-dependentApp-dependentPolicy-dependent
Owner recovery to a chosen homeOwner proof; delayed home changesNoNoNo
Recovery without a live sessionOwner proof and relayer requiredPer-token approval revokesDepends on providerRevoke only
Works with the wallet you already haveDeterministic Ed25519 signaturesYesNew account or custodianVaries

Architecture-level comparison, not a product ranking. Implementations vary. GhostLink is experimental: its host page receives secrets, and pocket activity is public on-chain.

08 For developers

Give your app access.
Not a wallet connection.

Explore the experimental SDK, circuits and services, published under Apache-2.0. The current SDK runs in a trusted page; an isolated identity broker is still future work.

login.ts
// Work in a trusted host page. The current SDK
// receives identity secrets and wallet witnesses.
import { GhostLink, softwareSession } from "@ghostlink/sdk";

const gl = await GhostLink.init({
  cluster: "devnet", indexer: INDEXER_URL, prover,
});

const session = await gl.prove({
  identity, witness, home, currentSlot, expirySlot,
  session: softwareSession(),
  // Omit claim for registration-only proof.
});

// Backend: verify the proof AND a signature over
// a fresh, single-use server challenge.
// See the complete authentication quickstart.

09 On your terms

Stay unseen.

Share less with apps that integrate GhostLink. Start with the experimental SDK.