Solana上的隐私转账:开发者指南

本指南详细介绍了Solana的保密转移扩展功能,该功能允许安全且隐私保护的代币转账。文章阐述了原理、实现细节及使用方法,包括如何使用零知识证明和同态加密保护账户余额和转移金额,同时还提供代码示例和最佳实践建议。

概述

Solana 的 Token-2022 计划引入了几个强大的扩展,增强了代币功能,超出了标准的 SPL 代币程序。在这些扩展中,隐私转账(Confidential Transfer)扩展由于能够在 Solana 上实现隐私保护的代币转账而脱颖而出。本指南探讨了该扩展的工作原理、使其成为可能的组件以及进行私密代币操作的工作流。

Solana 上的隐私代币转账 在 YouTube 上观看

你将要做什么

在本指南中,我们将:

  • 解释隐私转账扩展的基本知识以及隐私余额的工作原理。
  • 高级别地看一个示例隐私交易的流程。
  • 逐步讲解促成交易的账户结构。
  • 查看实际需要执行转账的指令。

你将需要什么

什么是隐私转账扩展?

隐私转账扩展使得在 Solana 上进行隐藏余额和金额的代币转账成为可能。通过使用同态加密(homomorphic encryption)和零知识证明(zero-knowledge proofs)等密码学技术,该扩展允许用户:

  • 保持其账户余额的隐秘性
  • 转移代币而不透露金额
  • 维护无法伪造的可验证交易
  • 可选择性地允许第三方审计员查看交易金额和代币账户余额

该扩展结合了区块链的透明性和安全性,以及用户对于传统金融系统的隐私期望。需要注意的是,隐私余额和金额并不意味着完全匿名。两个参与方之间的交易仍然在链上公开可见,只有金额是加密的。

底层机制:隐私保护

与所有代币扩展一样,启用隐私转账扩展的铸币/代币账户保留所有原始功能。用户可以持有公开可见的代币余额,并公开转移代币。该系统中的隐私保护来自几个关键机制:

1. 账户特定加密

在隐私代币的核心是加密和数学证明的强大结合。该扩展使用“同态加密”来储存余额,而不是可见数字——这是一种特殊类型的加密,允许对加密值直接执行数学操作。当你发送代币时,程序不会看到“从 Alice 减去 10,增加到 Bob”。相反,它看到的是“从 Alice 的加密余额中减去这个加密值,将这个加密值加到 Bob 的加密余额上。”加密允许区块链在不知晓确切金额的情况下处理交易。

与标准代币(余额以明文保存,例如 u64)不同,隐私余额使用以下方式进行加密:

  • 同态加密,允许对加密值执行数学操作。这意味着即使是处理交易的验证者也无法看到实际的代币金额。
  • 特定于账户的加密密钥(而不是所有者的密钥)

配置隐私转账代币账户与标准代币账户创建不同,因为它们需要所有者提供的加密密钥。隐私代币账户应仅由代币账户所有者/管理员配置,以避免泄露加密信息。

2. 零知识证明

为了确保一切正常工作而不透露值,系统使用“零知识证明”。这些是数学证明,可以验证“我有足够的代币来进行此转账”或“这些加密数字等于相同的值”等陈述,而不暴露实际数字。在转移或提取代币时,发送方必须提供零知识证明,以:

  • 验证其拥有足够的资金。
  • 确保交易是一致的(从你的账户中扣除的金额等于添加到接收者的金额)

这些证明在数学上证明了规则正在遵循,而不透露任何实际金额。

3. 待处理/可用余额模型

隐私转账采用二阶段系统(“待处理”余额和“可用”余额)以防止对抢跑攻击:

  • 传入转账进入待处理余额
  • 只有账户所有者可以将代币从待处理转移到可用
  • 外发转账仅从可用余额中扣除

这防止其他用户在你进行转账之前立即操控你的余额,从而中断你的交易(因此中断你的 ZK 证明/验证)。

4. 可选审计员监督

配置了隐私转账扩展的代币铸币可选择性地配置审计员公钥,允许:

  • 指定的方对余额和转账金额进行解密
  • 提供合规机制而不危害一般用户隐私

隐私的实际应用

这种加密余额和数学证明的结合使得在维护区块链的安全性和完整性的同时实现隐私。在实践中,这通过以下方式实现:

  • 先进的账户结构,存储加密公钥、“可用”和“待处理”的隐私余额,以及验证证明的其他待处理余额变更计数器。
  • 一个新的原生程序,即 Solana ZK ElGamal 证明程序(ZkE1Gama1Proof11111111111111111111111111111),用于在链上创建和验证证明。
  • ElGamal 加密的用户账户密钥,帮助用户和审计员揭示加密余额和转账金额。

有关协议、加密方法或 ZK 证明的更多信息,请查看隐私代币扩展协议官方文档:

它是如何工作的:账户状态

隐私代币引入了新的数据结构用于铸币和代币账户。让我们检查这些结构与标准代币的区别。

隐私铸币账户

隐私铸币配置被添加到 Token-2022 铸币账户中,包含:

pub struct ConfidentialTransferMint {
    pub authority: OptionalNonZeroPubkey,
    pub auto_approve_new_accounts: PodBool,
    pub auditor_elgamal_pubkey: OptionalNonZeroElGamalPubkey,
}

来源:github.com/solana-program/token-2022

与标准铸币的主要区别:

  • 专用于管理隐私转账的负责人
  • 新账户的批准设置(自动批准或要求权威批准代币账户参与铸币的隐私转账)
  • 可选的审计员公钥,可以解密交易金额。公钥应为 ElGamal 公钥,允许审计员解密加密金额而不妨碍交易的一般隐私。

隐私代币账户

具有隐私扩展的代币账户结构要比标准代币账户复杂得多:

pub struct ConfidentialTransferAccount {
    pub approved: PodBool,
    pub elgamal_pubkey: PodElGamalPubkey,
    pub pending_balance_lo: EncryptedBalance,
    pub pending_balance_hi: EncryptedBalance,
    pub available_balance: EncryptedBalance,
    pub decryptable_available_balance: DecryptableBalance,
    pub allow_confidential_credits: PodBool,
    pub allow_non_confidential_credits: PodBool,
    pub pending_balance_credit_counter: PodU64,
    pub maximum_pending_balance_credit_counter: PodU64,
    pub expected_pending_balance_credit_counter: PodU64,
    pub actual_pending_balance_credit_counter: PodU64,
}

来源:github.com/solana-program/token-2022

与标准代币账户的主要区别:

  • 使用 ElGamal 公钥进行加密(与所有者的密钥分开)
  • 包含加密余额而非明文金额
  • 将余额分为“待处理”和“可用”部分
  • 包括跟踪和限制待处理操作的信用计数器(在 ZK 证明中用于确保我们可以明确将前后余额与正确的传入转账关联起来)
  • 可以配置接受或拒绝不同类型的转账

其中最显著的特征是余额的分解为:

  1. 待处理余额:新接收的代币最初存储在此处
  2. 可用余额:可以使用或提取的代币

隐私转账流程

在深入探讨账户结构和指令细节之前,我们先来梳理一下代币如何在这个系统中流动的高级流程:

隐私代币流

  • 当用户想要与隐私余额和转账进行交互时,他们必须首先将代币 存入 到隐私代币账户的“待处理”余额中。如前所述,隐私代币账户在状态中存储两个不同的加密余额:“待处理”余额和“可用”余额。
  • 要将“待处理”余额转换为“可用”余额,账户所有者必须 申请 其待处理余额。
  • 用户可以将“可用”余额 提取 到其公共账户,或将其 转移 到其他用户。这些转账使用 ZK 证明进行验证。
  • 铸币可以选择配置一个“审计员”账户,该账户能够解密代币的转账金额。

在这里有许多内容,我们来详细了解整个交易流程。

1. 初始化铸币

在使用隐私代币之前,我们必须用隐私代币转账扩展初始化铸币:

初始化隐私铸币: 在与标准铸币初始化的同一交易中包含 ConfidentialTransferInstruction::InitializeMint 指令,配置审计员密钥,设置批准/修改权限,设置是否自动批准代币账户。

2. 设置代币账户

接下来,我们必须创建一个代币账户用于隐私转账和准备。

创建代币账户: 执行 TokenInstruction::InitializeAccountTokenInstruction::Reallocate,指定 ExtensionType::ConfidentialTransferAccount

有关如何初始化带有扩展的代币账户的更多信息,请查看我们的 指南:什么是 Solana SPL 代币扩展及如何开始?

配置代币账户: 执行一个交易来配置账户以供使用 ConfidentialTransferInstruction::ConfigureAccount

  • 验证特定于此账户的 ElGamal 加密密钥
  • 要求证明加密密钥是有效的
  • 如果自动批准被禁用,则需要铸币权限的批准
  • 用加密零余额初始化隐私余额

2. 将代币导入系统

铸币: 首先,你需要通过调用 TokenInstruction::MintTo 将代币铸造到你的代币账户。

有关铸造同质代币的更多信息,请查看我们的 指南:如何在 Solana 上创建一个同质 SPL 代币?

存入: ConfidentialTransferInstruction::Deposit 指令将代币从用户的公共代币账户余额迁移到其隐私待处理余额。此指令:

  • 使用账户的加密密钥对代币金额进行加密
  • 将加密金额添加到待处理余额
  • 更新待处理余额信用计数器
  • 减少公共代币余额(例如,如果用户 100% 的代币入金,则用户的公共代币余额为 0)

申请待处理余额: 通过执行 ConfidentialTransferInstruction::ApplyPendingBalance 指令,将代币从待处理余额转移到可用余额。

  • 将加密代币从待处理余额转移到可用余额
  • 只能由账户所有者执行
  • 更新以跟踪所申请操作的计数器

在下面的示例中,账户显示了一些“加密余额”:

应用的代币账户浏览器

3. 以隐私方式转移代币

要向另一个隐私账户发送代币,你的钱包或应用程序需要生成零知识证明,以验证交易的有效性而不透露实际金额。这需要几个步骤:

生成所需的零知识证明: 你需要在链外创建三个特定的证明,并在链上存储并验证每个证明:

执行转移: 通过将所有三个证明账户传入 ConfidentialTransferInstruction::Transfer 指令中,执行实际的转账。该指令:

  • 检查所需证明是否已验证(使用上下文状态账户)
  • 从发送者的可用余额中减去加密金额
  • 将加密金额添加到接收者的待处理余额

在下面的示例中,你将在 Solana 浏览器上看到转账,但没有可见的转账金额!

浏览器 - 隐私转账

清理上下文状态: 最后,我们可以调用 ProofInstruction::CloseContextState 来清理每个 ZK 证明账户,以关闭存储 ZK 证明的账户并收回租金。

交易大小限制

在撰写本文时,Solana 对交易大小有严格的 1,232 字节限制(来源:github.com/solana-labs)。由于某些包含证明数据的指令的参数大小,这些指令通常需要在多个顺序交易中处理。这可以通过按顺序发送多个交易或利用 Jito Bundles 来实现。

查看我们的 指南:如何使用 Solana 查找表 以获取有关如何评估/比较原始交易数据字节大小的示例。

4. 提取代币

要将隐私代币转换回公共代币,你必须首先确保余额在“可用”余额中,然后创建具有必要证明的提取交易:

申请待处理余额(如有必要): 通过执行 ConfidentialTransferInstruction::ApplyPendingBalance 指令,将代币从待处理余额转移到可用余额。

生成所需的零知识证明: 你需要在链外创建两个特定的证明,并在链上存储并验证每个证明(与转账过程类似,但由于提取结果为公共余额,我们不需要验证加密的转账金额):

执行提取: 通过将两个证明账户传入 ConfidentialTransferInstruction::Withdraw 指令中执行提取。该指令:

  • 检查所需证明是否被验证(使用上下文状态账户)
  • 从发送者的可用余额中减去加密金额
  • 将明文金额添加到你的公共代币余额

清理上下文状态: 最后,我们可以调用 ProofInstruction::CloseContextState 来清理每个 ZK 证明账户,以关闭存储 ZK 证明的账户并收回租金。

最佳实践和注意事项

  1. 余额管理
    • 定期申请待处理余额,以使资金可供使用
  2. 密钥安全
    • 尽可能仔细地保护你的加密密钥,像保护你的钱包密钥一样
    • 遗失加密密钥意味着永远无法解密隐私余额
  3. 隐私限制
    • 交易元数据(发送者、接收者、时间戳)仍然可见
    • 只有金额是加密和私密的
    • 模式分析可能仍然揭示关于余额或转账金额的见解
  4. 生产审计
    • 确保在生产中使用之前,所有代码经过全面测试和审计

总结

隐私转账扩展在 Solana 代币的可配置隐私上标志着重大的进展。通过将零知识证明与同态加密结合,它在快速性、安全性、成本与金融交易预期隐私之间提供了令人信服的平衡。

无论你是开发一个以隐私为中心的应用程序,还是只是想了解 Solana 如何扩展其代币能力,隐私转账扩展都为构建下一代金融应用程序提供了强大的工具。

准备开始构建了吗?

注册一个 免费的 QuickNode 账户,今天就开始尝试隐私代币扩展。如果你是希望使用隐私代币的企业,请 联系我们的团队 讨论你的具体要求。

以下是一些示例项目以帮助你入门:

如果你有任何问题或想法要分享,可以在 DiscordTwitter 上与我们联系!

附加资源

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。