跳转到内容

加密待处理交易

加密待处理交易允许你提交一笔其 Move 负载(入口函数、参数及相关可执行数据)在 交易处于待处理状态时被加密 的交易——例如当它停留在内存池中并在节点之间传播时.验证者只有在区块确认后准备执行时才会解密负载.与完全明文的负载相比,这减少了观察者能从公开的待处理交易流中获取的信息.

此功能已在 开发网(devnet)、测试网(testnet) 和 主网(mainnet) 上线.你使用的全节点必须在启用加密提交时通过账本暴露 encryption_key.在没有该密钥的网络或节点上,客户端无法构建加密交易.

加密保护的是在传输过程中以及在待处理阶段静止存储的 负载字节,但交易仍然是一个对链发出的已签名请求.根据配置和负载类型,客户端可能仍可看到诸如发送方、gas 参数、过期时间、签名等元数据,以及——当协议要求时——从负载派生的元数据(例如某些多签或赞助流程中的 声明的入口函数).请将”加密待处理”理解为 负载隐私,而非整笔交易的匿名性.精确的安全模型请参见 AIP-144:加密内存池,底层密码学细节参见 eprint 2025/2032.在协议层面,该功能称为 加密内存池(AIP-144);两个名称指代同一特性.

加密交易比明文交易更贵.额外成本用于补偿验证者的解密开销,分为两部分:

  • 更高的最低 gas 单价. 加密交易需要支付 每 gas 单位至少 200 Octas 的最低 gas 单价(为网络基础最低值的两倍).SDK 在构建时强制执行该下限;低于该价格的加密提交将被服务器拒绝.
  • 固定解密费用. 每笔加密交易在其负载本身消耗的 gas 之外,还会额外收取 375 gas 单位.如果你自行设置 maxGasAmount,请为这部分费用留出余量;否则交易会在验证时被拒绝,或在执行时耗尽 gas.

粗略估算:对于不涉及存储费用的交易,若其明文版本消耗 G gas 单位,则加密版本的费用约为 (G + 375) × max(gas_unit_price, 200) Octas.例如,一笔消耗 150 gas 单位的转账,以明文形式按每 gas 单位 100 Octas 计费为 15,000 Octas;加密后约为 (150 + 375) × 200 = 105,000 Octas(0.00105 APT).交易越小,固定解密费用的影响越大.

这两个数值都是链上 gas 表(0x1::gas_schedule::GasScheduleV2)中由治理控制的参数:txn.encrypted_txn_min_price_per_gas_unit 和 txn.encrypted_txn_decryption.base.后者以内部 gas 单位表示,除以 txn.gas_unit_scaling_factor 即得到 gas 单位.

Keyless、联邦 Keyless 和 账户抽象 账户无法签署加密交易.该规则在客户端(支持的地方)和服务端均会强制执行.

你可以将加密负载与 无序交易 结合使用,使并行提交者在加密可执行内容的同时使用重放保护 nonce.具体构建选项请参见下方的 TypeScript SDK 页面.

加密待处理交易 保护的是 待处理交易 通往执行途中的交易负载.它与 机密资产 交易无关——后者允许余额和金额在 交易确认后 仍保持隐私.

  • TypeScript SDK —— 使用 options.encrypted 构建(senderAuthenticationKey 为可选项),提交加密构建.
  • 其他 SDK —— 不同版本的支持情况和 API 名称有所不同;请查阅相应 SDK 的更新日志和示例,寻找加密或批量加密交易 API.