> ## 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.

# State Privat dan UTXO

> Pelajari cara UTXO menyimpan token dan state privat.

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

Saldo privat disimpan dalam UTXO (output transaksi yang belum dibelanjakan).
Anda dapat menganggap UTXO sebagai akun token SPL privat, dengan dua perbedaan utama:

1. UTXO bukan akun Solana sehingga tidak memerlukan pembebasan biaya sewa.
2. Saldonya dienkripsi secara onchain.

Tata letak data UTXO serupa dengan akun token SPL:

* **Pemilik** – keypair Solana, PDA, atau kunci P-256.
* **Aset** – mint (SOL, SPL, atau Token-2022).
* **Jumlah** – jumlah unit `asset`, dalam unit terkecilnya.
* **Data** – UTXO dapat menyimpan data arbitrer, misalnya pemilik token yang ditempatkan dalam escrow.
* **Data program dan kebijakan** – kepatuhan Ring terkonfigurasi yang bersifat opsional.

<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="Akun Token Solana Privat. Program Privasi Solana memiliki Akun Token Privat, yang diperluas menjadi bidang-bidang UTXO: pemilik, aset, jumlah, data, data kebijakan, dan ID program kebijakan." width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    Rekaman lengkap yang disimpan untuk setiap Akun Token Solana Privat adalah UTXO datar:

    ```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>
  Lihat kode sumber: [Spesifikasi](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="Akun token Solana." 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" />

## Saldo Privat

Saldo privat adalah jumlah seluruh UTXO dari satu aset yang dimiliki oleh dompet privat.
Dompet menampilkan satu saldo, terlepas dari apakah saldo privat
terdiri dari satu atau beberapa UTXO.
Transfer privat dapat membelanjakan beberapa UTXO sekaligus.

<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="Dompet Privat yang terhubung dengan garis putus-putus ke beberapa UTXO, masing-masing menyimpan sejumlah nilai dari satu aset. Saldo dompet adalah jumlah seluruh UTXO." width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

## Transfer Privat

Transfer privat dengan UTXO bekerja secara berbeda dari transfer publik dengan akun token SPL:

* Transfer dari akun token SPL memperbarui `amount`.
* Transfer privat dengan UTXO tidak memperbarui `amount` milik UTXO.
  Sebagai gantinya, transfer privat membelanjakan UTXO yang ada
  dan membuat UTXO baru untuk penerima serta sisa saldo pengirim.

Namun, bagi pengguna, transfer publik dengan akun token Solana
dan transfer privat dengan UTXO terasa serupa.

Sebagai contoh, Alice memiliki 50 USDC dan mengirimkan 35 USDC kepada Bob.

* Dengan akun token SPL, `amount` milik Alice berkurang dari 50 menjadi 15, sedangkan milik Bob bertambah 35.
* Dengan UTXO, Alice memiliki satu UTXO senilai 50 USDC. Transaksi membelanjakan UTXO yang ada dan membuat dua UTXO baru: satu senilai 35 USDC untuk Bob dan satu senilai 15 USDC untuk 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="Membelanjakan satu UTXO" 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="Membelanjakan beberapa UTXO" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
  </Tab>
</Tabs>

| | Akun token Solana | Akun token Solana privat (UTXO) |
| - | - | - |
| Saldo | `amount` dalam akun | Jumlah seluruh UTXO yang belum dibelanjakan, masing-masing dengan jumlah tetap dari satu aset |
| Pembelanjaan | Memperbarui bidang `amount` | Membatalkan UTXO yang telah dibelanjakan dan membuat UTXO baru |
| Visibilitas | Publik secara onchain | Dienkripsi secara onchain |

### Pemilihan UTXO

Untuk transfer privat, SDK memilih UTXO yang belum dibelanjakan dan mencukupi jumlah yang ingin Anda transfer.

Algoritma pemilihan UTXO membelanjakan sesedikit mungkin UTXO per transfer:

1. SDK memfilter UTXO Anda berdasarkan aset yang dikirim dan mengurutkannya berdasarkan jumlah.
2. SDK memilih UTXO sebanyak yang diperlukan untuk mencukupi jumlah transfer.
   SDK memilih UTXO terbesar terlebih dahulu hingga jumlah transfer tercukupi.

Sebagai contoh, Alice mengirimkan 80 USDC kepada Bob. Tiga UTXO terbesarnya cukup untuk mencakup transfer tersebut:

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="Alice mengirimkan 80 USDC. UTXO miliknya diurutkan dari yang terbesar: 40, 25, 20, 10, dan 5 USDC. SDK memilih 40, 25, dan 20 USDC, yang mencukupi 80 USDC, serta membiarkan 10 dan 5 USDC tidak dipilih." width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

Jumlah UTXO yang lebih sedikit menjaga ukuran transaksi tetap kecil.
Setiap UTXO yang dibelanjakan menambahkan 66 byte untuk akun nullifier, yang menandai UTXO sebagai telah dibelanjakan.
Akun tersebut mencegah 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.">dibelanjakan kembali</Tooltip>.

Contoh transfer privat tanpa data tambahan atau instruksi lainnya:

| UTXO yang dibelanjakan | Ukuran transaksi | Akun |
| - | - | - |
| 2 | 927 byte | 6 |
| 5 | 1.125 byte | 9 |
| 36 | 3.055 byte | 40 |

### Varian Transaksi

Setiap transfer privat menggunakan varian transaksi: jumlah slot tetap untuk UTXO yang akan dibelanjakan dan UTXO baru yang akan dibuat.

Varian berkisar dari 1 hingga 36 UTXO yang dibelanjakan, dan setiap varian memiliki sirkuit ZK tersendiri.
Sirkuit tersebut membuktikan bahwa UTXO yang dibelanjakan valid dan UTXO baru menyimpan jumlah total yang sama.
Jika transfer memerlukan lebih dari 36 UTXO, [gabungkan terlebih dahulu](#menggabungkan-utxo).

SDK memilih varian yang sesuai dengan transfer dan mengisi slot yang tidak digunakan dengan UTXO dummy.
UTXO dummy tidak menyimpan nilai dan terlihat seperti UTXO asli secara onchain.

<Tabs>
  <Tab title="1 spent, 2 new">
    Alice mengirimkan 30 USDC kepada Bob. UTXO terbesarnya mencukupi transfer tersebut.

    <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="UTXO Alice senilai 40 USDC dibelanjakan, sedangkan UTXO miliknya yang bernilai 25, 20, 10, dan 5 USDC tetap belum dibelanjakan. Transaksi membuat 30 USDC untuk Bob dan 10 USDC untuk Alice." width="520" height="286" data-path="images/privacy/utxo-variant-1-2.svg" />
  </Tab>

  <Tab title="2 spent, 2 new">
    Alice mengirimkan 60 USDC kepada Bob. Dua UTXO terbesarnya mencukupi transfer tersebut.

    <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="UTXO Alice senilai 40 dan 25 USDC dibelanjakan, sedangkan UTXO miliknya yang bernilai 20, 10, dan 5 USDC tetap belum dibelanjakan. Transaksi membuat 60 USDC untuk Bob dan 5 USDC untuk Alice." width="520" height="286" data-path="images/privacy/utxo-variant-2-2.svg" />
  </Tab>

  <Tab title="3 spent, 3 new">
    Alice mengirimkan 80 USDC kepada Bob. Tiga UTXO terbesarnya mencukupi transfer tersebut. SDK mengisi slot yang tidak digunakan dengan UTXO dummy.

    <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="UTXO Alice senilai 40, 25, dan 20 USDC dibelanjakan, sedangkan UTXO miliknya yang bernilai 10 dan 5 USDC tetap belum dibelanjakan. Transaksi membuat 80 USDC untuk Bob, 5 USDC untuk Alice, dan satu UTXO dummy senilai 0 USDC di slot yang tidak digunakan." width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    Alice mengirimkan 95 USDC kepada Bob. Empat UTXO terbesarnya mencukupi transfer tersebut. SDK mengisi dua slot yang tidak digunakan dengan UTXO dummy.

    <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="UTXO Alice senilai 40, 25, 20, dan 10 USDC dibelanjakan, sedangkan UTXO miliknya senilai 5 USDC tetap belum dibelanjakan. Transaksi membuat 95 USDC untuk Bob dan dua UTXO dummy senilai 0 USDC di slot yang tidak digunakan." width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | UTXO yang dibelanjakan | UTXO baru |
  | - | - |
  | 1 | 1, 2, atau 8 |
  | 2 | 2 atau 3 |
  | 3 | 3 |
  | 4 | 3 atau 4 |
  | 5 | 3 atau 4 |
  | 36 | 2 |

  <Info>
    Lihat kode sumber: [Spesifikasi](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [Varian yang didukung](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

## Menggabungkan UTXO

Menerima banyak transfer tanpa melakukan pembelanjaan dapat memecah saldo privat ke banyak UTXO.

Jika transfer memerlukan lebih dari 36 UTXO, gabungkan terlebih dahulu agar pengguna dapat membelanjakan seluruh saldo dalam satu transfer.
Sebagian besar pengguna jarang menemui saldo yang terfragmentasi karena satu transfer dapat membelanjakan hingga 36 UTXO.

* Penggabungan menyatukan UTXO dengan pemilik dan aset yang sama menjadi satu UTXO dengan nilai total yang sama.
* Penggabungan tidak dapat membelanjakan dana atau mengubah pemilik.
* Penggabungan dapat dilakukan secara internal tanpa memengaruhi UX pengguna akhir.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="Penggabungan membelanjakan lima UTXO milik Alice yang masing-masing bernilai 1 USDC dan membuat satu UTXO baru senilai 5 USDC untuk Alice." width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

Jumlah penggabungan yang diperlukan untuk membelanjakan seluruh saldo dalam satu transfer bergantung pada jumlah UTXO yang menyimpannya:

| UTXO dalam saldo | Penggabungan sebelum transfer | Transfer |
| - | - | - |
| 1 hingga 36 | Tidak ada | Satu transfer membelanjakan setiap UTXO |
| 37 | 1 penggabungan dari 2 UTXO | Satu transfer dengan 36 UTXO |
| 100 | 2 penggabungan dari 36 UTXO, secara paralel | Satu transfer dengan 30 UTXO |
| 1.296 | 36 penggabungan dari 36 UTXO, secara paralel | Satu transfer dengan 36 UTXO |

Setiap penggabungan merupakan satu transaksi Solana dengan bukti ZK dan mengubah hingga 36 UTXO menjadi satu.
Karena hasil penggabungan bersifat deterministik, bukti penggabungan dan bukti transfer dibuat secara paralel.

### Contoh Penggunaan Instruksi Penggabungan

Aplikasi Anda dapat melakukan penggabungan pada dua tahap:

* **Saat menyinkronkan saldo privat:** ketika dompet dibuka kuncinya, dompet privat dibuka, aplikasi dilanjutkan, jaringan tersambung kembali, terjadi celah stream, atau dompet dipulihkan.
* **Sebelum transfer:** ketika transfer memerlukan lebih dari 36 UTXO.

<Info>
  Penggabungan berjalan tanpa tanda tangan pengguna. Ring kustom menetapkan izin penggabungannya sendiri.
  Saat menggunakan dompet privat tersemat, penggabungan dilakukan untuk Anda secara internal.
</Info>

<Accordion title="Example for Merge">
  Sebagai contoh, dompet privat menyimpan 1.296 USDC dalam 1.296 UTXO setelah menerima 1.296 transfer privat yang masing-masing bernilai 1 USDC.
  Satu transfer dapat membelanjakan maksimal 36 UTXO, sehingga dompet membelanjakan saldo dalam dua tahap:

  1. Sebanyak 36 transaksi penggabungan berjalan secara paralel dan membuat 36 UTXO yang masing-masing bernilai 36 USDC.
  2. Satu transfer dengan 36 input membelanjakan seluruh saldo 1.296 USDC.

  <Info>
    Lihat kode contoh: [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" />

## Konkurensi UTXO

Pengguna dapat membelanjakan saldo privat segera setelah transaksi berstatus final.

Saldo privat dapat dibelanjakan secara bersamaan ketika terbagi di beberapa UTXO. Setiap UTXO dapat dibelanjakan dalam transaksi terpisah pada saat yang sama. Sebagai contoh, saldo yang terdiri dari tiga UTXO senilai 100 USDC dapat mendanai tiga transfer hingga 100 USDC sekaligus. Dompet memilih UTXO yang akan dibelanjakan.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="Tiga UTXO Alice yang masing-masing bernilai 100 USDC mendanai tiga transfer pada saat yang sama, satu UTXO per transfer." width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

Satu UTXO hanya dapat dibelanjakan satu kali.

Untuk batas throughput protokol, lihat [State Merkle Tree dan Forester](/docs/id/privacy/concepts/architecture#pohon-merkle-status-dan-forester).

## Pelajari Lebih Lanjut

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/id/privacy/concepts/overview">
    Ring, jaminan privasi, dan alur transaksi.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/id/privacy/concepts/architecture">
    Cara dompet, layanan RPC, dan program Solana berinteraksi.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/id/privacy/concepts/encryption">
    Cara aset dienkripsi dan peran keypair terlindung.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/id/privacy/integration/enterprise">
    Pelajari cara mengonfigurasi Ring kustom.
  </Card>
</CardGroup>

## Tidak menemukan yang Anda cari?

<Callout type="info">
  Hubungi kami! [Telegram](https://t.me/tilo_light) | [Email](mailto:sales@helius.xyz) | [Kontak](https://www.helius.dev/contact)
</Callout>


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