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
  • 6 bytecode

6 bytecode · Changes

Page history
chore: modify bytecode doc authored Dec 27, 2023 by qingyun Ma's avatar qingyun Ma
Show whitespace changes
Inline Side-by-side
Showing with 22 additions and 23 deletions
+22 -23
  • zkevm-docs/6-bytecode.markdown zkevm-docs/6-bytecode.markdown +22 -23
  • No files found.
zkevm-docs/6-bytecode.markdown
View page @ 99c067a1
Bytecode电路用于存放合约的Bytecode,为其他电路提供Bytecode的来源依据,其他子电路可通过Lookup约束来验证所操作Bytecode码是否是合法的。
Bytecode circuit用于存放和约束合约的Bytecode,为其他电路提供bytecode的来源依据,其他子电路可通过Lookup约束来验证所操作bytecode码是否是合法的。
Bytecode table中存放的可能并不只是一个合约的Bytecode,不同的合约对应的不同的Bytecode,这些Bytecode以`address`进行标识,一个合约的Bytecode与唯一的address对应。
Bytecode table中存放的可能并不只是一个合约的Bytecode,不同的合约的Bytecode以`address`进行标识,Bytecode与address是唯一一一对应。
对于一个合约的Bytecode而言,`pc`是opcode或者no_code(push的byte)唯一的标识
在对Bytecode进行处理时,将Bytecode分为两类:
1. Opcode:操作指令,如ADD、SUB、CODECOPY、PUSH1、PUSH2...
2. Push value:PUSH指令(PUSH1~PUSH32)所PUSH的value
1. Opcode(非PUSH):操作指令,如ADD、SUB、CODECOPY
2. Opcode(PUSH):PUSH1~PUSH2
## Witness、Column设计
......@@ -37,8 +37,8 @@ pub struct Row {
}
```
- cnt: 只有PUSH指令使用,PUSH的byte的数量,如PUSH1 --> cnt=1, PUSH2 --> cnt=2, PUSH31 --> cnt=31, PUSH32 --> cnt=32,如果是非PUSH的Opcode则cnt=0,如果是no_code则cnt的值为(0~cnt-1),可参考下面示例
- is_high:cnt >=16 ---> 1,cnt < 16 ---> 0
- cnt:如果是非PUSH的Opcode则cnt=0, 对于PUSH指令,cnt为PUSH的byte的数量,如PUSH1 --> cnt=1, PUSH2 --> cnt=2, PUSH31 --> cnt=31, PUSH32 --> cnt=32,对于no_code则cnt的值为(0~cnt-1)
- is_high:cnt >=16 ---> 1,cnt < 16 ---> 0,主要是用于辅助计算acc的值(规定acc的值最多为16个字节)
- acc_hi:cnt >=16的Bytecode执行此计算,`acc_hi_pre * 256 + bytecode`,即计算byte的累加值
- acc_lo:cnt < 16的Bytecode执行此计算,`acc_lo_pre * 256 + bytecode`,即计算byte的累加值
- value_hi:cnt >= 16的Bytecode的最终累加值,即最终的acc_hi
......@@ -121,35 +121,34 @@ pub struct BytecodeCircuitConfig<F> {
}
```
对于IsZeroConfig小工具,如果传入的值为0则返回结果为1,如果结果不为0则返回结果为0
对于IsZeroConfig小工具,如果传入的值为0则返回结果为1,如果传入的值不为0则返回结果为0
- cnt_is_zero:用于判断cnt是否为0
- cnt_is_15:用于判断cnt是否为15
- addr_unchange:用于判断与上一行相比,address是否发生了变化(Bytecode circuit table中可能是多个合约Bytecode共存的,不同的Bytecode对应不同的address)
计算方式:addr_cur - addr_prev,如果为0则addr没有发生变化
- addr_unchange:用于判断address是否发生了变化(Bytecode circuit table中可能是多个合约Bytecode共存的,不同的Bytecode对应不同的address),addr_cur - addr_prev,如果为0则addr没有发生变化
- addr_is_zero:Bytecode circuit table中会存在一个除了有实际意义的row之外,还存在一些为了凑行数的padding row,这些padding row所有的格子都是0
## 门约束
**cnt_prev=0约束**
cnt_prev=0时,cur_row_prev的情况有三种:Opcode、PUSH的最后一个byte、padding的行,即cur_row是新的Opcode的行或者是padding的行
cnt_prev=0的情况有三种:Opcode(非PUSH)、PUSH的最后一个byte、padding的行,
(padding的行由addr=0来约束,所有值都为0,Opcode(非PUSH) cnt_cur=0, Opcode(PUSH) cnt_cur!=0)
则当前行是新的Opcode或者是padding行
cnt_prev=0 ----> acc_hi_cur=0, acc_lo_cur=0 (即当前行是Opcode或者padding的行)
(padding的行由addr=0来约束,所有值都为0,Opcode的行则需要判断Bytecode不是PUSH的byte)
cnt_prev=0 ----> acc_hi_cur=0, acc_lo_cur=0
**cnt=0约束**
cnt=0的情况有三种:Opcode(非PUSH)、PUSH指令PUSH的最后一个byte、padding的row(padding的row由addr=0来约束,PUSH的最后一个byte的cnt_prev-cnt_cur=1, Opcode(非PUSH) cnt一定为0)
cnt=0的情况有三种:Opcode(非PUSH)、PUSH指令PUSH的最后一个byte、padding的row
(padding的row由addr=0来约束, Opcode(非PUSH) cnt一定为0, PUSH的最后一个byte的cnt_prev-cnt_cur=1)
cnt ==0 ----> value_hi-acc_hi=0, value_lo-acc_lo=0
cnt ==0 ----> value_hi-acc_hi=0, value_lo-acc_lo=0 (统一约束了cnt=0的value_hi和value_lo的值)
......@@ -181,7 +180,7 @@ addr = 0 ---> addr=0, pc=0, bytecode=0, value_hi=0, value_lo=0, acc=hi=0, acc_lo
addr change ----> pc=0 (addr发生变化,说明是一个新的合约,pc应该从0开始)
addr unchange && addr != 0 ----> pc_cur - pc_prev = 1 (同一个合约的Bytecode中pc是累加的)
addr unchange && addr != 0 ----> pc_cur - pc_prev = 1 (同一个合约中pc是累加的)
......@@ -201,18 +200,18 @@ Addr=0, 所有值都为0
当cnt != 0时
当前的value_lod等于Rotation(cur_cnt)的value_lo,value_hi也是同理,即value_lo和value_hi等于最终计算出的value_lo、value_hi(PUSH的最后一个byte)
当前的value_lo等于Rotation(cur_cnt)的value_lo,value_hi也是同理,即value_lo和value_hi应等于最终计算出的value_lo、value_hi(PUSH的最后一个byte)
当cnt_prev=0时
​ padding的行由addr=0来约束,所有值都为0
​ Opcode(非PUSH) cnt_cur=0
​ Opcode(PUSH) cnt_cur!=0,约束就走了cnt!=0的约束
​ Bytecode是Opcode而不是PUSH的byte
当cnt==0时
​ Opcode(PUSH): cnt为0
​ PUSH的最后一个byte的cnt_prev-cnt_cur=1 (怎么区分是PUSH的byte而不是Opcode)
......
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号