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

# Trạng thái riêng tư và UTXO

> Tìm hiểu cách UTXO lưu trữ token và trạng thái riêng tư.

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

Số dư riêng tư được lưu trữ trong các UTXO (đầu ra giao dịch chưa được chi tiêu).
Có thể xem UTXO như các tài khoản token SPL riêng tư, với hai điểm khác biệt cốt lõi:

1. UTXO không phải là tài khoản Solana nên không cần được miễn tiền thuê.
2. Số dư của UTXO được mã hóa trên chuỗi.

Bố cục dữ liệu UTXO tương tự như tài khoản token SPL:

* **Chủ sở hữu** – cặp khóa Solana, PDA hoặc khóa P-256.
* **Tài sản** – mint (SOL, SPL hoặc Token-2022).
* **Số lượng** – số đơn vị của `asset`, tính theo đơn vị nhỏ nhất.
* **Dữ liệu** – UTXO có thể lưu trữ dữ liệu tùy ý, chẳng hạn như chủ sở hữu của các token ký quỹ.
* **Dữ liệu chương trình và chính sách** – cấu hình tuân thủ Ring không bắt buộc.

<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="Một tài khoản token Solana riêng tư. Chương trình Quyền riêng tư Solana sở hữu một Tài khoản Token Riêng tư, được mở rộng thành các trường UTXO: chủ sở hữu, tài sản, số lượng, dữ liệu, dữ liệu chính sách và ID chương trình chính sách." width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    Bản ghi đầy đủ được lưu trữ cho mỗi Tài khoản Token Solana Riêng tư là một UTXO phẳng:

    ```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>
  Xem mã nguồn: [Đặc tả](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="Tài khoản 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" />

## Số dư riêng tư

Số dư riêng tư là tổng của tất cả UTXO thuộc một tài sản do ví riêng tư sở hữu.
Ví hiển thị một số dư, bất kể số dư riêng tư
bao gồm một hay nhiều UTXO.
Một giao dịch chuyển riêng tư có thể chi tiêu nhiều UTXO cùng lúc.

<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="Một Ví Riêng tư được nối bằng các đường nét đứt đến nhiều UTXO, mỗi UTXO nắm giữ một lượng của một tài sản. Số dư ví là tổng của các UTXO." width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

## Chuyển riêng tư

Giao dịch chuyển riêng tư bằng UTXO hoạt động khác với giao dịch chuyển công khai bằng tài khoản token SPL:

* Giao dịch chuyển từ tài khoản token SPL cập nhật `amount`.
* Giao dịch chuyển riêng tư bằng UTXO không cập nhật `amount` của UTXO.
  Thay vào đó, giao dịch chuyển riêng tư chi tiêu các UTXO hiện có
  và tạo UTXO mới cho người nhận cũng như cho số dư còn lại của người gửi.

Tuy vậy, đối với người dùng, giao dịch chuyển công khai bằng tài khoản token Solana
và giao dịch chuyển riêng tư bằng UTXO mang lại trải nghiệm tương tự nhau.

Ví dụ: Alice có 50 USDC và gửi cho Bob 35 USDC.

* Với tài khoản token SPL, `amount` của Alice giảm từ 50 xuống 15, còn của Bob tăng thêm 35.
* Với UTXO, Alice nắm giữ một UTXO có 50 USDC. Giao dịch chi tiêu UTXO hiện có và tạo hai UTXO mới: một UTXO có 35 USDC cho Bob và một UTXO có 15 USDC cho 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="Chi tiêu một 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="Chi tiêu nhiều UTXO" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
  </Tab>
</Tabs>

| | Tài khoản token Solana | Tài khoản token Solana riêng tư (UTXO) |
| - | - | - |
| Số dư | `amount` trong tài khoản | Tổng của tất cả UTXO chưa được chi tiêu, mỗi UTXO chứa một lượng cố định của một tài sản |
| Chi tiêu | Cập nhật trường `amount` | Vô hiệu hóa các UTXO đã chi tiêu và tạo một UTXO mới |
| Khả năng hiển thị | Công khai trên chuỗi | Được mã hóa trên chuỗi |

### Chọn UTXO

Đối với giao dịch chuyển riêng tư, SDK chọn các UTXO chưa được chi tiêu có tổng giá trị đủ để chi trả số tiền bạn muốn chuyển.

Thuật toán chọn UTXO chi tiêu ít UTXO nhất có thể cho mỗi giao dịch chuyển:

1. SDK lọc các UTXO của bạn theo tài sản được gửi và sắp xếp chúng theo số lượng.
2. SDK chọn số lượng UTXO cần thiết để chi trả số tiền chuyển.
   SDK chọn các UTXO lớn nhất trước cho đến khi đủ số tiền chuyển.

Ví dụ: Alice gửi cho Bob 80 USDC. Ba UTXO lớn nhất của cô ấy đủ để chi trả giao dịch chuyển:

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="Alice gửi 80 USDC. Các UTXO của cô ấy được sắp xếp từ lớn nhất: 40, 25, 20, 10 và 5 USDC. SDK chọn 40, 25 và 20 USDC, đủ để chi trả 80 USDC, đồng thời không chọn 10 và 5 USDC." width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

Ít UTXO hơn giúp giao dịch có kích thước nhỏ.
Mỗi UTXO được chi tiêu làm tăng thêm 66 byte cho một tài khoản nullifier, tài khoản này đánh dấu UTXO là đã được chi tiêu.
Tài khoản này ngăn 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.">bị chi tiêu lại</Tooltip>.

Ví dụ về các giao dịch chuyển riêng tư không có dữ liệu bổ sung hoặc chỉ thị khác:

| Số UTXO được chi tiêu | Kích thước giao dịch | Tài khoản |
| - | - | - |
| 2 | 927 byte | 6 |
| 5 | 1.125 byte | 9 |
| 36 | 3.055 byte | 40 |

### Biến thể giao dịch

Mỗi giao dịch chuyển riêng tư sử dụng một biến thể giao dịch: một số lượng vị trí cố định dành cho các UTXO sẽ được chi tiêu và các UTXO mới sẽ được tạo.

Các biến thể hỗ trợ từ 1 đến 36 UTXO được chi tiêu và mỗi biến thể có mạch ZK riêng.
Mạch này chứng minh rằng các UTXO được chi tiêu là hợp lệ và các UTXO mới chứa cùng tổng số lượng.
Nếu giao dịch chuyển cần nhiều hơn 36 UTXO, hãy [hợp nhất chúng trước](#hợp-nhất-utxo).

SDK chọn một biến thể phù hợp với giao dịch chuyển và điền các vị trí không dùng bằng UTXO giả.
UTXO giả không chứa giá trị và trông giống UTXO thật trên chuỗi.

<Tabs>
  <Tab title="1 spent, 2 new">
    Alice gửi cho Bob 30 USDC. UTXO lớn nhất của cô ấy đủ để chi trả giao dịch chuyển.

    <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 40 USDC của Alice được chi tiêu, còn các UTXO 25, 20, 10 và 5 USDC của cô ấy vẫn chưa được chi tiêu. Giao dịch tạo 30 USDC cho Bob và 10 USDC cho Alice." width="520" height="286" data-path="images/privacy/utxo-variant-1-2.svg" />
  </Tab>

  <Tab title="2 spent, 2 new">
    Alice gửi cho Bob 60 USDC. Hai UTXO lớn nhất của cô ấy đủ để chi trả giao dịch chuyển.

    <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="Các UTXO 40 và 25 USDC của Alice được chi tiêu, còn các UTXO 20, 10 và 5 USDC của cô ấy vẫn chưa được chi tiêu. Giao dịch tạo 60 USDC cho Bob và 5 USDC cho Alice." width="520" height="286" data-path="images/privacy/utxo-variant-2-2.svg" />
  </Tab>

  <Tab title="3 spent, 3 new">
    Alice gửi cho Bob 80 USDC. Ba UTXO lớn nhất của cô ấy đủ để chi trả giao dịch chuyển. SDK điền vị trí không dùng bằng một UTXO giả.

    <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="Các UTXO 40, 25 và 20 USDC của Alice được chi tiêu, còn các UTXO 10 và 5 USDC của cô ấy vẫn chưa được chi tiêu. Giao dịch tạo 80 USDC cho Bob, 5 USDC cho Alice và một UTXO giả có 0 USDC trong vị trí không dùng." width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    Alice gửi cho Bob 95 USDC. Bốn UTXO lớn nhất của cô ấy đủ để chi trả giao dịch chuyển. SDK điền hai vị trí không dùng bằng các UTXO giả.

    <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="Các UTXO 40, 25, 20 và 10 USDC của Alice được chi tiêu, còn UTXO 5 USDC của cô ấy vẫn chưa được chi tiêu. Giao dịch tạo 95 USDC cho Bob và hai UTXO giả có 0 USDC trong các vị trí không dùng." width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | Số UTXO được chi tiêu | UTXO mới |
  | - | - |
  | 1 | 1, 2 hoặc 8 |
  | 2 | 2 hoặc 3 |
  | 3 | 3 |
  | 4 | 3 hoặc 4 |
  | 5 | 3 hoặc 4 |
  | 36 | 2 |

  <Info>
    Xem mã nguồn: [Đặc tả](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [Các biến thể được hỗ trợ](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

## Hợp nhất UTXO

Việc nhận nhiều giao dịch chuyển mà không chi tiêu có thể phân mảnh số dư riêng tư thành nhiều UTXO.

Nếu một giao dịch chuyển cần nhiều hơn 36 UTXO, hãy hợp nhất chúng trước để người dùng có thể chi tiêu toàn bộ số dư trong một giao dịch chuyển.
Hầu hết người dùng sẽ hiếm khi gặp số dư bị phân mảnh vì một giao dịch chuyển có thể chi tiêu tối đa 36 UTXO.

* Một lần hợp nhất kết hợp các UTXO có cùng chủ sở hữu và tài sản thành một UTXO có cùng tổng giá trị.
* Một lần hợp nhất không thể chi tiêu tiền hoặc thay đổi chủ sở hữu.
* Quá trình hợp nhất có thể diễn ra ngầm mà không ảnh hưởng đến trải nghiệm của người dùng cuối.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="Một lần hợp nhất chi tiêu năm UTXO, mỗi UTXO có 1 USDC, của Alice và tạo một UTXO mới có 5 USDC cho Alice." width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

Số lần hợp nhất cần thiết để chi tiêu toàn bộ số dư trong một giao dịch chuyển phụ thuộc vào số lượng UTXO đang nắm giữ số dư đó:

| Số UTXO trong số dư | Số lần hợp nhất trước giao dịch chuyển | Giao dịch chuyển |
| - | - | - |
| 1 đến 36 | Không có | Một giao dịch chuyển chi tiêu mọi UTXO |
| 37 | 1 lần hợp nhất 2 UTXO | Một giao dịch chuyển với 36 UTXO |
| 100 | 2 lần hợp nhất, mỗi lần 36 UTXO, chạy song song | Một giao dịch chuyển với 30 UTXO |
| 1.296 | 36 lần hợp nhất, mỗi lần 36 UTXO, chạy song song | Một giao dịch chuyển với 36 UTXO |

Mỗi lần hợp nhất là một giao dịch Solana có bằng chứng ZK và chuyển tối đa 36 UTXO thành một UTXO.
Vì kết quả hợp nhất mang tính xác định, các bằng chứng hợp nhất và bằng chứng chuyển được tạo song song.

### Ví dụ về cách sử dụng chỉ thị hợp nhất

Ứng dụng của bạn có thể hợp nhất tại hai thời điểm:

* **Khi đồng bộ hóa số dư riêng tư:** khi mở khóa ví, mở ví riêng tư, tiếp tục ứng dụng, kết nối lại mạng, có khoảng trống trong luồng hoặc khôi phục ví.
* **Trước một giao dịch chuyển:** khi giao dịch chuyển cần nhiều hơn 36 UTXO.

<Info>
  Các lần hợp nhất chạy mà không cần chữ ký của người dùng. Ring tùy chỉnh thiết lập quyền hợp nhất riêng.
  Khi sử dụng ví riêng tư nhúng, quá trình hợp nhất được thực hiện ngầm cho bạn.
</Info>

<Accordion title="Example for Merge">
  Ví dụ: một ví riêng tư nắm giữ 1.296 USDC trong 1.296 UTXO sau khi nhận 1.296 giao dịch chuyển riêng tư, mỗi giao dịch có 1 USDC.
  Một giao dịch chuyển chi tiêu tối đa 36 UTXO, vì vậy ví chi tiêu số dư theo hai giai đoạn:

  1. 36 giao dịch hợp nhất chạy song song và tạo 36 UTXO, mỗi UTXO có 36 USDC.
  2. Một giao dịch chuyển có 36 đầu vào chi tiêu toàn bộ số dư 1.296 USDC.

  <Info>
    Xem mã ví dụ: [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" />

## Khả năng xử lý đồng thời của UTXO

Người dùng có thể chi tiêu số dư riêng tư ngay khi giao dịch được hoàn tất.

Một số dư riêng tư có thể được chi tiêu đồng thời khi được chia thành nhiều UTXO. Mỗi UTXO có thể được chi tiêu trong một giao dịch riêng biệt cùng lúc. Ví dụ: số dư gồm ba UTXO, mỗi UTXO có 100 USDC, có thể cấp tiền cho ba giao dịch chuyển tối đa 100 USDC cùng lúc. Ví chọn các UTXO cần chi tiêu.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="Ba UTXO của Alice, mỗi UTXO có 100 USDC, cấp tiền cho ba giao dịch chuyển cùng lúc, mỗi giao dịch chuyển sử dụng một UTXO." width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

Một UTXO chỉ có thể được chi tiêu một lần.

Để biết các giới hạn thông lượng của giao thức, hãy xem [Cây Merkle trạng thái và Forester](/docs/vi/privacy/concepts/architecture#cây-merkle-trạng-thái-và-forester).

## Tìm hiểu thêm

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/vi/privacy/concepts/overview">
    Ring, các bảo đảm về quyền riêng tư và luồng giao dịch.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/vi/privacy/concepts/architecture">
    Cách ví, dịch vụ RPC và chương trình Solana tương tác với nhau.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/vi/privacy/concepts/encryption">
    Cách tài sản được mã hóa và vai trò của cặp khóa được che chắn.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/vi/privacy/integration/enterprise">
    Tìm hiểu cách cấu hình Ring tùy chỉnh.
  </Card>
</CardGroup>

## Không tìm thấy nội dung bạn đang tìm kiếm?

<Callout type="info">
  Hãy liên hệ với chúng tôi! [Telegram](https://t.me/tilo_light) | [Email](mailto:sales@helius.xyz) | [Liên hệ](https://www.helius.dev/contact)
</Callout>


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