> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Privater Zustand und UTXOs

> Erfahre, wie UTXOs Token und private Zustände speichern.

<a id="private-solana-token-accounts" />

Ein privates Guthaben wird in UTXOs (nicht ausgegebenen Transaktionsausgaben) gespeichert.
Du kannst dir UTXOs als private SPL-Token-Konten vorstellen. Es gibt jedoch zwei wesentliche Unterschiede:

1. Ein UTXO ist kein Solana-Konto und benötigt daher keine Befreiung von der Rent.
2. Sein Guthaben wird onchain verschlüsselt.

Das Datenlayout eines UTXO ähnelt dem von SPL-Token-Konten:

* **Eigentümer** – Solana-Keypair, PDA oder P-256-Schlüssel.
* **Asset** – der Mint (SOL, SPL oder Token-2022).
* **Betrag** – die Anzahl der Einheiten von `asset` in der kleinsten Einheit.
* **Daten** – ein UTXO kann beliebige Daten speichern, zum Beispiel den Eigentümer treuhänderisch verwahrter Token.
* **Programm- und Richtliniendaten** – optional konfigurierte Ring-Compliance.

<Tabs>
  <Tab title="Diagram">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/account-comparison-private.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=4143bb77db4e5ff44225882d571b8830" alt="Ein privates Solana-Token-Konto. Das Solana Privacy Program besitzt ein privates Token-Konto, das in seine UTXO-Felder aufgeteilt ist: Eigentümer, Asset, Betrag, Daten, Richtliniendaten und Richtlinienprogramm-ID." width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    Der vollständige Datensatz, der für jedes private Solana-Token-Konto gespeichert wird, ist ein flaches UTXO:

    ```rust theme={"system"}
    struct Utxo {
        /// Constant separating UTXOs from other Poseidon-hashed data.
        domain: u16,
        /// Recipient's `owner_hash` from their Shielded Address.
        /// Senders write this value directly; the spender supplies the preimage
        /// components as proof witness.
        owner: [u8; 32],
        /// Asset mint. SOL is Address::default().
        asset: Address,
        /// Amount in the smallest unit of `asset`.
        amount: u64,
        /// Random bytes ensuring distinct UTXO hashes for equal
        /// `(owner, asset, amount)` triples.
        blinding: [u8; 31],
        /// Arbitrary program data.
        program_data: Option<Vec<u8>>,
        /// Arbitrary policy data.
        policy_data: Option<Vec<u8>>,
        /// The policy program that authorizes spends of this UTXO.
        policy_program_id: Option<Address>,
    }
    ```
  </Tab>
</Tabs>

<Info>
  Quellcode ansehen: [Spezifikation](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/docs/spec.md#utxo) · [sdk-libs/transaction/src/utxo/note.rs](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/sdk-libs/transaction/src/utxo/note.rs#L16)
</Info>

<Accordion title="View Solana token account">
  <Tabs>
    <Tab title="Diagram">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/account-comparison-solana.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=89ff901091255f2038972208fcb5d538" alt="Solana-Token-Konto." width="1080" height="462" data-path="images/privacy/account-comparison-solana.svg" />
    </Tab>

    <Tab title="Code">
      ```rust theme={"system"}
      pub struct Account {
          /// The mint associated with this account
          pub mint: Pubkey,
          /// The owner of this account.
          pub owner: Pubkey,
          /// The amount of tokens this account holds.
          pub amount: u64,
          /// If `delegate` is `Some` then `delegated_amount` represents
          /// the amount authorized by the delegate
          pub delegate: COption<Pubkey>,
          /// The account's state
          pub state: AccountState,
          /// If is_native.is_some, this is a native token, and the value logs the
          /// rent-exempt reserve. An Account is required to be rent-exempt, so
          /// the value is used by the Processor to ensure that wrapped SOL
          /// accounts do not drop below this threshold.
          pub is_native: COption<u64>,
          /// The amount delegated
          pub delegated_amount: u64,
          /// Optional authority to close the account.
          pub close_authority: COption<Pubkey>,
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

<a id="private-wallet-balance" />

## Privates Guthaben

Das private Guthaben ist die Summe aller UTXOs eines Assets, die einem privaten Wallet gehören.
Das Wallet zeigt ein einziges Guthaben an, unabhängig davon, ob das private Guthaben
aus einem oder mehreren UTXOs besteht.
Eine private Übertragung kann mehrere UTXOs gleichzeitig ausgeben.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-set-to-wallet.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=398e39f96fc52325c895e512a9b09dc7" alt="Ein privates Wallet ist durch gestrichelte Linien mit mehreren UTXOs verbunden, die jeweils einen Betrag eines Assets enthalten. Das Wallet-Guthaben entspricht der Summe der UTXOs." width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

## Private Übertragung

Private Übertragungen mit UTXOs funktionieren anders als öffentliche Übertragungen mit SPL-Token-Konten:

* Eine Übertragung von einem SPL-Token-Konto aktualisiert `amount`.
* Eine private Übertragung mit UTXOs aktualisiert `amount` eines UTXO nicht.
  Stattdessen geben private Übertragungen vorhandene UTXOs aus
  und erstellen neue UTXOs für den Empfänger sowie für das Restguthaben des Absenders.

Für Benutzer fühlen sich öffentliche Übertragungen mit Solana-Token-Konten
und private Übertragungen mit UTXOs dennoch ähnlich an.

Alice hat beispielsweise 50 USDC und sendet Bob 35 USDC.

* Bei SPL-Token-Konten sinkt Alices `amount` von 50 auf 15 und Bobs steigt um 35.
* Bei UTXOs besitzt Alice ein UTXO über 50 USDC. Die Transaktion gibt das vorhandene UTXO aus und erstellt zwei neue UTXOs: eines über 35 USDC für Bob und eines über 15 USDC für Alice.

<Tabs>
  <Tab title="Transfer with one UTXO">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/spend-comparison.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=c25d35501ca9fcff9b4c0c7c8654dd73" alt="Ein UTXO ausgeben" width="1016" height="240" data-path="images/privacy/spend-comparison.svg" />
  </Tab>

  <Tab title="Transfer with multiple UTXOs">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/spend-comparison-multi.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=c35ec9ab7c87c8d3cdb9e3d1caaf7742" alt="Mehrere UTXOs ausgeben" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
  </Tab>
</Tabs>

| | Solana-Token-Konto | Privates Solana-Token-Konto (UTXO) |
| - | - | - |
| Guthaben | `amount` im Konto | Die Summe aller nicht ausgegebenen UTXOs, von denen jedes einen festen Betrag eines Assets enthält |
| Ausgabe | Aktualisiert das Feld `amount` | Macht ausgegebene UTXOs ungültig und erstellt ein neues UTXO |
| Sichtbarkeit | Öffentlich onchain | Verschlüsselt onchain |

### UTXO-Auswahl

Für private Übertragungen wählt das SDK nicht ausgegebene UTXOs aus, die den zu übertragenden Betrag abdecken.

Der UTXO-Auswahlalgorithmus gibt pro Übertragung so wenige UTXOs wie möglich aus:

1. Das SDK filtert deine UTXOs nach dem gesendeten Asset und sortiert sie nach Betrag.
2. Das SDK wählt so viele UTXOs aus, wie zum Abdecken des Übertragungsbetrags erforderlich sind.
   Es wählt zuerst die größten UTXOs aus, bis der Übertragungsbetrag abgedeckt ist.

Alice sendet Bob beispielsweise 80 USDC. Ihre drei größten UTXOs reichen aus, um die Übertragung abzudecken:

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="Alice sendet 80 USDC. Ihre UTXOs sind absteigend sortiert: 40, 25, 20, 10 und 5 USDC. Das SDK wählt 40, 25 und 20 USDC aus, die 80 USDC abdecken, und lässt 10 und 5 USDC unausgewählt." width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

Weniger UTXOs halten die Transaktion klein.
Jedes ausgegebene UTXO fügt 66 Byte für ein Nullifier-Konto hinzu, das das UTXO als ausgegeben markiert.
Das Konto verhindert, dass das UTXO <Tooltip tip="The nullifier account is temporary. Asynchronously, the Forester inserts the nullifier into the nullifier Merkle tree, which records the UTXO as spent permanently. The Forester then closes the account and reclaims the rent-exemption.">erneut ausgegeben wird</Tooltip>.

Beispiele für private Übertragungen ohne zusätzliche Daten oder weitere Anweisungen:

| Ausgegebene UTXOs | Transaktionsgröße | Konten |
| - | - | - |
| 2 | 927 Byte | 6 |
| 5 | 1.125 Byte | 9 |
| 36 | 3.055 Byte | 40 |

### Transaktionsvarianten

Jede private Übertragung verwendet eine Transaktionsvariante: eine feste Anzahl von slots für auszugebende UTXOs und neu zu erstellende UTXOs.

Die Varianten reichen von 1 bis 36 ausgegebenen UTXOs. Jede Variante hat ihren eigenen ZK-Schaltkreis.
Der Schaltkreis beweist, dass die ausgegebenen UTXOs gültig sind und die neuen UTXOs denselben Gesamtbetrag enthalten.
Wenn eine Übertragung mehr als 36 UTXOs benötigt, [führe sie zuerst zusammen](#utxos-zusammenführen).

Das SDK wählt eine zur Übertragung passende Variante aus und füllt ungenutzte slots mit Dummy-UTXOs.
Dummy-UTXOs haben keinen Wert und sehen onchain wie echte UTXOs aus.

<Tabs>
  <Tab title="1 spent, 2 new">
    Alice sendet Bob 30 USDC. Ihr größtes UTXO deckt die Übertragung ab.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-1-2.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=728d31824165d27d6fd5f98704431f5e" alt="Alices UTXO über 40 USDC wird ausgegeben. Ihre UTXOs über 25, 20, 10 und 5 USDC bleiben nicht ausgegeben. Die Transaktion erstellt 30 USDC für Bob und 10 USDC für Alice." width="520" height="286" data-path="images/privacy/utxo-variant-1-2.svg" />
  </Tab>

  <Tab title="2 spent, 2 new">
    Alice sendet Bob 60 USDC. Ihre zwei größten UTXOs decken die Übertragung ab.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-2-2.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=75d3804ee8a731e2b213dcbda9f3edbc" alt="Alices UTXOs über 40 und 25 USDC werden ausgegeben. Ihre UTXOs über 20, 10 und 5 USDC bleiben nicht ausgegeben. Die Transaktion erstellt 60 USDC für Bob und 5 USDC für Alice." width="520" height="286" data-path="images/privacy/utxo-variant-2-2.svg" />
  </Tab>

  <Tab title="3 spent, 3 new">
    Alice sendet Bob 80 USDC. Ihre drei größten UTXOs decken die Übertragung ab. Das SDK füllt den ungenutzten slot mit einem Dummy-UTXO.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-3-3.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=7cb4508367f8caaa674bd419719aec0b" alt="Alices UTXOs über 40, 25 und 20 USDC werden ausgegeben. Ihre UTXOs über 10 und 5 USDC bleiben nicht ausgegeben. Die Transaktion erstellt 80 USDC für Bob, 5 USDC für Alice und ein Dummy-UTXO über 0 USDC im ungenutzten slot." width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    Alice sendet Bob 95 USDC. Ihre vier größten UTXOs decken die Übertragung ab. Das SDK füllt die zwei ungenutzten slots mit Dummy-UTXOs.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-4-3.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=cf9bdd94965b8861ca25247bbe078c1c" alt="Alices UTXOs über 40, 25, 20 und 10 USDC werden ausgegeben. Ihr UTXO über 5 USDC bleibt nicht ausgegeben. Die Transaktion erstellt 95 USDC für Bob und zwei Dummy-UTXOs über 0 USDC in den ungenutzten slots." width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | Ausgegebene UTXOs | Neue UTXOs |
  | - | - |
  | 1 | 1, 2 oder 8 |
  | 2 | 2 oder 3 |
  | 3 | 3 |
  | 4 | 3 oder 4 |
  | 5 | 3 oder 4 |
  | 36 | 2 |

  <Info>
    Quellcode ansehen: [Spezifikation](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [Unterstützte Varianten](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

## UTXOs zusammenführen

Wenn du viele Übertragungen empfängst, ohne etwas auszugeben, kann sich das private Guthaben auf viele UTXOs verteilen.

Wenn eine Übertragung mehr als 36 UTXOs benötigt, führe sie zuerst zusammen, damit der Benutzer das gesamte Guthaben in einer Übertragung ausgeben kann.
Die meisten Benutzer werden selten auf ein fragmentiertes Guthaben stoßen, da eine Übertragung bis zu 36 UTXOs ausgeben kann.

* Eine Zusammenführung kombiniert UTXOs desselben Eigentümers und Assets zu einem UTXO mit demselben Gesamtwert.
* Eine Zusammenführung kann keine Mittel ausgeben oder den Eigentümer ändern.
* Die Zusammenführung kann im Hintergrund erfolgen, ohne die UX für Endbenutzer zu beeinträchtigen.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="Eine Zusammenführung gibt fünf UTXOs von Alice über jeweils 1 USDC aus und erstellt für Alice ein neues UTXO über 5 USDC." width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

Wie viele Zusammenführungen erforderlich sind, um das gesamte Guthaben in einer Übertragung auszugeben, hängt von der Anzahl der enthaltenen UTXOs ab:

| UTXOs im Guthaben | Zusammenführungen vor der Übertragung | Übertragung |
| - | - | - |
| 1 bis 36 | Keine | Eine Übertragung gibt jedes UTXO aus |
| 37 | 1 Zusammenführung von 2 UTXOs | Eine Übertragung mit 36 UTXOs |
| 100 | 2 parallele Zusammenführungen von je 36 UTXOs | Eine Übertragung mit 30 UTXOs |
| 1.296 | 36 parallele Zusammenführungen von je 36 UTXOs | Eine Übertragung mit 36 UTXOs |

Jede Zusammenführung ist eine Solana-Transaktion mit einem ZK-Beweis und wandelt bis zu 36 UTXOs in ein UTXO um.
Da das Ergebnis der Zusammenführung deterministisch ist, werden die Zusammenführungsbeweise und der Übertragungsbeweis parallel erzeugt.

### Beispiel für die Verwendung einer Zusammenführungsanweisung

Deine Anwendung kann UTXOs zu zwei Zeitpunkten zusammenführen:

* **Beim Synchronisieren des privaten Guthabens:** beim Entsperren des Wallets, Öffnen des privaten Wallets, Fortsetzen der App, Wiederherstellen der Netzwerkverbindung, bei einer Lücke im stream oder beim Wiederherstellen des Wallets.
* **Vor einer Übertragung:** wenn die Übertragung mehr als 36 UTXOs benötigt.

<Info>
  Zusammenführungen werden ohne Benutzersignatur ausgeführt. Benutzerdefinierte Rings legen ihre eigenen Berechtigungen für Zusammenführungen fest.
  Wenn du das eingebettete private Wallet verwendest, erfolgt die Zusammenführung automatisch im Hintergrund.
</Info>

<Accordion title="Example for Merge">
  Ein privates Wallet enthält beispielsweise 1.296 USDC in 1.296 UTXOs, nachdem es 1.296 private Übertragungen über jeweils 1 USDC empfangen hat.
  Eine Übertragung gibt höchstens 36 UTXOs aus. Daher gibt das Wallet das Guthaben in zwei Schritten aus:

  1. 36 Zusammenführungstransaktionen werden parallel ausgeführt und erstellen 36 UTXOs über jeweils 36 USDC.
  2. Eine Übertragung mit 36 Eingaben gibt das gesamte Guthaben von 1.296 USDC aus.

  <Info>
    Beispielcode ansehen: [sdk-tests/client/rust/optimized\_merge\_transfer.rs](https://github.com/helius-labs/zolana/blob/1be5fe5c8865badd2852617d18a8f5ca06b592f1/sdk-tests/client/rust/optimized_merge_transfer.rs) · [sdk-tests/client/typescript/optimized-merge-transfer.test.ts](https://github.com/helius-labs/zolana/blob/1be5fe5c8865badd2852617d18a8f5ca06b592f1/sdk-tests/client/typescript/optimized-merge-transfer.test.ts)
  </Info>
</Accordion>

<a id="latency-and-concurrency" />

## UTXO-Parallelität

Benutzer können private Guthaben ausgeben, sobald die Transaktionen final sind.

Ein privates Guthaben kann parallel ausgegeben werden, wenn es auf mehrere UTXOs aufgeteilt ist. Jedes UTXO kann gleichzeitig in einer separaten Transaktion ausgegeben werden. Ein Guthaben aus drei UTXOs über jeweils 100 USDC kann beispielsweise gleichzeitig drei Übertragungen von bis zu 100 USDC finanzieren. Das Wallet wählt aus, welche UTXOs ausgegeben werden.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="Alices drei UTXOs über jeweils 100 USDC finanzieren gleichzeitig drei Übertragungen, ein UTXO pro Übertragung." width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

Ein einzelnes UTXO kann nur einmal ausgegeben werden.

Die Durchsatzgrenzen des Protokolls findest du unter [State Merkle Tree und Forester](/docs/de/privacy/concepts/architecture#zustands-merkle-baum-und-forester).

## Mehr erfahren

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/de/privacy/concepts/overview">
    Rings, Datenschutzgarantien und Transaktionsablauf.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/de/privacy/concepts/architecture">
    So interagieren Wallets, RPC-Dienste und Solana-Programme.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/de/privacy/concepts/encryption">
    So werden Assets verschlüsselt und diese Rolle spielt das abgeschirmte Keypair.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/de/privacy/integration/enterprise">
    Erfahre, wie du einen benutzerdefinierten Ring konfigurierst.
  </Card>
</CardGroup>

## Nicht gefunden, wonach du gesucht hast?

<Callout type="info">
  Melde dich! [Telegram](https://t.me/tilo_light) | [E-Mail](mailto:sales@helius.xyz) | [Kontakt](https://www.helius.dev/contact)
</Callout>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.