... | ... | @@ -95,6 +95,7 @@ pub enum ExecutionState { |
|
|
- cnt=0的行的使用方法是:32列的前半部分作为“动态选择器”,后半部分用于“辅助变量”。
|
|
|
- cnt=1的行的使用方法是,作为操作数及其属性的变量,同时起到可以作为来源进行去向是state子电路的查找表的作用。
|
|
|
- cnt=2及以上的行的使用方法是,作为除state以外的查找表的作用。暂未完成全部说明。
|
|
|
|
|
|
#### 动态选择器 Dynamic Selector
|
|
|
|
|
|
电路的约束,包括门约束和查找表约束,需要在不同执行状态下开启。例如,都是3个操作数a b c的执行状态,加法ADD和乘法MUL的门约束,一个应是a+b-c=0,一个应是a\*b-c=0。那么在ADD执行状态下,我们启用“a+b-c=0”,禁用“a\*b-c=0”,MUL执行状态下相反。可以使用halo2的selector来启用、禁用约束,但是这种selector列是静态的,固定的,不像advice列一样是可以作为变量改变,而不改变电路的。因此,我们需要发明一种“动态选择器”,可以通过改变advice列的值来启用、禁用约束。
|
... | ... | @@ -237,6 +238,9 @@ pub(crate) trait ExecutionGadget< |
|
|
## 排列约束
|
|
|
目前没有用到Permutation constraints。
|
|
|
|
|
|
## 分配数值
|
|
|
因为证据Witness的表格设计和子电路的列的设计基本呈对应关系,分配数值的代码被大大简化。我们只需将表格每一行的数值分配给子电路的相应列的相应行(offset)即可。Witness生成则由每个执行工具的gen_witness方法负责,详见其代码。
|
|
|
|
|
|
# 例子
|
|
|
形象展示:
|
|
|
```rust
|
... | ... | |