本文Hash (SHA1):6ec9df3960804ae5e6b0bee29289da35f3abc356

编号: 链源Security Knowledge No.133

零知识证明技术是密码学的一个分支,可以为许多Layer 1区块链项目解决扩容和隐私问题。区块链可以利用零知识证明技术提升交易吞吐量,在验证用户身份的同时保护用户数据隐私,实现复杂的计算,并让企业既可以利用区块链技术又能保护自身知识产权。在上述所有应用场景中,零知识证明都是不可或缺的关键技术。

截至目前,在可编程区块链提供的所有效用中--安全、可预测性、互操作性和自主经济等--最广泛使用的区块链并不提供隐私效用,而这仍然是其被广泛采用的一个关键障碍。所以越来越多的人会更加注重链上的隐私安全,诞生了隐私支付。

基础知识

零知识证明分为两类论证方案:

  1. 交互式论证方案
  2. 非交互式论证方案
  3. 交互式ZKP

交互式零知识证明 (IZKP) 要求证明者和验证者进行来回对话,在对话中证明者对验证者的查询做出响应。这种互动可以亲自进行,也可以通过互联网等网络进行。需要与验证者进行多轮的交互,以便验证者可以询问有关所证明语句之外的附加信息。在每一轮中,证明者需要根据验证者的询问提供一个回答。

IZKP 需要证明者和验证者之间的交互,这可能是低效且耗时的。为了完成证明,证明者必须与验证者来回发送多条消息。这可能会花费大量时间,尤其是在证明很复杂或涉及大量数据的情况下。当速度至关重要时,例如在高频交易或实时决策中,这可能是个问题。

具体实现的方案为zk-starks,STARK 允许区块链将计算转移到某个链下 STARK 证明者,然后使用链上 STARK 验证者验证这些计算的完整性。Layer-2 网络可以通过使用 STARKs 在单个批次中计算大量交易,然后使用单个 STARK 证明来确认交易在链上的有效性,从而实现可扩展性。批次中的所有交易均分担链上操作的成本,为第 2 层网络上的每笔交易提供低 gas 成本。

重要的是,由于验证者使用的随机性是公开可用的,并且可以在不依赖任何外部参数的情况下验证证明,因此 STARK 不需要可信设置仪式。

StarkNet、dydx、Polygon Miden都是采用zk-starks的zk-rollup方案

利用零知识证明(ZKP)实现隐私支付的链上应用方案

非交互式ZKP

非交互式零知识证明 (NIZKP) 不需要证明者和验证者之间的任何交互。非交互式零知识证明是指证明者可以一次性地生成证明,并将它发送给验证者,而不需要进行多轮的交互。

具体实现的方案为zk-snarks,SNARK 更高效、更快速,因为它们可以在几毫秒内得到验证。然而,这种效率是有代价的,因为一些 SNARK 依赖的可信设置仪式,有安全薄弱的环节。这意味着证明中使用的初始参数必须在安全环境中生成,参数的任何泄露都可能导致安全漏洞。

zkSync、zcash所采用的都是zk-snark的zk-rollup方案。

隐私交易概念

理解隐私交易的概念需要考虑交易主体和交易细则两个方面,并区分匿名和隐藏两种类型的隐私。

一笔普通交易包含以下要素:

  • 交易主体:包括交易的发送者(交易者 A)和接收者(交易者 B)。
  • 交易细则:包括交易的金额、子交易次数、交易的哈希等具体细节。

隐私交易可以根据对第三方的信息可见程度分为两类:

  • 匿名交易:在匿名交易中,对于第三方来说,交易的发送者和接收者的地址是不可知的。这意味着在交易过程中,除了参与交易的两个主体之外,其他人无法确定交易的具体参与者。例如,Tornado Cash 就是一种通过混淆交易路径来实现匿名性的隐私协议。
  • 隐藏交易:在隐藏交易中,虽然交易的发送者和接收者的地址是可见的,但是交易的具体细则却是不可知的。这意味着交易的金额、子交易次数、交易的哈希等详细信息对于第三方来说是隐藏的。这种隐私可以通过使用零知识证明等技术来实现。例如,Zcash 就是一种利用 zk-SNARKs 技术实现交易细则隐藏的隐私加密货币。

现有的隐私支付方案

在链上应用于zk的区块链方案可以大致分为几种,一种是作为Layer2解决方案的一种rollup,也就是zk-rollup,对比op-rollup,不需要7天的挑战期,他的数据是更加可信的、更加安全的。但是它是没有隐私的,可以直接在中间层上部署,比如 zkSync、scroll,不需要自己懂 zk,这种方案主要利用zk的证明理论来验证数据正确性,并不注重隐私性的保护。

一种做为单独的链来专门处理需要隐私保护的交易L1,比如Zcash,MantaPay 的隐私资产的平台,和隐私资产交互,就可能需要自己做 ZK 的编程。对于开发者来说非常有意思的一件事情。

最后一种方案,作为Layer2但是可以在链上采用zk-aluvm的验证方式或链下节点来做zk验证的隐私支付方式,结合了L2的优势,也同时引入了隐私支付的功能,目前可能是比较受欢迎的方式,但是实际开发起来,受到技术和政策影响也是最大的方式。

本文将重点讨论基于zkp区块链的隐私支付方案。

zcash

ZCash的交易模型基本上与比特币相同,但是其中的 UTXO被 note所代替,note为ZCash的基本交易单位。也可以理解为交易承诺的明文,我們将以 note=(PK, v, r,rho)来表示 note,PK为公钥(Public Key)、v是金额(Value)、r是序列号(Random Serial Number)。 rho是每一条 note 的唯一标识,当一条 note 被消费了之后,这个值会被放置到 nullifier 表中,代表这条 note 已经被消费了,再次进行消费同一条 note的时候,会触发双花 错误,即交易双花防护机制。

在 ZCash 中,还存在两种表格,分别是:commitment 和 nullifier,因为隐私的需求,note是不能公开的,因此,需要计算对应的commitment来代表这个note,计算方式如下

利用零知识证明(ZKP)实现隐私支付的链上应用方案

利用零知识证明(ZKP)实现隐私支付的链上应用方案

Commitment代表一次金额转入,Nullifier代表一次消费。注意,对于一个Note,Commitment和Nullifier都是唯一的。因为Commitment和Nullifier是Hash的结果,即使这两个数据公开,其他人也无法推断出Commitment和Nullifier之间存在联系。也就是说,提供一个Commitment,能说明进行了一笔转账(具体信息其他人未知)。能提供对应的Nullifier,就能消费。

作为一个隐私转账平台,将所有的Commitment(cm),组成一个Merkle树:

某个用户需要消费某个cm,必须向区块链提供零知识证明:

1/ 他知道一个Note,并能生成一个cm,而且这个cm在以rt为树根的Merkle树上

2/ 用同样的Note信息,能生成一个nullfier,而且这个nullfier之前没有生成过。

以上只是最简单的概括Zcash零知识证明的大体思路,ZCash的设计非常复杂和严谨,有很多细节。

zcash目前的版本经过了Sprout和Sapling两次升级,已经和最初的模式有很大改变,zcash目前的模式有一个非常致命的问题,zcash 仅支持原生代币 ZEC 之间隐私交易,很难支持 ERC20 等代币。用户在使用时,只能在交易所买入 ZEC,提到 Zcash 链上,用 ZEC 交易,达到隐私交易目的。而且zkcash最为最初期的隐私支付开拓者,在协议层面,并没有集成太多复杂的东西,导致功能性单一,并且TPS较低等历史遗留问题。

TornadoCash

TornadoCash主要利用了基于zkp的混币器协议,解决了zcash的单一币种问题,TornadoCash主要依赖于以太坊链上的智能合约,充分扩展了可用性。

Tornado实现路径如下:TornadoCash 使用收据( commitment)来控制访问权限。收据是由 secret和 nullifier一起 Hash 产生,commitment = hash(secret, nullifier),然后用户将需要混币的金额(比如 1 ETH)和 commitment 发送给 TornadoCash合约的 deposit 函数,TornadoCash合约将保存这两个数据,commitment之后会用于提取存入的资金。

每个commitment只能提款一次。使用 Merkle Tree 记录存款信息,将commitment作为 leaf 节点并计算出 Merkle Root 。使用者只需提供 leaf 到 root 中间经过的数据,即可证明该数据是否 Merkle Tree 的 leaves 之一,也间接证明之前有存款资金到 TornadoCash。

在提款时,用户需要利用zk-snark方案来提交一个证明,证明我有secret和 nullifier,TornadoCash智能合约将检查这个证明,然后将存款金额转移到指定的提款地址。而对于外部的观察者来说,无从得知这笔提款来自哪笔存款。另外使用 nullifier 防止 Double Withdrawal 攻击。

Tornado Cash的核心是智能合约,使用户能够在以太坊上进行私秘交易。当用户使用时,合约将自动执行两种支持的操作之一:“存款”或“取款”。这些操作一起允许用户从一个地址存入代币,然后将同样的代币提取到另一个地址。至关重要的是,即使这些存款和取款事件公开发生在以太坊的透明分类账上,存款和取款地址之间的任何公共链接都被切断了。用户可以提取和使用他们的资金,而不必担心将他们的整个财务历史暴露给第三方。

利用零知识证明(ZKP)实现隐私支付的链上应用方案

MantaPay

MantaPay结合了前两个协议的优势,独立开发了一条基于波卡链的ZK L1链, 通过zkSBT 为 web3 带来可编程的身份和凭证,MantaPay成功解决了隐私支付的问题和繁荣的生态问题。

利用零知识证明(ZKP)实现隐私支付的链上应用方案

MantaPay 使用 ZK 技术实现隐私转账。用户使用 Manta Signer,在发起交易时,提交转账请求,并作为证明者(Prover)生成 ZK 证明,节点作为验证者可在不获取任何转账信息的前提下,验证用户交易为真。

Manta 使用 UTXO 方式验证交易。Manta UTXO 实际有“两棵树”,所有 Token 在第一棵树,第二棵树记录用户花费掉的 UTXO。在交易时,交易会附带 ZK 证明,证明该状态在第二棵树中不存在。由于 ZK 证明无法伪造且无法篡改,节点验证该证明的有效性,只要证明有效,则交易有效。

Manta的ZKEvm是一种使用 ZK-SNARK 技术为类似以太坊的交易创建加密执行证明的技术。这些证明可用于通过减少验证交易所需的计算负载或构建高效且可扩展的 ZK-rollup,从而使以太坊区块链更具可扩展性。

目前Manta还并没有更好的支持ZKEvm,可能是开发难度较大,也可能是收到法规影响,但是不得不说是一种非常具有未来性的方案。

ZKP链上方案构想

上文中阐述了几种隐私支付的现有方案,对于未来,更高的TPS、更好的生态支持一定将会成为主流方案。在这个基础上我们提出了一些构想。

ZK-AluVM

AluVM -(算法逻辑单元 VM)是专为确定性便携式计算任务而设计的纯功能 RISC 虚拟机。它由Pandora Core AG的Maxim Orlovsky 博士设计和实施,并由LNP/BP 标准协会维护。

AluVM 是一种纯功能寄存器型、高度确定性且无异常的指令集架构 (ISA) 和虚拟机 (VM),无需随机内存访问,能够执行算术运算,包括椭圆曲线运算。运行虚拟机的环境(主机环境)可以扩展 AluVM ISA,从而能够将数据加载到 VM 寄存器并支持特定于应用程序的指令(如 SIMD)。

ALuVM 的主要用途是用于分布式系统,无论稳健性、独立于平台的确定性是否比计算速度更重要。AluVM 应用的主要领域(使用适当的 ISA 扩展)是区块链环境、共识关键计算、边缘计算、多方计算(包括确定性机器学习)、客户端验证、沙盒 Internet2 计算和遗传算法。

在区块链中使用使用ZK-AluVM,处理交易,更新状态树的同时生成证明。实现方案可以Mina为基础,进行更深入的研究。

利用零知识证明(ZKP)实现隐私支付的链上应用方案

基于ZK-AluVM我们构想了几种扩容方案

比特币扩容方案

链下部分:在本地进行ZK-AluVM进行交易与证明生成,但将与交易信息传输委托给中心化运营商,此操作中,交易感知者为交易双边与中心化运营商。此处可使用Nostr等协议降低中心化。

链上部分:走链上验证,链上验证可选Rollup,将多个交易Rollup使用同一个封条进行封装,节约Gas。此处BTC可改为闪电网络,达到极高的TPS。

利用零知识证明(ZKP)实现隐私支付的链上应用方案

以太坊layer2方案框架示意图

链下部分:走ZK-AluVM进行交易与证明生成,此处可选择中心化服务,或客户端自己运营,进行P2P传输。

链上部分:首先客户端将交易打给Layer2节点,排序后写入Calldata,执行层从以太坊读取数据后处理交易。此处将基于UTXO的一次性封装方案改为了使用合约中心化管理。此方案链上部分非常中心化,可选各种高性能EVM公链作为底,达到一个较高的TPS。

利用零知识证明(ZKP)实现隐私支付的链上应用方案

总结

受到长度限制,还有很多好的协议没有列举,比如Aleo、RGB等等,但在隐私支付领域作为用户我们更在意的是安全、高效、稳定,在众多的产品中我们必须要提高安全意识、增加对区块链的理解,无论是什么隐私支付方案我们都要了解其内核,对自己的资产负责,对自己的未来负责。