... | @@ -2,7 +2,7 @@ |
... | @@ -2,7 +2,7 @@ |
|
|
|
|
|
## 介绍
|
|
## 介绍
|
|
|
|
|
|
在了解zkEVM之前,强烈建议读者了解EVM的相关执行流程和部分操作码,[ethereumbook](https://cypherpunks-core.github.io/ethereumbook/13evm.html)就讲的很好。
|
|
在了解zkEVM之前,读者需要了解一些EVM的相关执行流程和部分操作码,具体可以参考[ethereumbook](https://cypherpunks-core.github.io/ethereumbook/13evm.html)。
|
|
|
|
|
|
零知识以太坊虚拟机(zkEVM)是一种生成零知识证明以验证EVM智能合约程序运行正确性的虚拟机。zkEVM可以在公链的Rollup扩容方案中作为生成有效性证明的核心部分,也可以用以支持通用化的隐私计算。本项目开发面向长安链的zkEVM。
|
|
零知识以太坊虚拟机(zkEVM)是一种生成零知识证明以验证EVM智能合约程序运行正确性的虚拟机。zkEVM可以在公链的Rollup扩容方案中作为生成有效性证明的核心部分,也可以用以支持通用化的隐私计算。本项目开发面向长安链的zkEVM。
|
|
|
|
|
... | @@ -16,12 +16,12 @@ EVM的复杂性决定了电路的证据和约束将会非常复杂,进而决 |
... | @@ -16,12 +16,12 @@ EVM的复杂性决定了电路的证据和约束将会非常复杂,进而决 |
|
2. 状态(State),处理虚拟机中各类状态的读写
|
|
2. 状态(State),处理虚拟机中各类状态的读写
|
|
3. 字节码(Bytecode),处理合约的字节码
|
|
3. 字节码(Bytecode),处理合约的字节码
|
|
4. 拷贝(Copy),处理不定长数据的拷贝
|
|
4. 拷贝(Copy),处理不定长数据的拷贝
|
|
5. 未完成
|
|
5. 部分未完成的子电路
|
|
|
|
|
|
![Figure 1](/image/circuit-architecture.png)
|
|
![Figure 1](/image/circuit-architecture.png)
|
|
电路结构图
|
|
电路结构图
|
|
|
|
|
|
我们决定选择halo2零知识证明电路开发框架及其算术化方法,原因是其易用性和社区友好性。
|
|
出于对易用性和社区友好性的考虑,本项目选择halo2零知识证明电路开发框架及其算术化方法,
|
|
|
|
|
|
## 子电路
|
|
## 子电路
|
|
|
|
|
... | @@ -85,15 +85,15 @@ pub trait SubCircuit<F: Field> { |
... | @@ -85,15 +85,15 @@ pub trait SubCircuit<F: Field> { |
|
}
|
|
}
|
|
```
|
|
```
|
|
|
|
|
|
此接口是为了负责EVM的特定一部分的子电路而设计的。
|
|
此接口是为了负责EVM特定一部分的子电路而设计的。
|
|
|
|
|
|
- `type Config`设置为上述的`MyConfig`
|
|
- `type Config`设置为上述的`MyConfig`。
|
|
- `Cells`设置为要使用permutation约束的格子,目前为空`()`即可
|
|
- `Cells`设置为要使用permutation约束的格子,目前为空`()`即可。
|
|
- `new_from_witness(witness: &Witness)`创建一个新的子电路,输入是Witness,即证据,是一个包含所有电路输入的大表格。
|
|
- `new_from_witness(witness: &Witness)`创建一个新的子电路,输入是Witness,即证据,是一个包含所有电路输入的大表格。
|
|
- `instance`返回此电路所需的公开列的具体数值
|
|
- `instance`返回此电路所需的公开列的具体数值。
|
|
- `synthesize_sub`对此子电路进行synthesize操作,即分配值给子电路的格子。会返回`Cells`供permutation约束使用
|
|
- `synthesize_sub`对此子电路进行synthesize操作,即分配值给子电路的格子。会返回`Cells`供permutation约束使用。
|
|
- `unusable_rows`开始和最后不可用的行数,例如有约束要找前1行,那第一行就是不可用的,因为第一行再找前1行就找到错误的行数了。
|
|
- `unusable_rows`开始和最后不可用的行数,例如有约束要找前1行,那第一行就是不可用的,因为第一行再找前1行就找到错误的行数了。
|
|
- `num_rows`统计一共要用多少行
|
|
- `num_rows`统计一共要用多少行。
|
|
|
|
|
|
那么,一个结构体`MyCircuit`要实现此接口,一般其成员就包括一份Witness,其包括整张大表格,内含所有数值。需要注意的是,此结构体不包含`MyConfig`以及任何column,这是halo2的一种设计。
|
|
那么,一个结构体`MyCircuit`要实现此接口,一般其成员就包括一份Witness,其包括整张大表格,内含所有数值。需要注意的是,此结构体不包含`MyConfig`以及任何column,这是halo2的一种设计。
|
|
|
|
|
... | @@ -106,6 +106,5 @@ pub trait SubCircuit<F: Field> { |
... | @@ -106,6 +106,5 @@ pub trait SubCircuit<F: Field> { |
|
2. `synthesize`,即分配值给子电路,只需依次调用子电路的方法synthesize_sub即可。
|
|
2. `synthesize`,即分配值给子电路,只需依次调用子电路的方法synthesize_sub即可。
|
|
|
|
|
|
### 总结
|
|
### 总结
|
|
重点是
|
|
|
|
1. SubCircuitConfig的new,其包含了设置约束的configure功能。
|
|
1. SubCircuitConfig的new,其包含了设置约束的configure功能。
|
|
2. SubCircuit的synthesize_sub,其包含了分配值的synthesize功能。 |
|
2. SubCircuit的synthesize_sub,其包含了分配值的synthesize功能。 |
|
\ No newline at end of file |
|
|