Skip to main content
私有余额存储在 UTXO(未花费交易输出)中。 你可以将 UTXO 理解为私有 SPL 代币账户,但它们有两个核心区别:
  1. UTXO 不是 Solana 账户,因此无需免租。
  2. 它的余额在链上加密。
UTXO 的数据布局与 SPL 代币账户类似:
  • 所有者 – Solana 密钥对、PDA 或 P-256 密钥。
  • 资产 – 铸币(SOL、SPL 或 Token-2022)。
  • 数量 – asset 的单位数量,以其最小单位计。
  • 数据 – UTXO 可以存储任意数据,例如托管代币的所有者。
  • 程序和策略数据 – 可选的已配置 Ring 合规信息。
一个私有 Solana 代币账户。Solana 隐私程序拥有一个私有代币账户,该账户展开后显示其 UTXO 字段:所有者、资产、数量、数据、策略数据和策略程序 ID。
Solana 代币账户。

私有余额

私有余额是私有钱包所拥有的某项资产的所有 UTXO 之和。 无论私有余额由一个还是多个 UTXO 组成, 钱包都只显示一个余额。 一次私有转账可以同时花费多个 UTXO。 一个私有钱包通过虚线连接到多个 UTXO,每个 UTXO 都持有某项资产的一定数量。钱包余额是这些 UTXO 的总和。

私有转账

使用 UTXO 的私有转账与使用 SPL 代币账户的公开转账工作方式不同:
  • 从 SPL 代币账户转账时,会更新 amount。
  • 使用 UTXO 进行私有转账时,不会更新 UTXO 的 amount。 相反,私有转账会花费现有 UTXO, 并为接收方以及发送方的剩余余额创建新的 UTXO。
不过对用户而言,使用 Solana 代币账户进行的公开转账 与使用 UTXO 进行的私有转账体验相似。 例如,Alice 有 50 USDC,并向 Bob 发送 35 USDC。
  • 使用 SPL 代币账户时,Alice 的 amount 从 50 减少到 15,而 Bob 的增加 35。
  • 使用 UTXO 时,Alice 持有一个包含 50 USDC 的 UTXO。交易会花费现有 UTXO,并创建两个新 UTXO:一个为 Bob 持有 35 USDC,另一个为 Alice 持有 15 USDC。
花费一个 UTXO

UTXO 选择

对于私有转账,SDK 会选择足以覆盖你要转账金额的未花费 UTXO。 UTXO 选择算法会在每次转账中尽可能少地花费 UTXO:
  1. SDK 按待发送的资产筛选你的 UTXO,并按数量对其排序。
  2. SDK 会选择足够覆盖转账金额的 UTXO。 它会优先选择最大的 UTXO,直到覆盖转账金额。
例如,Alice 向 Bob 发送 80 USDC。她最大的三个 UTXO 足以覆盖这笔转账: Alice 发送 80 USDC。她的 UTXO 按从大到小排序:40、25、20、10 和 5 USDC。SDK 选择 40、25 和 20 USDC,足以覆盖 80 USDC,并保留 10 和 5 USDC 不选。 使用较少的 UTXO 可以减小交易大小。 每个被花费的 UTXO 都会增加 66 字节,用于创建一个无效化标记账户,以将该 UTXO 标记为已花费。 该账户可防止 UTXO 。 以下是不含额外数据或其他指令的私有转账示例:

交易变体

每次私有转账都会使用一种交易变体,其中包含固定数量的槽位,分别用于待花费的 UTXO 和待创建的新 UTXO。 各变体支持花费 1 至 36 个 UTXO,并且每种变体都有自己的 ZK 电路。 该电路会证明被花费的 UTXO 有效,并且新 UTXO 持有的总金额相同。 如果一次转账需要超过 36 个 UTXO,请先合并它们。 SDK 会选择适合该转账的变体,并使用虚拟 UTXO 填充未使用的槽位。 虚拟 UTXO 不包含任何价值,在链上看起来与真实 UTXO 相同。
Alice 向 Bob 发送 30 USDC。她最大的 UTXO 足以覆盖这笔转账。Alice 的 40 USDC UTXO 被花费,而她的 25、20、10 和 5 USDC UTXO 保持未花费状态。该交易为 Bob 创建 30 USDC,并为 Alice 创建 10 USDC。
查看源代码:规范 · 支持的变体

合并 UTXO

在只接收大量转账而不花费的情况下,私有余额可能会分散到许多 UTXO 中。 如果一次转账需要超过 36 个 UTXO,请先合并它们,以便用户可以在一次转账中花费全部余额。 由于一次转账最多可以花费 36 个 UTXO,因此大多数用户很少会遇到余额碎片化的情况。
  • 合并会将所有者和资产相同的 UTXO 合并成一个总价值相同的 UTXO。
  • 合并操作不能花费资金或更改所有者。
  • 合并可以在底层自动完成,不会影响最终用户的体验。
一次合并会花费 Alice 的五个 UTXO,每个包含 1 USDC,并为 Alice 创建一个包含 5 USDC 的新 UTXO。 要通过一次转账花费全部余额,所需的合并次数取决于该余额包含多少个 UTXO: 每次合并都是一笔带有 ZK 证明的 Solana 交易,最多可将 36 个 UTXO 合并为一个。 由于合并结果是确定性的,因此可以并行生成合并证明和转账证明。

合并指令用法示例

你的应用可以在两个时机执行合并:
  • **同步私有余额时:**解锁钱包、打开私有钱包、恢复应用、重新连接网络、出现流缺口或恢复钱包时。
  • **转账前:**转账需要超过 36 个 UTXO 时。
合并操作无需用户签名即可运行。自定义 Ring 可以设置自己的合并权限。 使用嵌入式私有钱包时,合并操作会在底层自动为你完成。
例如,一个私有钱包在收到 1,296 笔各为 1 USDC 的私有转账后,在 1,296 个 UTXO 中持有 1,296 USDC。 一次转账最多可以花费 36 个 UTXO,因此钱包分两个阶段花费余额:
  1. 并行运行 36 笔合并交易,并创建 36 个各含 36 USDC 的 UTXO。
  2. 一笔包含 36 个输入的转账会花费全部 1,296 USDC 余额。

UTXO 并发

交易最终确认后,用户即可花费私有余额。 当私有余额分散在多个 UTXO 中时,可以并发花费。每个 UTXO 可以同时在不同的交易中花费。例如,由三个各含 100 USDC 的 UTXO 构成的余额,可以同时为三笔最高 100 USDC 的转账提供资金。钱包会选择要花费的 UTXO。 Alice 的三个 UTXO 各含 100 USDC,可同时为三笔转账提供资金,每笔转账使用一个 UTXO。 单个 UTXO 只能花费一次。 有关协议的吞吐量限制,请参阅状态 Merkle 树和 Forester。

了解更多

Overview

Ring、隐私保证和交易流程。

Architecture

钱包、RPC 服务和 Solana 程序如何交互。

Encryption and Privacy Guarantees

资产的加密方式以及隐私密钥对的作用。

Custom Enterprise Rings

了解如何配置自定义 Ring。

没找到您要找的?

联系我们!Telegram | 电子邮件 | 联系