|
|
# 总体布局
|
|
|
# Core
|
|
|
|
|
|
本段介绍结构体`CoreCircuitConfig`的列及其含义。
|
|
|
|
|
|
## 1 单功能列 Single-purpose columns
|
|
|
下面是core子电路中最简单的部分,单功能的列:
|
|
|
```rust
|
... | ... | @@ -228,9 +230,9 @@ pub enum LookupEntry<F> { |
|
|
```
|
|
|
要在代码里创建这种查找表操作,我们要用`meta.query_xx`将8列变为8个表达式Experssion,然后再创建这种enum。需要注意的是,代码的Rotation我们要用prev,即-1,因为我们设计的参照行是cnt=0行,cnt=1行是其上一行。
|
|
|
|
|
|
# 4 约束和分配数值
|
|
|
## 4 约束和分配数值
|
|
|
|
|
|
## 4.1 执行工具 Execution Gadget
|
|
|
### 4.1 执行工具 Execution Gadget
|
|
|
|
|
|
`ExecutionGadget` 是一个定义在 Rust 中的 trait,用于配置和生成执行状态的约束和证据。这个 trait 包含以下关键部分:
|
|
|
|
... | ... | @@ -278,19 +280,19 @@ pub(crate) trait ExecutionGadget< |
|
|
fn gen_witness(&self, trace: &Trace, current_state: &mut CurrentState) -> Witness;
|
|
|
}
|
|
|
```
|
|
|
## 4.2 门约束
|
|
|
### 4.2 门约束
|
|
|
每个执行状态都有对应的执行工具(Gadget),其方法 `get_constraints` 返回需要创建的所有门约束,形式为表达式的向量。在核心子电路中,通过循环对每一个执行工具调用 `get_constraints` 并创建其返回的门约束。
|
|
|
|
|
|
## 4.3 查找表约束
|
|
|
### 4.3 查找表约束
|
|
|
每个执行状态都有对应的执行工具(Gadget),其方法 `get_lookups` 返回需要创建的所有查找表约束,形式为 `LookupEntry` 的向量。在核心子电路中,通过循环对每一个执行工具调用 `get_lookups` 并将相同的 `LookupEntry` 合并,然后创建查找表约束,即 `meta.lookup_any(...)`。
|
|
|
|
|
|
## 4.4 排列约束
|
|
|
### 4.4 排列约束
|
|
|
目前没有用到Permutation constraints排列约束。
|
|
|
|
|
|
## 4.5 分配数值
|
|
|
### 4.5 分配数值
|
|
|
因为证据(Witness)的表格设计和子电路的列的设计基本对应,分配数值的代码被简化。只需将表格每一行的数值分配给子电路的相应列的相应行(offset)。Witness 的生成由每个执行工具的 `gen_witness` 方法负责。
|
|
|
|
|
|
## 4.6 例子
|
|
|
### 4.6 例子
|
|
|
形象展示:
|
|
|
```rust
|
|
|
/// Addmod Execution State layout is as follows
|
... | ... | @@ -307,9 +309,9 @@ pub(crate) trait ExecutionGadget< |
|
|
/// | 0 | DYNA_SELECTOR | AUX |
|
|
|
/// +---+-------+-------+-------+----------+
|
|
|
```
|
|
|
# 5 执行状态的转换流程
|
|
|
## 5 执行状态的转换流程
|
|
|
|
|
|
![image.png](/uploads/2/088B5A7969A744E7850B04351472A9F1/image.png)
|
|
|
![image.png](../image/state_transform.png)
|
|
|
|
|
|
|
|
|
如图中所示,最外层是 BEGIN_CHUNK 和 END_CHUNK 的gadget,约束 chunk 相关的数据项,比如区块数量。BEGIN_CHUNK 会进入 BEGIN_BLOCK 。
|
... | ... | @@ -322,7 +324,7 @@ pub(crate) trait ExecutionGadget< |
|
|
最里面一层是交易内的普通状态,转换过程和solidity的调用类似,遇到RETURN/REVERT、STOP 则进入END_CALL返回父函数;如果当前已经是最顶层的函数,那么就结束交易。(通过call_id是否等于0来判断当前是否结束交易)
|
|
|
|
|
|
|
|
|
## 5.1 执行状态的转换约束
|
|
|
### 5.1 执行状态的转换约束
|
|
|
某些执行状态之前或之后,需要约束为某个特定的执行状态,比如 end\_block,需要约束之前执行状态是END\_TX或BEGIN\_BLOCK,约束之后执行状态是 BEGIN\_BLOCK 或END\_CHUNK。
|
|
|
|
|
|
```rust
|
... | ... | |