zkEVM (一) 架构简介

  • blocksight
  • 更新于 2022-04-24 09:13
  • 阅读 2860

zkEVM旨在设计并实现一种解决方案,通过零知识证明来验证以太坊执行模块(通常指Layer2执行)。该项目目标是实现与以太坊EVM的100%兼容性。这是一个由社区贡献和拥有的开源项目,主要包含两个方面:zkRollup,Validity proofs(有效性证明)

zkevm 介绍

zkEVM旨在设计并实现一种解决方案,通过零知识证明来验证以太坊执行模块(通常指Layer2执行)。该项目目标是实现与以太坊EVM的100%兼容性。这是一个由社区贡献和拥有的开源项目,主要包含两个方面:

zkRollup

通过遵循以太坊规范, 构建一个解决方案,允许部署一个与以太坊生态系统兼容的layer2层网络,并将正确构建的新区块的零知识证明提交给layer1层智能合约,该智能合约验证此类证明(纳入并充当layer1共识层)。使用零知识证明来验证数据块,使客户能够比处理事务更快地验证事务,从而在可扩展性方面提供优势。

Validity proofs(有效性证明)

构建一个解决方案,允许从现有以太坊网络(如mainnet, 或者自己搭建的以太坊网络)生成块的零知识证明,并在同一类型网络的智能合约中发布它们。

通过使用零知识证明来验证块,light客户端可以快速同步多个低资源消耗的块,同时保证块的正确性,而不需要信任外部方(第三方)。

zkevm 架构

zkevm 中包含多个电路,每个电路都经过布局设计,使得能够构建自己的自定义约束(custom gate)。当电路遇到一些昂贵的或者不友好操作时,它们可以通过lookup 将一些约束放到其他电路。

电路之间的关系如下所示: _20220424090458.png

每个电路都使用了一些table,这里的table一般指lookup table。电路列表和tables 如下:

Circuit Table
EVM Circuit
Bytecode Circuit Bytecode Table
State Circuit Rw Table
Block Circuit Block Table
Tx Circuit Tx Table
MPT Circuit MPT Table
Keccak Circuit Keccak Table
ECDSA Circuit ECDSA Table
  • EVM Circuit: evm 执行电路
  • Bytecode Circuit: 合约账户字节码电路
  • State Circuit: 状态操作电路
  • Tx Circuit: 交易电路
  • MPT Circuit: MPT树电路
  • Keccak Circuit : Keccak hash 电路
  • ECDSA Circuit: ECDSA签名电路

最后,可以根据电路大小和维度组装起来。例如,我们可以通过使用不同的列来组合两个不同的电路,或者使用带有额外选择器(selector)的相同列来组合它们。

为了减少构建完整块的证明所需的时间和简化验证步骤,正在构建一个聚合电路,类似于zksync的proof aggregation 以压缩和验证图中所示的每个子电路证明。

lookup table在电路中的使用

在halo2中,lookup可以灵活配置。任何能够转换为“表达式(Epression)” 的东西都可以用作“item:Tuple[int,…]”或者“table:Set[Tuple[int,…]] ”

通过Lookup。可以约束表达式在table中。Expression包括任意偏移的Constant、Fixed、Advice或Instance列。

将多个电路用作Lookup表的动机是,EVM包含许多对电路不友好的操作,如随机读写数据访问、“错误”字段操作(secp256k1上的ECDSA)、传统哈希函数,如“keccak256”,等等。他们大都接受可变长度的输入。处理可变长输入对于电路来说有点麻烦!

这些昂贵(麻烦)的操作使得很难设计EVM电路来验证计算轨迹,因为每一步都可能包含上面提到的一些操作。因此,我们试图将这些昂贵(麻烦)的操作分离为具有更友好布局的单用途电路,并通过lookup来使用它们来彼此输入和输出,从而将一部分工作转移到更容易实现约束的特定电路中。

可以使用输入输出Lookup将工作转移的原因是,我们知道lookup table表配置了约束,以验证输入和输出是否存在某种关系。例如,我们让byte code电路保存一组元组(code_hash,index,opcode),每个<span> </span>code_hash都被验证为它所包含的操作码的keccak256摘要,然后在EVM电路中,我们可以通过查找字节码表,用(code_hash,program_counter)加载`opcode'。

然而,有一些属性我们只能通过查找来确保(最终只能证明所有查找的内容都是一个表的子集)。我们希望限制所有(查找到的)item的数量应该等于table的大小,这是EVM电路和状态电路所要求的,以防止在table中进行额外的恶意写入。在这种情况下(查找的项集精确定义了表),我们需要一些额外的约束来确保关系是正确的。一种简单的方法是计算状态电路中的所有“项”(最终是“表”的大小),并将其限制为等于EVM电路中计算的值。

小结

本文主要是开源的社区文档的翻译,略作修改。需要说明的是, 文档不断在更新,有些设计在代码实现中会有差别,还有一些电路未及时添加在图中,但是不太影响总体理解!

原文:https://appliedzkp.github.io/zkevm-docs/architecture.html

另外,由于zkevm使用halo2 proof system作为后端,所以文中有些术语来自halo2.

感谢关注, 欢迎讨论!!!

本文首发于:https://mp.weixin.qq.com/s/q-BmJfsRIqTa2zL93Rq0eg

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blocksight
blocksight
江湖只有他的大名,没有他的介绍。