... | ... | @@ -118,6 +118,8 @@ pub struct BytecodeCircuitConfig<F> { |
|
|
addr_unchange: IsZeroConfig<F>,
|
|
|
/// for chip to check if addr is zero, which means the row is padding
|
|
|
addr_is_zero: IsZeroWithRotationConfig<F>,
|
|
|
/// for rlc of bytecodes, used for keccak hash lookup; second phase column
|
|
|
rlc_acc: Column<Advice>,
|
|
|
}
|
|
|
```
|
|
|
|
... | ... | @@ -184,9 +186,19 @@ cnt_prev != 0 ----> value_hi_prev - value_hi_cur=0, value_lo_prev-value_lo_cur |
|
|
|
|
|
cnt_prev!=0, cnt=0,value_hi=acc_hi, value_lo=acc_lo
|
|
|
|
|
|
**rlc_acc**
|
|
|
|
|
|
addr change ----> rlc_acc=bytecode (addr发生变化,说明是一个新的合约,rlc_acc开始)
|
|
|
|
|
|
addr unchange && addr != 0 ----> rlc_acc = rlc_acc_prev * challenge + bytecode (rlc_acc累加)
|
|
|
|
|
|
## Lookup约束
|
|
|
|
|
|
每一个byte都应该在fixed电路中Lookup到,即每一个字节大小都应该在0~255范围内(是否真的有必要进行Lookup,因为bytecode列是从instance_bytecode来的,是公共数据)
|
|
|
每一个byte都应该在fixed电路中Lookup到,即每一个字节大小都应该在0~255范围内~~(是否真的有必要进行Lookup,因为bytecode列是从instance_bytecode来的,是公共数据)~~
|
|
|
|
|
|
Lookup Fixed table, 约束Bytecode是否为正确的Opcode, <tag=Bytecode, bytecode, is_push, cnt>
|
|
|
|
|
|
Lookup keccak table,<pc+1(即length), rlc_acc, hash_hi, hash_lo> 去往Keccak table查。此lookup只在下一行的addr change==0时进行。
|
|
|
|
|
|
Lookup Public table,addr和hash新增的往public table的lookup。<tag=CodeHash, addr, hash_hi, hash_lo>。此lookup只在下一行的addr change==0时进行。(也许addr要拆成hi和lo)
|
|
|
|