区块链中的可编程隐私:链下计算与链上验证
公共区块链以牺牲隐私为代价提供了透明度和完整性——每笔交易和合约状态都对所有参与者公开。这种开放性带来了诸如 MEV (矿工可提取价值) 攻击、复制交易以及敏感商业逻辑泄露等问题。可编程隐私旨在通过允许在不泄露数据本身的情况下对私有数据进行计算来解决这些问题。两种新兴的密码学范式正在使这成为可能:全同态加密虚拟机 (FHE-VM) 和零知识 (ZK) 协处理器。这些方法实现了链下或加密计算与链上验证,在保留信任的同时保护了机密性。在本报告中,我们将深入探讨 FHE-VM 和 ZK 协处理器的架构,比较它们的优缺点,并探索它们在金融、身份、医疗、数据市场和去中心化机器学习等领域的用例。
全同态加密虚拟机 (FHE-VM)
全同态加密 (FHE) 允许在不解密数据的情况下对加密数据进行任意计算。FHE 虚拟机将此功能集成到区块链智能合约中,实现了加密的合约状态和逻辑。在一个支持 FHE 的区块链(对于 EVM 兼容的设计,通常称为 fhEVM)中,所有输入、合约存储和输出在整个执行过程中都保持加密状态。这意味着验证者可以在不了解任何敏感值的情况下处理交易和更新状态,从而实现具有数据机密性的链上执行。
FHE-VM 的架构与设计
一个典型的 FHE-VM 扩展了标准的智能合约运行时(如以太坊虚拟机),增加了对加密数据类型和操作的原生支持。例如,Zama 的 FHEVM 引入了加密整数(euint8、euint32 等)、加密布尔值(ebool),甚至加密数组作为一等类型。像 Solidity 这样的智能合约语言通过库或新的操作码进行了增强,使开发者可以直接对密文执行算术(add、mul 等)、逻辑和比较操作。在底层,这些操作调用 FHE 原语(例如,使用 TFHE 库)来操作加密位并产生加密结果。
加密状态存储也得到支持,以便合约变量在区块链状态中保持加密。执行流程通常如下:
- 客户端加密: 用户在发送交易前,使用公共 FHE 密钥在本地加密其输入。加密密钥是公开的(用于加密和评估),而解密密钥则保持私密。在某些设计中,每个用户管理自己的密钥;在其他设计中,使用单个全局 FHE 密钥(下文将讨论)。
- 链上同态计算: 矿工/验证者使 用加密的操作码执行合约。他们对密文执行相同的确定性同态操作,因此可以在加密的新状态上达成共识。关键是,验证者永远看不到明文数据——他们只看到“乱码”的密文,但仍然可以一致地处理它。
- 解密(可选): 如果需要公开或在链下使用某个结果,拥有私钥的授权方可以解密输出的密文。否则,结果将保持加密状态,并可用作后续交易的输入(允许对持久的加密状态进行连续计算)。
一个主要的设计考虑是密钥管理。一种方法是每个用户一个密钥,即每个用户持有自己的私钥,只有他们才能解密与他们相关的输出。这最大限度地保护了隐私(其他任何人都无法解密你的数据),但同态操作无法混合使用不同密钥加密的数据,除非使用复杂的多密钥协议。另一种方法,被 Zama 的 FHEVM 采用,是全局 FHE 密钥:一个单一的公钥加密所有合约数据,而一组分布式的验证者持有门限解密密钥的份额。公共加密和评估密钥在链上发布,因此任何人都可以向网络加密数据;私钥被分割给验证者,他们可以在门限方案下集体解密(如果需要)。为了防止验证者串通损害隐私,Zama 采用了一种门限 FHE 协议(基于他们的 Noah’s Ark 研究),并使用“噪声泛洪”来确保部分解密的安全性。只有当足够数量的验证者合作时,才能恢复明文,例如响应一个读取请求。然而,在正常操作中,没有任何单个节点能看到明文——数据在链上始终保持加密。
访问控制是另一个关键组成部分。FHE-VM 实现包括细粒度的控制,以管理谁(如果有的话)可以触发解密或访问某些加密字段。例如,Cypher 的 fhEV M支持对密文的访问控制列表, 允许开发者指定哪些地址或合约可以与某些数据交互或重新加密。一些框架支持重加密:即在不暴露明文的情况下,将一个加密值从一个用户的密钥转移到另一个用户的密钥。这对于数据市场等场景非常有用,数据所有者可以用自己的密钥加密数据集,在购买后,将其重加密为买家的密钥——所有操作都在链上完成,无需公开解密。
确保正确性和隐私性
有人可能会问:如果所有数据都是加密的,我们如何强制执行合约逻辑的正确性?如果链无法“看到”值,它如何防止无效操作?FHE 本身不提供正确性证明——验证者可以执行同态步骤,但他们无法在不解密的情况下判断用户的加密输入是否有效,或者是否应该执行某个条件分支。零知识证明 (ZKPs) 可以补充 FHE 来解决这个问题。在 FHE-VM 中,通常用户在需要时必须提供一个 ZK 证明来证实某些明文条件。例如,Zama 的设计在每个加密输入中都附带一个明文知识的零知识证明 (ZKPoK)。这证明了用户知道其密文对应的明文,并且该明文符合预期标准,而无需透露明文本身。这种**“认证密文”**可以防止恶意用户提交格式错误的加密或超出范围的值。同样,对于需要决策的操作(例如,确保账户余额 ≥ 提款金额),用户可以在执行加密操作之前提供一个 ZK 证明,证明该条件在明文上成立。这样,链既不解密也不查看值,但它能确信加密交易遵循了规则。
FHE Rollup 中的另一种方法是使用 ZKPs 进行链下验证