知道创宇区块链安全实验室|零知识证明系统先行者zkSync
前言
关注区块链的朋友,经常会在圈子里面看到有关零知识证明( Zero Knowledge Proof,简称ZKP )的信息,而 zksync、mina 等知名项目都是使用到了零知识证明的相关技术。
而实际上,这并不是什么新技术,早在1985年,由MIT教授Shafi Goldwasser, Silvio Micali 和密码学大师 Charles 在《The Knowledge Complexity of Interactive Proof-Systems》论文中提出。
正是这篇文章提出了零知识证明这个伟大概念,并逐步成为了现代密码学理论的根基之一,而 Shafi Goldwasser 和 Silvio Micali 也于2012 年获得了有“计算机界诺贝尔奖”之称的图灵奖。
什么是零知识证明
零知识证明指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。或许这样的描述还不够通俗,其实在我们日常生活中,也经常会有零知识证明的身影。
例1:
比如我有一个车子,我要向你证明我有车子的钥匙能打开车门。
在这里,我要证明的论题是:我有这个车子的钥匙,第一种做法是,我直接当你的面用车钥匙打开车门,还有一种做法是,我直接拿出车里面的东西给你看。
第一种方法你直接看到钥匙开门的过程,这不算零知识证明,因为你看到了钥匙。
第二种方法,验证者并不需要知道我用钥匙开门的过程,也能判断出我有这个车子的钥匙,整个过程我们认为验证者对于钥匙是零知识的。
例2:
A 是红绿色盲,B 是正常人,现在有一个红球和一个蓝球,除了颜色,其他大小质地等其他因素完全一样,因为 A 是色盲,那他看到的这两个球是一样的,那 B 如何才能让 A 相信这两个球是不一样的颜色呢?具体要怎么来做呢?
很简单,B 可以把两个球都给 A,A 分别一只手拿一个球,并藏在自己身后,A 自己决定要不要交换两只手的球(我们可以认为这里的交换是随机的,且换球与否只有A自己知道)。
然后 A 再把两只手的球拿给 B 看,B 只需要判断是否交换球即可,当然一次并不能证明,但如果我们猜 100 次呢,1000 次呢,如果 100 次,甚至 1000 次 B 都能正确猜对是否交换两个球,那 A 就可以推断出这两个球的颜色是不一样的了。
在整个过程中,A 都不知道球的正确颜色,所以我们认为 A 对于球的颜色是零知识的,但是A却通过这样的方式正确推断出这两个球的颜色不一样。
零知识证明的性质
上面的两个例子着重强调了零知识证明的“零知识”这个特性,但零知识证明作为一种证明手段,它也应该具备证明的基本性质:一是足够有说服力,而是无法作假。
具体而言,一种零知识证明的方法需要具备如下三个性质:
完备性 (Completeness):若证明方确实掌握了某论断的答案,则他肯定能找到方法向验证方证明他手中掌握的数据的正确性,即真的假不了。(对应上面色盲游戏的问题,就是证明方B会重复耐心地向验证方A真实回答是否交换球的问题,以证明这两个球的颜色不一样。)
可靠性 (Soundness):若证明方根本不掌握某论断的答案,则他无法说服验证方他手中所谓答案的准确性,即假的真不了。(对应上面色盲游戏的例子,就是如果证明方B也是色盲,那自然没有办法准确回答是否交换球咯。)
零知识性 (Zero-knowledgeness):验证方除了知道证明的结果外,对其他信息一无所知。
当然,现实生活中,还有很多这样的例子,我们不一一列举,用到零知识证明的项目很多,这里我们一起来了解一下 zkSync,zkSync 是基于 ZK Rollup 架构的低成本扩容协议,主要通过零知识证明和数据可用性保障用户资产安全。
zkSync的整体架构工作过程
Watcher 负责监控 zkSync 合约交易,Sender发送 zkSync 智能合约的交易,而 MemPool 负责收集交易。
整个过程会产生两种交易:L1交易和L2交易。
Block Proposer 将交易打包,并更改世界状态( Plasma State )。在世界状态更改后,通过Block Committer 生成证明需要的信息。具体到存款和转账流程如下:
存款
1、用户调用 L1 zkSync 智能合约存储资金,该交易发生在 L1;
2、Watcher 监控 L1 存款交易,当交易发生时则会放入 Mempool 中,该过程一般会经过 10个区块确认,但实际使用中,可能需要更长时间 L1 的充币交易才会在 L2 中生效;
3、Block Proposer 处理 Mempool 交易打包,并提交 State Keeper 更新账本,充币交易的状态随之变化。
转账
1、当用户想要使用 L2 低成本快速转账时,调用 zkSync API 提交转账交易;
2、交易同样会按照流程 Mempool --> Block Proposer --> State Keeper 进行流转;
3、最终 State Keeper 通知 Block Commiter 收集生成零知识证明所需信息,调用 PlonK 证明系统生成零知识证明后,借助 Sender 将存款和转账等交易数据,以及将对应的零知识证明提交到 L1 的 zkSync 智能合约验证,等待 L1 交易确认后,Watcher 会通知 L2 更新交易状态为最终确认。
zkSync 采用PlonK零知识证明系统,其中包括 Prover Server 和 Proving Client,在电路设计上,非常巧妙的将交易分割成一个个小的通用处理单元( Operation )。
一个 Operation 对应的证明电路逻辑支持所有可能交易的 Operation 逻辑。多个有关联的 Operation 电路组成交易电路。
多个交易的电路再组合成区块电路。从而,在固定大小的区块中也能包含不同组合的交易。zkSync 开源了 PlonK 算法的验证电路,能进行多个 PlonK 证明。
相关代码链接如下:
https://github.com/matter-labs/recursive_aggregation_circuit
而在整个充币和转账过程中,zkSync 并不需要独立生成新账户,zkSync 的 L2 账户和 L1 账户是一一对应的,“共享”一份私钥,准确的说,L1 的私钥的 ECDSA 签名的结果作为 L2 账户的私钥。
这样在使用的时候很方便,我们直接使用 L1 的地址就可以在 L2上 完成充币,转账或者提币的操作。
总结
截止目前,imToken 和 gitcoin 已经深度集成了 zkSync,后面还会有更多的项目接入,而随着 ETH 交易量的高速增长,交易的拥堵和高昂的矿工费必将促进 Layer2 赛道的竞争,zkSync 作为零知识证明系统应用的先行者,或许值得期待。
实验室官网: www.knownseclab.com
知道创宇唯一指定存证平台 : www.attest.im
联系我们: blockchain@knownsec.com