Zum Hauptinhalt springen
  1. Eine private Übertragung verschiebt Token in einem Ring zwischen privaten Wallets.
  2. Private Übertragungen werden in einer einzigen Solana-Transaktion an eine Solana-Wallet-Adresse gesendet.

Übertragung: Was ist privat?

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

So funktioniert eine Übertragung

Eine private Übertragung funktioniert ähnlich wie eine öffentliche Solana-Übertragung:
  1. Das SOL- oder SPL-Guthaben des Benutzers wird onchain verschlüsselt.
  2. Der Benutzer entschlüsselt den privaten Zustand, die Wallet erstellt eine Übertragung und der Besitzer signiert sie.
    • Rufe den verschlüsselten Zustand mit speziellen RPC-Methoden ab. Nur der Benutzer kann Guthaben 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 über den Solana-Transaktionshash.
  1. Das SOL- oder SPL-Guthaben des Benutzers ist onchain öffentlich.
  2. Die Wallet liest den öffentlichen Zustand, erstellt eine Übertragung und der Besitzer signiert sie.
  3. Die Solana-Laufzeitumgebung prüft die Signaturen und ruft das System Program oder Token Program auf, das das öffentliche Guthaben aktualisiert.
  4. Die App verfolgt den Status über den Solana-Transaktionshash.
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

An ein privates Guthaben übertragen

  • 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 erreichten slot zurück.
In diesem Beispiel wählst du die Eingabe-UTXOs manuell aus. Die Wallet-Helfer des SDK können sie für dich auswählen und reservieren. Hinweise zur Auswahl von Eingaben findest du unter UTXOs auswählen.
  • Das Beispiel gibt das Private Solana Token Account aus, das durch die vorherige Einzahlung erstellt wurde. Eine Übertragung kann mehrere UTXOs ausgeben.
  • transferUtxo wählt ein Private Solana Token Account aus diesem Guthaben 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, der das Eingabe-UTXO als ausgegeben markiert, während Asset und Betrag verschlüsselt bleiben.
  • senderAddress ist die des Absenders. Die Übertragung gibt Guthaben aus diesem Wallet aus.
  • [transferInput] listet die ausgewählten UTXOs des Absenders auf. Eine Übertragung kann mehrere UTXOs ausgeben.
  • senderSigner.address ist die Solana-Adresse des Gebührenzahlers. Ein Gas-Sponsor kann die Gebühr bezahlen.
  • recipient.shieldedAddress() ist die abgeschirmte Adresse des Empfängers. Die übertragene Ausgabe wird mit dem Viewing Key des Empfängers verschlüsselt.
  • SOL_MINT wählt SOL aus. Bei einer SPL- oder Token-2022-Übertragung wird der Token Mint übergeben.
  • TRANSFER_AMOUNT ist in den Basiseinheiten des Assets angegeben. SOL verwendet Lamports. SPL- und Token-2022-Assets verwenden die Basiseinheiten des Tokens.
  • transfer.sign autorisiert den Zustandsübergang, verschlüsselt das Asset und den Betrag und erzeugt die Eingaben für den Zero-Knowledge-Prover.
  • assets ist die Asset-Registry, mit der 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-Beweis aus der signierten Übertragung und gibt serialisierte Anweisungsdaten zurück.
  • Der Beweis zeigt, dass der Absender die Eingaben besitzt und ausgeben kann, ohne das verschlüsselte Asset oder den Betrag offenzulegen.
  • 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 die Ausgabe für den Empfänger sowie das Wechselgeld des Absenders empfängt.
  • 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 Zero-Knowledge-Beweis und die im vorherigen Schritt erzeugten verschlüsselten Ausgaben.
  • Eine private Übertragung verschiebt das Asset nur zwischen privaten Guthaben. Sie übergibt keine öffentlichen Solana-Konten oder Token-Konten.
  • sendAndConfirm signiert transferInstruction 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

Withdraw

Read a Private Balance

Read Private History

Nicht gefunden, wonach du gesucht hast?

Melde dich! Telegram | E-Mail | Kontakt