ZK 爱好者

Posted on Jan 06, 2022Read on Mirror.xyz

zk-Rollup 明星项目——zkSync 全解读 |ZK 科普系列(三)

在 zk-Rollup (以下简称 zkr)领域,zkSync 是最令人期待的项目之一,并即将在以太坊主网上发布 zkSync 2.0,也就是 zkEVM 。今天我们将来全方位了解下 zkSync 的团队、技术方案以及实现路径。

Matter Labs 的诞生

2018年,Alex Gluchowski 和 Alexandr Vlasov 为以太坊 L2 扩容而创办了 Matter Labs (以下简称为 “ML”) ,并在2019年3月拿到了以太坊基金会的 grant。ML 在介绍中将自己描述成“一个对自由、区块链和数学充满热情的工程师团队”。ML 一直将以太坊扩容为目标,并致力于用已有的技术来促进大众对于区块链的接纳,ML 认为这种技术就是 zkr。

ML 是非常理想主义的一批人,自称为密码朋克。作为 co-founder 之一的 Alex Gluchowski 来自于乌克兰,过去几十年中,那里一直被经济动荡和政治腐败所笼罩。从 zkSync 平台本身也可以看出 ML 对于自由和去中心化的向往,而关于团队其他成员鲜有介绍,几乎所有的对外采访都由另一位 co-founder Alex G. 来进行。

融资背景

2021年3月,ML 完成了由 Union Square Ventures 领投的600万美元 A 轮融资,其它知名投资机构包括 Placeholder 和 Dragonfly。这轮融资更令人注目的是同时引入了非常多的生态合作伙伴,其中不乏加密货币领域中最知名的公司和创始人。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F868b63a1-7efc-4866-8c13-8be65479915b_691x516.png

2021年11月,ML 又完成了由 A16Z 领投的5000万美元 B 轮融资,其它战略投资者中还包括了不少中心化交易所(Blockchain.com, Crypto.com, ByBit, OKEx)。在融资宣发后不久,这些交易所纷纷宣布于 zkSync 达成合作,支持交易所与 L2 之间的充值/提币。

产品

2019年,ML 发布了首款公共协议 zkr。随后,zkSync 1.0 于2020年6月在以太坊主网上线。

zkSync 1.0

zkSync 1.0 是以太坊上的一个 zkr L2 扩容解决方案,zkSync 1.0 是应用特定型, 主要聚焦于支付。作为 L2 解决方案,zkSync 1.0 有以下优势:

  • 转账手续费低;
  • 手续费可以用转账币种来支付(不必须用 ETH 作为手续费);
  • 转账确认快,交易最终性( finality)只需要几分钟;
  • 提款到 L1 最长15分钟 ( Optimism 和 Arbitrum 等利用欺诈证明的 L2 ,则需要7天 );

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F464bea63-6c2b-4f50-9a3d-e60086e60e76_1401x586.png

zkSync 1.0 是项非常了不起的技术进步,但由于并不能兼容 EVM,其可用性也受到限制。受益于低转账费用、高效的最终性和提款,zkSync 1.0 最主要的应用场景还是支付。

zkSync 2.0

zkSync 2.0 是构建于以太坊之上可兼容 EVM 的 L2解决方案,也被称为 zkEVM,因为它重新编译了 EVM 代码(Solidity, Vyper, Yul)并用 zkp(零知识证明)来校验 rollup 交易。如果你熟悉 Optimism 和 Arbitrum,那么 zkSync 2.0 并不难以理解,它也是将以太坊上的应用从 L1 迁移到 L2,只不过用到的技术是 zkr,而非 optimistic rollups。zkSync 2.0 提供了一种非常独特的架构—— volition,也就是 rollups 和 validium 的结合。

2021年5月,zkSync 2.0 测试网上线,并期望主网可以在2021年8月份上线。但由于技术难度而被推迟。但 Uniswap 的一个分叉项目已经在 zkSync 2.0 测试网上进行了部署。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccbf9db3-f1a7-4d17-87e6-cc06bb3f6d60_946x436.png

考虑到 zkSync 2.0 有潜力成为一个通用型的 L2 平台,因此文章的剩余部分将聚焦于 zkSync 2.0,首先,我们先来看下当前的行业状况。

Arbitrum 和 Optimism 等 Optimistic rollups 最早推向市场,已经有不少 dApp 部署在这些平台之上。根据下图可以看出,在用户数量上,Arbitrum 目前相对较为成功,主要原因在于 Arbitrum 比 Optimism 部署了更多的 dApp。但值得注意的是,zkSync 过去一个月中有显著增加。尽管 zkSync 1.0 可提供的功能有限,zkSync 在 L2 赛道上正努力追赶 Arbitrum。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86b620d-24fe-40ed-8a55-e0cd4f9879b7_913x532.png


EVM 兼容性

zkSync 在他们的 zkr 中采用的是 SNARK。如果你读过前两篇文章,应该知道 SNARK 是 zkp 中的一种。SNARK 最主要问题是最初的可信设置有可能会带来安全风险。zkSync 一开始采用的 SNARK 算法是 Groth16 。使用 Groth16,不仅仅需要一次可信设置(比如 zkSync 创世之初),而且 zkSync 上每次有新的应用升级都需要进行可信设置。这也为 zkSync 1.0 创造 EVM 兼容环境创造了障碍,因此 zkSync 1.0 只是限于特定应用,比如支付等。

2019年新型 SNARK 算法 PLONK 的诞生改变了这一切。PLONK 运行的过程非常技术,这里就不做细讲,重要的是,使用 PLONK 算法,可信设置只需要一次,而且只要可信设置中有一方是诚实的,系统就是安全的。由于不需要重新进行可信执行过程,EVM 兼容性就成了可能。这也是为何 PLONK 是很重要的一项技术突破。

zkSync 2.0 是如何实现 EVM 兼容的?

zkEVM 并不是 EVM 1:1 的复制,它的目标是在运行99% solidity 合约代码的同时保持同样的结果。为了实现这一目的,编译器将一种语言的源代码转换成为另外一种语言。zkSync 2.0 用的是 LLVM 编译器,将 EVM 的主要语言——Solidity, Yul 和 Vvper,以及 zkSync 自己的语言——Zinc 转换成 SNARK 兼容的代码。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63bf26c-f2b8-414c-9a50-2f69b34969fa_474x340.png

LLVM 编译器可以高效地提取智能合约代码并在对原有代码做最小改变的情况下,将其转换为可在 zkEVM 上运行的 SNARK 友好型代码,这样就可以支持与其它智能合约的可组合行。

zkSync 表示,短期内的重点是将以太坊 L1 上的智能合约高效地转移到 zkSync 2.0,因此重点在编译 Solidity。但长期来看,zkSync 认为基于 Rust 的语言会胜出。zkSync 自己的 Zinc 语言正是基于 Rust,而 Zinc 在编写智能合约方面更加高效。

zk-Rollups 运行原理

在深入剖析 zkSync 2.0 架构前,我们先来看看 zkr 的运行原理。

Rollup 是将交易在链下执行,并将部分交易数据维持链上。将执行层转移到链下可以提高区块链的可拓展性,而部分数据在 L1 链上则保证了 rollup 的 EVM 兼容性。同时很重要的一点是:通过提供链上数据可用性,rollup 也共享了 L1 的安全性。

为了保持 rollup 的状态更新,就需要用到默克尔树算法。默克尔树可以存储用于验证有效性的大量数据。

先将区块里所有交易逐个哈希一遍,然后两两结合到一起再次哈希,不断重复这个过程直到整个区块只剩一个哈希,得到的哈希就是默克尔树根。

对于 rollup 来说,L1 存在一个维持“状态根”的智能合约。这个状态根就是 rollup 状态的默克尔树根,保存 rollup 的状态(账户余额、合约代码等等),在每批交易结束后要同步到 L1。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3cdf08-05ba-4f3d-91e0-aacec7a2ff4d_802x262.png

当一批新的 rollup 转账被处理,这批交易与之前的状态根形成新的状态根(rollup 的状态就是这样更新的),L1 智能合约于是对更新进行验证。验证的过程一般有两种形式:欺诈证明(optimistic rollups) 或 有效性证明 (zk-rollups)。

zkSync 使用有效性证明验证,也就是 zkrollups,在这里,我们再来回顾一下 zkr。

zkr 可以在不为运算提供 inputs 的情况下证明运算的有效性。有了零知识证明,证明者需要复杂的工作来为验证者提供证明,而验证者可以轻松地根据证明本身来验证证明者工作的有效性。理论上,zkr 的验证过程就是这样进行的。zkp 背后的密码学和数学让这一过程成为可能。

再来举个具体的例子:

用户可以将资金从 L1 (比如以太坊主网) 转到 L2 (zkSync),一旦到了 L2 上,用户便可以使用 dApp ,比如在 zkSync 上的 ZigZag 上交易 ETH。L2 上的累积交易被一个证明者(又称“验证者”)打包成组。为了更新 rollup 的状态并将 L2 上的状态同步到 L1 被 L1 上的智能合约验证,证明者需要向 L1 提交三部分:

  1. rollup 最新状态的根哈希
  2. 零知识证明(SNARK 或 STARK)
  3. rollup 状态的变更以 calldata 形式发布

具体来说就是:

  1. Rollup 使用默克尔树算法。“根哈希”代表了被发往 L1 的各组交易的哈希值,L1 上的智能合约将使用哈希根更新在 L1 上 rollup 的状态根;
  2. L1 需要验证状态更新是正确的。记住,rollup 的目的是为了帮助区块链进行扩容,因此需要尽可能高效地对更新进行验证。zkp 的神奇之处就在于验证者可以仅仅凭借证明本身(证明者运算的输出结果)就可以进行验证。状态根与 zkp 一起发送,这样证明者就可以快速验证状态更新,而不需要亲自检验;
  3. zkp 只是保证状态的有效性,但并不向 L1 提供账户余额等数据。因此,用户并不能向 L1 证明他们的账户余额,而是需要依赖于证明者的运算。为了保证用户在没有 zkp 的情况下可以证明他们的账户余额,这些数据以 calldata 的形式发布到 L1。因此用户可以重新创建当前状态并证明自己的所有权。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1c8351-e34a-4e08-ad82-f0a5d8f63f0d_922x618.png

补充一下:

  • zkp 主要包括两种类型 - SNARK 和 STARK ,在第一篇文章中我们做过详细的对比。zkSync 使用的是 SNARK,以下为二者的对比:

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0de36-047c-4491-88d4-6d66a51043a7_679x255.png

  • 关于 calldata:
    • 从 EVM 计算角度来看,有三个地方可以存储变量- storage、memory、calldata。我个人理解,calldata 是成本最低的存储空间; calldata 同时也是不可改变的。这使得它可以满足以尽可能低的成本保存 rollup 状态,以便 L1 进行验证的目的。
    • 对于 zkSync 来说,不是每组交易中所有账户余额/交易的信息都在链上被发布为 calldata,只有 “state delta”。这一机制保证了更少的数据发送量—>更少的以太坊 gas 费用—>成本更低—>可拓展性更强。
    • 近期争论比较多的 EIP 希望可以降低 calldata 的 gas 费用并对 calldata 设立限制,降低 calldata gas 费用可以进一步有助于 rollup 扩容,设立限制则可保证协议的安全性。有预测指出,这项改变可以将 rollup 成本降低5倍。

总结一下 zk-rollups 带来的效率提升:

  • L2 上的交易被哈希加密成为默克尔树,只有默克尔树的状态根保存在 L1 上的智能合约中
  • 在 L1 上更新 rollup 的状态根,证明者需要大量的链下工作,以便 L1 的智能合约可以非常高效地在链上进行状态的验证和更新;
  • calldata 是在 L1 上存储数据成本最低的方式。每组交易的 rollup 状态改变被以 calldata 的形式发送至 L1,这保证了数据的链上可用性。

这些效率提升带来的结果是 zkr 的转账效率比以太坊主网低100倍!希望以上的内容可以帮大家理解 zkrollup 的运行原理,接下来我们将聚焦 zkSync2.0 的架构。


zkPorter

下图为不同的数据可用性和验证方法结合而成的四种扩容方案:

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd910050e-23f1-4f73-a1ae-a6acd419355f_691x214.png

zkSync 2.0 的架构包含了 zk-rollup 和 validium,二者的结合方式又被称作 “volition”,因为它给用户在 zk-rollup 和 validium 两者间选择的自由。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb8d3b36-645c-47e6-83c5-166c8a1a33a5_511x256.png

有效性证明(zkrollups)和欺诈证明(optimistic rollups)是 L2 交易被 L1 验证的两种方式。rollup 状态的改变被以 calldata 形式发送至 L1(因此数据是在链上可用的),因此 rollup 状态可以被重构(用户可以在 L1 上证明他们的账户余额,这样也能保证 L1 的安全性)。

将有效性证明和链上数据可用性结合起来的是 zkr。zkr 使 L2 上的转账比以太坊 L1 转账便宜100倍。问题是链上数据可用性以及有限的 L1 区块空间意味着 zkr 提供线性的可拓展性,而非指数的可拓展性。

同样使用 zkp 来进行验证,理论上也可以实现指数级的可拓展性增长。但这样做需要将数据可用性移至链下,相对于链上数据可用性安全性更低。使用 zkp 来对 L2 上的分组交易进行验证,同时保持链下数据可用性的方法叫做 Validium。

实现链下数据可用性有不同的方法。zkSync2.0 采用的是 PoS 系统,StarkNet 采用的是数据可用性委员会(Data Availability Committees)。

zk-rollups + validium = volition

在 zkSync 2.0 的架构里,有 zkr 账户和 validium 账户,validium 账户又被称为 zkPorter。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7803996d-ec5b-4fa6-81ee-e800a4e2f6d0_1146x738.png

zkr 账户使用 zkp 进行验证,数据可用性在链上;zkPorter 账户同样使用 zkp 进行验证,但数据可用性维持在 PoS 系统中的链下。用户可以在某些时间根据自己的喜好选择不同的账户。

  • zkPorter 账户的数据可用性被发布在另一个由“守护者”维护的 PoS 网络中,类似于其它的 L1 PoS 系统;
  • zkPorter 状态更新不会以 calldata 的形式发送到 L1,而 zkPorter 账户的根哈希会被发送到 L1。这样保证了不管 zkPorter 账户状态如何, 用户都能在 L1 上同步账户;

在维持 zkPorter 账户的 PoS 系统中,有守护者和验证者:

  • 验证者负责将 zkSync 2.0 上的交易分组打包,完成产生 zkp 的运算工作;
  • 守护者是 zkSync 的代币质押者。守护者需要对每次状态更新进行签名,如果守护者作恶,将会丢失他们做质押的代币;

ML 的终极愿景是希望 zkSync 可以完全抗审查,并在不受 ML 干预的情况下运行。在现实中,这被称为“渐进式去中心化”。目前,ML 承担验证者的角色,因此验证者是中心化的。未来,会有更多的验证者被提名,并受守护者的监督。

守护者包括在 zkPorter 的 PoS 网络中的 zkSync 代币质押者,守护者为 zkPorter 保护数据可用性,并监督验证者。守护者和验证者都可以得到一定比例的费用奖励。这种机制可以保证系统的去中心化。

下图为 zkSync 对 zkPorter 的图解:

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe973a42d-32ec-4849-88a5-a6892701d2f0_1296x708.png

需要强调的是,zkr 账户安全性并不受 volition 架构的影响,因为其依然保持 L1 的安全性。但是涉及到 zkPorter,需要考虑到两种情况:

  1. 如果超过了三分之一的守护者作恶,就不会有区块产生,因为破坏了绝对多数原则;
  2. 如果三分之二的守护者作恶,整个 zkPorter 状态就会被冻结,但这同样也会冻结他们的质押代币,所以发生的可能性较小;

最终,zkPorter 账户里的自己可以被冻结,但永远不会丢失。

zkSync 下面的这张图表很好地总结了不同架构的扩展性和安全之间的博弈:

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacb68b-bfd9-4389-871a-deec6dbaa895_682x532.png

从下面这张图表可以看出,volition 的设计可以支持大规模扩容。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F636229ac-3f8d-426b-bd1c-0c37a88fdef3_1024x115.png


生态 & Roadmap

基础设施

在 zkSync 2.0 上线前,zkSync 正在构建基础设施和生态整合阶段。我们之前也提到了,zkSync 在 A 轮和 B 轮融资中都引入了战略合作伙伴来帮助生态建设。A 轮融资中,很多领先的以太坊协议及创始人都参与了投资,他们也有动力帮助 dApp 从 L1 向 zkSync 2.0 迁移。B 轮中的战略投资者包括不少中心化交易所,其中有很多已经宣布与 zkSync 进行交易所和 L2之间的资金转账。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa35358fd-303e-4d7f-ba6e-75a6ed99bec4_538x235.png

应用

zkSync 与 Gitcoin 在捐赠上的合作让 zkSync 1.0 获得了第一个应用场景。目前,zkSync 上最要的应用是去中心化交易所 Zigzag。同时,zkSync 也支持使用 zkNFT 铸造 NFT。Argent 钱包也已支持 zkSync 的转账。近期有不少媒体文章对 zkSync 的应用做了整理介绍,建议大家多多体验,说不定会有意外的收获。

Roadmap

zkSync 1.0 的 zkr 方案所提供的功能应用场景非常有限,因此上线 zkSync 2.0,并围绕其打造生态是 zkSync 当前的主要任务。一旦协议开发到比较成熟的阶段,焦点将向隐私和去中心化转移。

https://cdn.substack.com/image/fetch/w_1100,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F89cedf15-e3c4-4647-b742-bc45ff273f5e_604x148.png


近期 zkSync 用户的增长得益于 zk narrative 的爆发以及大家对空投的期待。可以预料,StarkNet 上线后也将获得大量关注;长远来说,很多人认为 STARK 比 SNARK 是更优的选择,StarkWare 的团队也更豪华。我们也可以通过 zkSync 和 StarkNet 的发展来做进一步的观察。接下来,也会有更多关于两个项目对比的文章。

参考原文:https://cryptoexplainere60.substack.com/p/zk-world-pt-3-zksync

编译:ZK 爱好者

https://twitter.com/ZKP101

zkSync