... | ... | @@ -310,10 +310,10 @@ cnt=1, vers[24]~vers[31]的位置用来存放去向为bytecode的LookUp, 即校 |
|
|
2. Stack Value约束(tag、state_stamp、 call_id、stack_pointer、is_write)
|
|
|
3. Auxiliary字段约束(state_stamp、stack_pointer、log_stamp、read_only)
|
|
|
4. next_pc=stack_top_value_lo (从栈顶获取的值作为要跳转的值,pc范围是在u64内的,只取value_lo即可)
|
|
|
5. Stack_top_value_hi=0 (要对value_hi进行约束为0)
|
|
|
5. stack_top_value_hi=0 (要对value_hi进行约束为0)
|
|
|
6. lookup_value约束:lookup_pc=stack_top_value_lo (查找表操作,去向为bytecode table, 用来校验next_pc的合法性, lookup_pc一定也是stack_top_value_lo)
|
|
|
7. lookup_value约束:lookup_bytecode_addr=`meta.query_advice(config.code_addr, Rotation::cur());` (JUMP指令只是用来当前合约内部的PC跳转,next_pc_bytecode_addr有一定和当前的code_addr是一致的)
|
|
|
8. lookup_value约束:lookup_not_code=0 (next_pc所指向的位置上JUMPDEST,是具体的指令,并不是bytecode, 而是opcode)
|
|
|
8. lookup_value约束:lookup_not_code=0 (next_pc所指向的位置为JUMPDEST,是具体的指令,即是opcode,并不是bytecode,)
|
|
|
|
|
|
可参考下面示例代码:
|
|
|
|
... | ... | @@ -427,7 +427,7 @@ fn gen_witness(&self, trace: &GethExecStep, current_state: &mut WitnessExecHelpe |
|
|
|
|
|
#### get_lookups
|
|
|
|
|
|
从core row, cnt=1,vers[24]~vers[31]的位置位置获取值,向Bytecode进行lookup, 这里使用的lookUp类型为`BytecodeFull`
|
|
|
从core row, cnt=1,vers[24]~vers[31]的位置位置获取值,去向为Bytecode进行lookup, 这里使用的lookUp类型为`LookupEntry::BytecodeFull`
|
|
|
|
|
|
```rust
|
|
|
fn get_lookups(
|
... | ... | |