Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
zkevm-circuits
zkevm-circuits
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Package Registry
  • Analytics
    • Analytics
    • CI / CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar

新注册的用户请输入邮箱并保存,随后登录邮箱激活账号。后续可直接使用邮箱登录!

  • zkp
  • zkevm-circuitszkevm-circuits
  • Wiki
    • Zkevm docs
    • 4 core
  • core extcodecopy

core extcodecopy · Changes

Page history
feat: update extcodecopy doc --story=1019296 authored Aug 01, 2024 by chenxuanhui's avatar chenxuanhui
Hide whitespace changes
Inline Side-by-side
Showing with 66 additions and 42 deletions
+66 -42
  • zkevm-docs/4-core/core-extcodecopy.markdown zkevm-docs/4-core/core-extcodecopy.markdown +66 -42
  • No files found.
zkevm-docs/4-core/core-extcodecopy.markdown
View page @ 9ce58aaf
...@@ -25,15 +25,14 @@ STOP ...@@ -25,15 +25,14 @@ STOP
#### EXTCODECOPY #### EXTCODECOPY
概述: 该操作类似CODECOPY,区别之处在于,可以通过参数指定合约源码地址栈顶。从栈顶第一个弹出的address来指定合约的源码地址,首先找到code=find_code_by(address),余下操作同CODECOPY EXTCODECOPY操作码类似于CODECOPY,但不同之处在于它可以通过参数指定合约源码地址。具体操作是从栈顶弹出一个地址,然后找到该地址对应的合约代码并复制到内存中。
### Witness Core Row ### Witness Core Row
core row的表格设计如下: Witness Core Row的表格设计如下:
cnt=2, vers[0]~vers[8] 为正常copy row进行LookUp的值 - `cnt=2, vers[0]~vers[8]`为正常copy row进行LookUp的值。
- `cnt=2, vers[8]~vers[17]`为padding copy row进行LookUp的值。
cnt=2, vers[8]~vers[17] 为padding copy row进行LookUp的值
```shell ```shell
/// +---+-------+-------+-------+----------+ /// +---+-------+-------+-------+----------+
...@@ -47,21 +46,18 @@ cnt=2, vers[8]~vers[17] 为padding copy row进行LookUp的值 ...@@ -47,21 +46,18 @@ cnt=2, vers[8]~vers[17] 为padding copy row进行LookUp的值
#### 解释 #### 解释
在进行copy时,offset即是要复制的合约的代码的起始位置start,复制长度为length,复制的结束位置end: start+length,但是在进行copy的时候可能存在边界问题,如下: 当进行code copy时,offset表示要复制的合约代码的起始位置,length表示复制的长度。需要注意的是在进行copy操作时可能会出现边界问题,例如:
1)offset<=len(code), copy_len > 0, offset+copy_len <= len(code), 无需进行0填充
2)offset<=len(code), copy_len == 0, offset+copy_len <= len(code), 无需0填充, 也无需拷贝,即code[start:start],为空
3)offset<=len(code), copy_len>0, offset_copy_len > len(code),需要进行0填充,填充长度为 copy_len - (len(code)-offset) --> offset+copy_len - len(code)
4)offset>len(code), copy_len>=0, offset+copy_len > len(code), 需要进行0填充,填充长度为offset+copy_len-len(code) 1. `offset <= len(code)`, `copy_len > 0`, `offset + copy_len <= len(code)`:无需进行0填充。
2. `offset <= len(code)`, `copy_len == 0`, `offset + copy_len <= len(code)`:无需0填充,也无需拷贝。
3. `offset <= len(code)`, `copy_len > 0`, `offset + copy_len > len(code)`:需要进行0填充。
4. `offset > len(code)`, `copy_len >= 0`, `offset + copy_len > len(code)`:需要进行0填充。
此外当 offset > u64时,会对offset进行特殊处理为u64的最大值 此外,当`offset`大于`u64`时,会对`offset`进行特殊处理为`u64`的最大值。
对于Padding的值也会被放到Memory中,Padding的值,Src部分都是默认值,dst部分正常填充(对Copy子电路来说,Padding部分,因为ByteCode中并不存在Padding的值,所以不存在来源,但是Padding的值也会被放入到Memory中,所以存在去向,所以Padding部分的LookUp无来源,但是有去向为State)。 对于Padding的值也会被放到内存中,Padding的值,Src部分都是默认值,dst部分正常填充。
不过padding中的dst部分在进行赋值时需要注意:dst_pointer和dst_stamp,因为在Copy子电路中,memory_addr=dst_pointer+cnt,memory_stamp=dst_stamp+cnt,而Padding和正常的Copy是分成两部分的(Padding在Copy子电路中的Type为Zero),即Padding在Copy子电路中的cnt也是从0开始计数的。 padding中的dst部分在进行赋值时需要注意:dst_pointer和dst_stamp,因为在Copy子电路中,memory_addr=dst_pointer+cnt,memory_stamp=dst_stamp+cnt,而Padding和正常的Copy是分成两部分的(Padding在Copy子电路中的Type为Zero),即Padding在Copy子电路中的cnt也是从0开始计数的。
举例如下: 举例如下:
...@@ -184,25 +180,56 @@ fn gen_witness(&self, trace: &GethExecStep, current_state: &mut WitnessExecHelpe ...@@ -184,25 +180,56 @@ fn gen_witness(&self, trace: &GethExecStep, current_state: &mut WitnessExecHelpe
### 门约束 ### 门约束
1. 当前的OPCODE一致 **1. 当前的OPCODE一致**
1. Stack Value约束(tag,state_stamp,call_id,stack_pointer,is_write)
1. Auxiliary字段约束(state_stamp,stack_pointer,log_stamp,read_only),值得注意的是state_stamp的约束需要考虑copy的长度为0的情况 这是确保我们正在处理的操作码是EXTCODECOPY操作码。
1. next_pc=stack_top_value_lo (从栈顶获取的值作为要跳转的值,pc范围是在u64内的,只取value_lo即可)
1. lookup_value约束: copy_lookup_len *(copy_lookup_src_type - Bytecode) ,当代码拷贝真实发生时候,src_type必然为Bytecode **2. Stack Value约束**
1. lookup_value约束: copy_lookup_len *(copy_lookup_dst_type - Memory), 当代码拷贝真实发生时候,dst_type必然为Memory
1. lookup_value约束: copy_lookup_len *(copy_lookup_dst_id - call_id) ,当代码拷贝真实发生时候,dst_id必然为call_id 约束包括 `tag`, `state_stamp`, `call_id`, `stack_pointer`, `is_write`,确保这些值在执行EXTCODECOPY操作时的一致性和正确性。
1. lookup_value约束: copy_lookup_len *(copy_lookup_dst_stamp - copy_code_stamp_start -1) ,当代码拷贝真实发生时候,拷贝代码行开始处必然在最后一个出栈元素的下一行
1. lookup_value约束: copy_lookup_len *(copy_lookup_src_id - address ),当代码拷贝真实发生时候,src_id必然为代码块的代码address **3. Auxiliary字段约束**
1. lookup_value约束: copy_lookup_len *(copy_lookup_dst_pointer - mem_offset ), 当代码拷贝真实发生的时候,dst_pointer必然为内存偏移量
1. lookup_value约束: copy_lookup_len *(copy_lookup_src_pointer - code_offset), 当代码拷贝真实发生的时候,src_pointer必然为代码偏移量 包括 `state_stamp`, `stack_pointer`, `log_stamp`, `read_only`,特别是要注意`state_stamp`在拷贝长度为0的情况下的处理。
1. lookup_value约束: copy_lookup_len + copy_padding_lookup_len - length, 代码拷贝长度 + padding的长度必然等于参数指定的拷贝长度
1. lookup_value约束: copy_padding_lookup_src_type - Zero ,padding的src_type 为 Zero类型(也即default()类型) **4. next_pc=stack_top_value_lo**
1. lookup_value约束: copy_padding_lookup_len* (copy_padding_lookup_dst_type - Memory) ,当真实有padding数据时候,dst_type应该为Memory
1. lookup_value约束: copy_padding_lookup_src_id - 0 , padding的src_id为默认值0 表示从栈顶获取的值作为跳转的地址,由于PC范围在u64内,只取value_lo部分即可。
1. lookup_value约束: copy_padding_lookup_src_pointer - 0 , padding的src_pointer为默认值0
1. lookup_value约束: copy_padding_lookup_len* (copy_padding_lookup_dst_pointer - copy_lookup_dst_pointer - copy_lookup_len ), 当真实有padding数据的时候, padding的dst_pointer 与 copy的dst_pointer相差拷贝的代码长度(copy_lookup_len) **5. lookup_value约束**
1. lookup_value约束: copy_padding_lookup_len* (copy_padding_lookup_dst_stamp - copy_code_stamp_start - copy_lookup_len - 1), 当真实有padding数据的时候,padding的dst_stamp与栈中最后一个元素所处的stamp相差真实拷贝的代码长度+1
确保拷贝操作中的各种值的一致性和正确性:
1. `copy_lookup_len * (copy_lookup_src_type - Bytecode)`:当真实发生代码拷贝时,`src_type`必然是Bytecode类型。
2. `copy_lookup_len * (copy_lookup_dst_type - Memory)`:当真实发生代码拷贝时,`dst_type`必然是Memory类型。
3. `copy_lookup_len * (copy_lookup_dst_id - call_id)`:当真实发生代码拷贝时,`dst_id`必然是当前的`call_id`。
4. `copy_lookup_len * (copy_lookup_dst_stamp - copy_code_stamp_start - 1)`:当真实发生代码拷贝时,拷贝代码行开始处必然在最后一个出栈元素的下一行。
5. `copy_lookup_len * (copy_lookup_src_id - address)`:当真实发生代码拷贝时,`src_id`必然是代码块的地址。
6. `copy_lookup_len * (copy_lookup_dst_pointer - mem_offset)`:当真实发生代码拷贝时,`dst_pointer`必然是内存偏移量。
7. `copy_lookup_len * (copy_lookup_src_pointer - code_offset)`:当真实发生代码拷贝时,`src_pointer`必然是代码偏移量。
8. `copy_lookup_len + copy_padding_lookup_len - length`:代码拷贝长度加上padding的长度必然等于指定的拷贝长度。
9. `copy_padding_lookup_src_type - Zero`:padding的`src_type`为Zero类型,即默认类型。
10. `copy_padding_lookup_len * (copy_padding_lookup_dst_type - Memory)`:当真实有padding数据时,`dst_type`应该是Memory。
11. `copy_padding_lookup_src_id - 0`:padding的`src_id`为默认值0。
12. `copy_padding_lookup_src_pointer - 0`:padding的`src_pointer`为默认值0。
13. `copy_padding_lookup_len * (copy_padding_lookup_dst_pointer - copy_lookup_dst_pointer - copy_lookup_len)`:当真实有padding数据时,`padding`的`dst_pointer`与`copy`的`dst_pointer`相差拷贝的代码长度。
14. `copy_padding_lookup_len * (copy_padding_lookup_dst_stamp - copy_code_stamp_start - copy_lookup_len - 1)`:当真实有padding数据时,`padding`的`dst_stamp`与栈中最后一个元素所处的`stamp`相差真实拷贝的代码长度加1。
可参考如下示例代码: 可参考如下示例代码:
```rust ```rust
fn get_constraints( fn get_constraints(
&self, &self,
...@@ -350,17 +377,14 @@ fn gen_witness(&self, trace: &GethExecStep, current_state: &mut WitnessExecHelpe ...@@ -350,17 +377,14 @@ fn gen_witness(&self, trace: &GethExecStep, current_state: &mut WitnessExecHelpe
### LookUp约束 ### LookUp约束
LookUp约束被放在cnt=2的CopyRow,被分为两个种约束:NoPaddingCopy的约束和PaddingCopy约束,各占9列: vers[0]~vers[8], vers[9]~vers[17] LookUp约束被放在 `cnt=2` 的 CopyRow,分为两种约束:NoPaddingCopy的约束和PaddingCopy约束,各占9列:vers[0]~vers[8] 和 vers[9]~vers[17]。
参考Witness Code Row中的解释部分,当offset+copy_len > len(code)时,需要填充0,填充长度为offset+copy_len-len(code)。
来源:Core
去向:Copy 当 `offset + copy_len > len(code)` 时,需要填充0,填充长度为 `offset + copy_len - len(code)`。
特别注意:当copy_len为0或者padding_len为0时,为0的CopyRow(都是默认值,全为零值)也是需要进行LookUp的(LookUp Copy中全为默认值行) - **来源**:Core
- **去向**:Copy
可参考代码如下: 特别注意:当 `copy_len` 为0或者 `padding_len` 为0时,CopyRow的所有值都是默认值(全为零值)也是需要进行LookUp的(LookUp Copy中全为默认值行)。
#### insert_copy_lookup #### insert_copy_lookup
......
Clone repository
  • basics
    • evm
    • halo2
  • code notes
    • binary_number_with_real_selector
    • how to use macro
    • simple_lt
    • simple_lt_word
  • Home
  • image
  • zkevm docs
    • 1 introduction
    • 10 public
    • 11 fixed
    • 12 exp
    • 13 keccak
    • 14 comparisons
    • 15 differences
View All Pages

Copyright © 2024 ChainWeaver Org. All Rights Reserved. 版权所有。

京ICP备2023035722号-3

京公网安备 11010802044225号