... | ... | @@ -30,6 +30,7 @@ pub struct Row { |
|
|
|
|
|
pub enum Tag {
|
|
|
#[default]
|
|
|
Nil
|
|
|
And,
|
|
|
Or,
|
|
|
Xor,
|
... | ... | @@ -80,10 +81,19 @@ pub struct BitwiseCircuitConfig<F: Field> { |
|
|
|
|
|
### 门约束
|
|
|
|
|
|
- cnt=0 ---> acc_0=byte_0、acc_1=byte_1、acc_2=byte_2、sum_2=byte_2
|
|
|
- cnt != 0 ---> `acc_0=byte_0+acc_0_pre*256`,`acc_1=byte_1+acc_1_pre*256`,`acc_2=acc_2_pre*256`, `sum_2=byte_2+sum2_pre`,`tag=tag_pre`
|
|
|
电路中的行数不可能是16的整数倍,因为存在一些填充值(如begin_padding),电路自动padding的行使用Tag::Nil进行约束,Tag为Nil的行的值都为默认值,即为0
|
|
|
|
|
|
- tag_is_not_nil,cnt=0 ---> acc_0=byte_0、acc_1=byte_1、acc_2=byte_2、sum_2=byte_2 ,`cnt=0-->pre_cnt=15(暂未使用)`
|
|
|
- tag_is_not_nil,cnt != 0 ---> `acc_0=byte_0+acc_0_pre*256`,`acc_1=byte_1+acc_1_pre*256`,`acc_2=acc_2_pre*256`, `sum_2=byte_2+sum2_pre`,`cnt=cnt_pre+1`,`tag=tag_pre`
|
|
|
- tag_is_not_nil,next_cnt=0 --> cnt=15
|
|
|
|
|
|
- tag_is_nil ---> byte_0=0, byte_1=0, byte_2=0, acc_0=0, acc_1=0, acc_2=0, sum_2=0, cnt=0
|
|
|
|
|
|
next_cnt=0--->cnt=15 (同时也验证了,只要cnt=15则next_cnt=0)
|
|
|
|
|
|
### LookUp约束
|
|
|
|
|
|
使用lookup对`<tag、byte_0、byte1、byte_2>`进行证明,来源:bitwise,去向:fixed (fxed子电路中有对256位的数值的and、or、xor的计算的枚举)
|
|
|
|
|
|
注:只对Tag不为Nil的行进行LookUp
|
|
|
|