Zum Hauptinhalt springen
  1. Eine Auszahlung verschiebt Token von einem privaten Kontostand auf einen öffentlichen Solana-Kontostand.
  2. Auszahlungen werden in einer einzelnen Solana-Transaktion an eine Solana-Wallet-Adresse gesendet.

Auszahlung: Was privat ist

Der erlaubnisfreie Ring ist vertraulich. Betrag und Asset sind verschlüsselt. Ein benutzerdefinierter Ring kann als vertraulich oder anonym konfiguriert werden. Dabei sind Absender, Empfänger, Asset und Betrag verschlüsselt.

So funktioniert eine Auszahlung

Eine Auszahlung funktioniert ähnlich wie eine öffentliche Solana-Übertragung:
  1. Der SOL- oder SPL-Kontostand des Benutzers wird onchain verschlüsselt.
  2. Der Benutzer entschlüsselt den privaten Zustand, die Wallet erstellt eine Auszahlung und der Eigentümer signiert sie.
    • Rufe den verschlüsselten Zustand über dedizierte RPC-Methoden ab. Nur der Benutzer kann Kontostände lokal entschlüsseln.
    • Die Wallet legt Betrag und Empfänger fest und fordert dann einen ZK-Beweis an. Der RPC-Anbieter generiert den ZK-Beweis standardmäßig und gibt ihn zurück.
  3. Die Solana-Laufzeitumgebung prüft die Signaturen und ruft das Solana Privacy Program auf. Dieses prüft den ZK-Beweis, ohne den verschlüsselten Zustand offenzulegen.
  4. Die App verfolgt den Status anhand des Solana-Transaktionshashes.
  1. Der SOL- oder SPL-Kontostand des Benutzers ist onchain öffentlich.
  2. Die Wallet liest den öffentlichen Zustand, erstellt eine Übertragung und der Eigentümer signiert sie.
  3. Die Solana-Laufzeitumgebung prüft die Signaturen und ruft das System Program oder Token Program auf. Dieses aktualisiert den öffentlichen Kontostand.
  4. Die App verfolgt den Status anhand des Solana-Transaktionshashes.
Dies ist der allgemeine Transaktionsablauf für den erlaubnisfreien vertraulichen Ring. Vergleiche ihn mit benutzerdefinierten Rings unter Allgemeiner Transaktionsablauf.

Erste Schritte

1

Voraussetzungen

Für die TypeScript-Beispiele benötigst du Node.js 24 oder höher, pnpm 11.18.0 und die Solana CLI.
Quelle: sdk-libs/ts
Füge einen Helius API key hinzu:
.env
Die Beispiele verwenden standardmäßig die Solana CLI wallet als Gebührenzahler. Der Gebührenzahler muss devnet SOL enthalten. Siehe So erhältst du Devnet SOL.
2

Auf einen öffentlichen Kontostand auszahlen

  • Das SDK gibt Anweisungen zurück. Die App signiert und sendet sie.
  • sendAndConfirmFactory erstellt eine Kit-Transaktion, übermittelt sie und gibt die Signatur sowie den bestätigten slot zurück.
  • Das Beispiel verwendet das Private Solana Token Account, das nach der vorherigen Übertragung übrig ist. Eine Auszahlung kann mehrere UTXOs verwenden.
  • withdrawalUtxo wählt ein Private Solana Token Account aus diesem Kontostand aus.
  • ProofInputUtxo.fromKeypair bereitet das ausgewählte UTXO mit dem privaten Wallet-Schlüsselpaar des Absenders als Beweiseingabe vor.
  • Das Schlüsselpaar leitet den Nullifier ab. Dieser markiert das Eingabe-UTXO als ausgegeben, während Asset und Betrag der Eingabe verschlüsselt bleiben.
  • senderAddress ist die des Absenders. Die Auszahlung erfolgt aus dieser Wallet.
  • [withdrawalInput] listet die vom Absender ausgewählten UTXOs auf. Eine Auszahlung kann mehrere UTXOs ausgeben.
  • senderSigner.address ist die Solana-Adresse des Gebührenzahlers. Ein Gas-Sponsor kann die Gebühr bezahlen.
  • WithdrawalTarget.sol ist der öffentliche Solana-Empfänger. Der Empfänger kann der Eigentümer oder ein Dritter sein.
  • SOL_MINT wählt SOL aus. Bei einer Auszahlung von SPL- oder Token-2022-Assets wird der token mint übergeben.
  • WITHDRAW_AMOUNT wird in den Basiseinheiten des Assets angegeben. SOL verwendet Lamports. SPL- und Token-2022-Assets verwenden die Basiseinheiten des token.
  • withdrawal.sign autorisiert den Zustandsübergang, verschlüsselt das verbleibende private Wechselgeld und erzeugt die Eingaben für den Zero-Knowledge-Prover.
  • assets ist das Asset-Register, mit dem unterstützte private Assets aufgelöst werden.
  • senderKeys verwendet LocalKeys.fromKeypair(sender, client.proofService), um die Beweiserstellung mit den Schlüsseln des Absenders zu autorisieren.
  • client.proveTransact erzeugt den Zero-Knowledge-Proof aus der signierten Auszahlung und gibt serialisierte Anweisungsdaten zurück.
  • Der Proof weist nach, dass der Absender die Eingaben besitzt und ausgeben kann. Das ausgezahlte Asset und der Betrag sind öffentlich. Eingabebeträge und Wechselgeld bleiben verschlüsselt.
  • payer signiert und bezahlt die Solana-Transaktion. Ein Gas-Sponsor kann die Gebühr bezahlen.
  • inputTree und outputTree sind client.tree, der Zustands-Merkle-Baum, der die ausgegebenen UTXOs enthält und das private Wechselgeld des Absenders empfängt.
  • withdrawal ist TransactWithdrawal.sol, das öffentliche Solana-Empfängerkonto.
  • await transactInstruction leitet die Adressen der Nullifier-Konten lokal ab und gibt die Anweisung zurück. Die Nullifier-Konten markieren Eingabe-UTXOs als ausgegeben, damit ein privates Guthaben nicht doppelt ausgegeben werden kann.
  • data enthält den im vorherigen Schritt erzeugten Zero-Knowledge-Proof und das verschlüsselte Wechselgeld.
  • Eine Auszahlung verschiebt das Asset von einem privaten Guthaben auf ein öffentliches Solana-Konto. Sie übergibt das öffentliche Empfängerkonto.
  • sendAndConfirm signiert withdrawalInstruction und übermittelt es als Solana-Transaktion.
  • Die Bestätigung liefert den bestätigten slot, mit dem der Indexer-Abruf gesteuert wird.

Vollständiges Codebeispiel

Klone das Beispiel und führe es aus:
Die Beispiele verwenden hier einen vertraulichen Ring auf local/devnet.
deposit_transfer_withdraw.ts

Verwandte Anleitungen

Deposit

Transfer

Read a Private Balance

Read Private History

Nicht gefunden, wonach du gesucht hast?

Melde dich! Telegram | E-Mail | Kontakt