本指南详细介绍了Solana的保密转移扩展功能,该功能允许安全且隐私保护的代币转账。文章阐述了原理、实现细节及使用方法,包括如何使用零知识证明和同态加密保护账户余额和转移金额,同时还提供代码示例和最佳实践建议。
Solana 的 Token-2022 计划引入了几个强大的扩展,增强了代币功能,超出了标准的 SPL 代币程序。在这些扩展中,隐私转账(Confidential Transfer)扩展由于能够在 Solana 上实现隐私保护的代币转账而脱颖而出。本指南探讨了该扩展的工作原理、使其成为可能的组件以及进行私密代币操作的工作流。
在本指南中,我们将:
隐私转账扩展使得在 Solana 上进行隐藏余额和金额的代币转账成为可能。通过使用同态加密(homomorphic encryption)和零知识证明(zero-knowledge proofs)等密码学技术,该扩展允许用户:
该扩展结合了区块链的透明性和安全性,以及用户对于传统金融系统的隐私期望。需要注意的是,隐私余额和金额并不意味着完全匿名。两个参与方之间的交易仍然在链上公开可见,只有金额是加密的。
与所有代币扩展一样,启用隐私转账扩展的铸币/代币账户保留所有原始功能。用户可以持有公开可见的代币余额,并公开转移代币。该系统中的隐私保护来自几个关键机制:
在隐私代币的核心是加密和数学证明的强大结合。该扩展使用“同态加密”来储存余额,而不是可见数字——这是一种特殊类型的加密,允许对加密值直接执行数学操作。当你发送代币时,程序不会看到“从 Alice 减去 10,增加到 Bob”。相反,它看到的是“从 Alice 的加密余额中减去这个加密值,将这个加密值加到 Bob 的加密余额上。”加密允许区块链在不知晓确切金额的情况下处理交易。
与标准代币(余额以明文保存,例如 u64)不同,隐私余额使用以下方式进行加密:
配置隐私转账代币账户与标准代币账户创建不同,因为它们需要所有者提供的加密密钥。隐私代币账户应仅由代币账户所有者/管理员配置,以避免泄露加密信息。
为了确保一切正常工作而不透露值,系统使用“零知识证明”。这些是数学证明,可以验证“我有足够的代币来进行此转账”或“这些加密数字等于相同的值”等陈述,而不暴露实际数字。在转移或提取代币时,发送方必须提供零知识证明,以:
这些证明在数学上证明了规则正在遵循,而不透露任何实际金额。
隐私转账采用二阶段系统(“待处理”余额和“可用”余额)以防止对抢跑攻击:
这防止其他用户在你进行转账之前立即操控你的余额,从而中断你的交易(因此中断你的 ZK 证明/验证)。
配置了隐私转账扩展的代币铸币可选择性地配置审计员公钥,允许:
这种加密余额和数学证明的结合使得在维护区块链的安全性和完整性的同时实现隐私。在实践中,这通过以下方式实现:
有关协议、加密方法或 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
与标准铸币的主要区别:
具有隐私扩展的代币账户结构要比标准代币账户复杂得多:
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
与标准代币账户的主要区别:
其中最显著的特征是余额的分解为:
在深入探讨账户结构和指令细节之前,我们先来梳理一下代币如何在这个系统中流动的高级流程:
存入
到隐私代币账户的“待处理”余额中。如前所述,隐私代币账户在状态中存储两个不同的加密余额:“待处理”余额和“可用”余额。申请
其待处理余额。提取
到其公共账户,或将其 转移
到其他用户。这些转账使用 ZK 证明进行验证。在这里有许多内容,我们来详细了解整个交易流程。
在使用隐私代币之前,我们必须用隐私代币转账扩展初始化铸币:
初始化隐私铸币: 在与标准铸币初始化的同一交易中包含 ConfidentialTransferInstruction::InitializeMint 指令,配置审计员密钥,设置批准/修改权限,设置是否自动批准代币账户。
接下来,我们必须创建一个代币账户用于隐私转账和准备。
创建代币账户: 执行 TokenInstruction::InitializeAccount 和 TokenInstruction::Reallocate,指定 ExtensionType::ConfidentialTransferAccount。
有关如何初始化带有扩展的代币账户的更多信息,请查看我们的 指南:什么是 Solana SPL 代币扩展及如何开始?
配置代币账户: 执行一个交易来配置账户以供使用 ConfidentialTransferInstruction::ConfigureAccount
铸币: 首先,你需要通过调用 TokenInstruction::MintTo 将代币铸造到你的代币账户。
有关铸造同质代币的更多信息,请查看我们的 指南:如何在 Solana 上创建一个同质 SPL 代币?
存入: ConfidentialTransferInstruction::Deposit 指令将代币从用户的公共代币账户余额迁移到其隐私待处理余额。此指令:
申请待处理余额: 通过执行 ConfidentialTransferInstruction::ApplyPendingBalance 指令,将代币从待处理余额转移到可用余额。
在下面的示例中,账户显示了一些“加密余额”:
要向另一个隐私账户发送代币,你的钱包或应用程序需要生成零知识证明,以验证交易的有效性而不透露实际金额。这需要几个步骤:
生成所需的零知识证明: 你需要在链外创建三个特定的证明,并在链上存储并验证每个证明:
执行转移: 通过将所有三个证明账户传入 ConfidentialTransferInstruction::Transfer 指令中,执行实际的转账。该指令:
在下面的示例中,你将在 Solana 浏览器上看到转账,但没有可见的转账金额!
清理上下文状态: 最后,我们可以调用 ProofInstruction::CloseContextState 来清理每个 ZK 证明账户,以关闭存储 ZK 证明的账户并收回租金。
交易大小限制
在撰写本文时,Solana 对交易大小有严格的 1,232 字节限制(来源:github.com/solana-labs)。由于某些包含证明数据的指令的参数大小,这些指令通常需要在多个顺序交易中处理。这可以通过按顺序发送多个交易或利用 Jito Bundles 来实现。
查看我们的 指南:如何使用 Solana 查找表 以获取有关如何评估/比较原始交易数据字节大小的示例。
要将隐私代币转换回公共代币,你必须首先确保余额在“可用”余额中,然后创建具有必要证明的提取交易:
申请待处理余额(如有必要): 通过执行 ConfidentialTransferInstruction::ApplyPendingBalance 指令,将代币从待处理余额转移到可用余额。
生成所需的零知识证明: 你需要在链外创建两个特定的证明,并在链上存储并验证每个证明(与转账过程类似,但由于提取结果为公共余额,我们不需要验证加密的转账金额):
执行提取: 通过将两个证明账户传入 ConfidentialTransferInstruction::Withdraw 指令中执行提取。该指令:
清理上下文状态: 最后,我们可以调用 ProofInstruction::CloseContextState 来清理每个 ZK 证明账户,以关闭存储 ZK 证明的账户并收回租金。
隐私转账扩展在 Solana 代币的可配置隐私上标志着重大的进展。通过将零知识证明与同态加密结合,它在快速性、安全性、成本与金融交易预期隐私之间提供了令人信服的平衡。
无论你是开发一个以隐私为中心的应用程序,还是只是想了解 Solana 如何扩展其代币能力,隐私转账扩展都为构建下一代金融应用程序提供了强大的工具。
注册一个 免费的 QuickNode 账户,今天就开始尝试隐私代币扩展。如果你是希望使用隐私代币的企业,请 联系我们的团队 讨论你的具体要求。
以下是一些示例项目以帮助你入门:
如果你有任何问题或想法要分享,可以在 Discord 或 Twitter 上与我们联系!
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!