zkEVM旨在设计并实现一种解决方案,通过零知识证明来验证以太坊执行模块(通常指Layer2执行)。该项目目标是实现与以太坊EVM的100%兼容性。这是一个由社区贡献和拥有的开源项目,主要包含两个方面:zkRollup,Validity proofs(有效性证明)
zkEVM旨在设计并实现一种解决方案,通过零知识证明来验证以太坊执行模块(通常指Layer2执行)。该项目目标是实现与以太坊EVM的100%兼容性。这是一个由社区贡献和拥有的开源项目,主要包含两个方面:
通过遵循以太坊规范, 构建一个解决方案,允许部署一个与以太坊生态系统兼容的layer2层网络,并将正确构建的新区块的零知识证明提交给layer1层智能合约,该智能合约验证此类证明(纳入并充当layer1共识层)。使用零知识证明来验证数据块,使客户能够比处理事务更快地验证事务,从而在可扩展性方面提供优势。
构建一个解决方案,允许从现有以太坊网络(如mainnet, 或者自己搭建的以太坊网络)生成块的零知识证明,并在同一类型网络的智能合约中发布它们。
通过使用零知识证明来验证块,light客户端可以快速同步多个低资源消耗的块,同时保证块的正确性,而不需要信任外部方(第三方)。
zkevm 中包含多个电路,每个电路都经过布局设计,使得能够构建自己的自定义约束(custom gate)。当电路遇到一些昂贵的或者不友好操作时,它们可以通过lookup 将一些约束放到其他电路。
电路之间的关系如下所示:
每个电路都使用了一些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 |
最后,可以根据电路大小和维度组装起来。例如,我们可以通过使用不同的列来组合两个不同的电路,或者使用带有额外选择器(selector)的相同列来组合它们。
为了减少构建完整块的证明所需的时间和简化验证步骤,正在构建一个聚合电路,类似于zksync的proof aggregation 以压缩和验证图中所示的每个子电路证明。
在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.
感谢关注, 欢迎讨论!!!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!