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
  • 10 public

10 public · Changes

Page history
chore: modify zkevm-docs/10-public authored Jun 04, 2024 by qingyun Ma's avatar qingyun Ma
Hide whitespace changes
Inline Side-by-side
Showing with 124 additions and 1 deletion
+124 -1
  • zkevm-docs/10-public.markdown zkevm-docs/10-public.markdown +124 -1
  • No files found.
zkevm-docs/10-public.markdown
View page @ 7f2b66b3
......@@ -195,4 +195,127 @@ CONCAT_RLC = R^5 RLC[0] + R^4 RLC[1] + R^3 RLC[2] + R^2 RLC[3] + R^1 RLC[4] + RL
这样,原来table的idx==0的行上边,要插入15行的填充行(tag为Nil)。idx!=0的行上边,不需要插入。
我们原来table有6列,因此对于每列,都要进行这样的约束。
\ No newline at end of file
我们原来table有6列,因此对于每列,都要进行这样的约束。
### 约束梳理
首先新表的列有以下几列,`Column<Advice>`:
`tag`、`block_tx_id`、`value0`、`value1`、`value2`、`value3`、
`tag_u8`、`block_tx_id_u8`、`value0_u8`、`value1_u8`、`value2_u8`、`value3_u8`、
`tag_u8_rlc_acc`、`block_tx_id_u8_rlc_acc`、`value0_u8_rlc_acc`、`value1_u8_rlc_acc`、`value2_u8_rlc_acc`、`value3_u8_rlc_acc`、
`length`, `concat_rlc_acc`、`hash`
`Column<Instance>`: `hash`
#### 值assign
原始值为:`tag`、`block_tx_id`、`value0`、`value1`、`value2`、`value3`
原始值以u8展示`tag_u8`、`block_tx_id_u8`、`value0_u8`、`value1_u8`、`value2_u8`、`value3_u8`,因为原始值都是U256类型,拆分为u8之后即16个u8(这里的拆分方式需要与计算keccak传入的u8列表顺序一致,暂定使用大端顺)
以u8计算rlc_acc: `tag_u8_rlc_acc`、`block_tx_id_u8_rlc_acc`、`value0_u8_rlc_acc`、`value1_u8_rlc_acc`、`value2_u8_rlc_acc`、`value3_u8_rlc_acc`,计算公式:`rlc_acc = rlc_acc_prev*random + cur_value`, 起始rlc_acc=cur_value, 即表格的第一行的值都为起始rlc_acc,所有的rlc_acc的计算持续到整张表结束
length: 整个表格的长度,从1开始计数,持续累加
final_rlc_acc:当表格结束时,最后一行的`tag_u8_rlc_acc`、`block_tx_id_u8_rlc_acc`、`value0_u8_rlc_acc`、`value1_u8_rlc_acc`、`value2_u8_rlc_acc`、`value3_u8_rlc_acc`的值即为整个public表的六列原始值的rlc_acc,暂称为final_rlc_acc
concat_rlc_acc: 整个public表中所有数据的rlc_acc, 计算方式为:
`tag_u8_final_rlc_acc*random^5 + block_tx_id_u8_final_rlc_acc*random^4 + value0_u8_final_rlc_acc*random^3 + value1_u8_final_rlc_acc*random^2 + value3_u8_rlc_final_acc*random + value3_u8_final_rlc_acc`
Hash: `Column<Advice>`类型,只有在length-1和length两行有值,分别为`public_hash_hi`和`public_hash_lo`
#### 约束
1. public整张表的约束:
1)lookup keccak table: <length, concat_rlc_acc, public_hash_hi, public_hash_lo> (在整张表的最后一行进lookup)
2)使用equal约束, public_hash_hi, public_hash_lo的值与 `Column<Instance>`中的hash相等
2. rlc_acc约束:
表格的第一行rlc_acc=cur_value_u8
rlc_acc = rlc_acc_prev*random + cur_value_u8
1中的lookup同时也保证了rlc_acc计算的正确性,如果计算正确就可以lookup到
3. 原始值
每一个原始值被展开为了16行u8
对于一行中的`tag`、`block_tx_id`、`value0`、`value1`、`value2`、`value3`6个值,只有16行中的第一行是有值的,其他15行都是默认值,tag的默认值为nil, 其他五个值的默认值为0
当tag_cur != nil && 当前行为第一行 则有 tag_next == nil
当tag_cur != nil && 当前行不是第一行 则有 tag_prev == nil && tag_next == nil
当tag_cur == nil && tag_next == nil 则有 tag_cur = tag_next (有些无意义已经知道都是nil,因为无法确认当前行是否为0-15行的第0行还是第15行)
`block_tx_id`、`value0`、`value1`、`value2`、`value3`与tag类似,如果tag == nil,则value_cur == value_prev
根据tag进行判断
- 非TxCalldata 或 TxLogData
进行上面的约束
- TxCalldata 或 TxLogData
对于TxCalldata或者TxLogData开始行,idx=0
如果不是TxCalldata或者TxLogData开始行
​ 同时是每一个value(0-15行)的第一行(0行,tag != nil),则idx_cur = idx_prev+1,且tag_cur = tag.Rotation(-16)
​ 其他行(1-15行,tag==nil)则有idx_cur = idx_prev, byte_cur == u8_cur (还不确定byte是否为大端序)
(如何判断TxCalldata或者TxLogData开始行开始行)
4. u8
每一个原始值被展开为了16行u8
对于u8的来说:
​ 当tag_cur != nil && 当前行不是第一行,则有
```rust
let v1 = value0_u8.Rotation(-1);
let v2 = value0_u8.Rotation(-2) * pow_of_two::<F>(8));
let v3 = value0_u8.Rotation(-3) * pow_of_two::<F>(16));
let v4 = value0_u8.Rotation(-4) * pow_of_two::<F>(24));
let v5 = value0_u8.Rotation(-5) * pow_of_two::<F>(32));
let v6 = value0_u8.Rotation(-6) * pow_of_two::<F>(40));
let v7 = value0_u8.Rotation(-7) * pow_of_two::<F>(48));
let v8 = value0_u8.Rotation(-8) * pow_of_two::<F>(56));
let v9 = value0_u8.Rotation(-9) * pow_of_two::<F>(64));
let v10 = value0_u8.Rotation(-10) * pow_of_two::<F>(72));
let v11 = value0_u8.Rotation(-11) * pow_of_two::<F>(80));
let v12 = value0_u8.Rotation(-12) * pow_of_two::<F>(88));
let v13 = value0_u8.Rotation(-13) * pow_of_two::<F>(96));
let v14 = value0_u8.Rotation(-14) * pow_of_two::<F>(104));
let v15 = value0_u8.Rotation(-15) * pow_of_two::<F>(112));
let v16 = value0_u8.Rotation(-16) * pow_of_two::<F>(120));
let v_final = v16+v15+v14+v13+...+v3+v2+v1;
let v_original = value0.Rotation(-16)
```
约束有:` v_final == v_original`
其他五个原始值同理
#### 问题:
1. 如何判断当前行是最后一行
2. 如何判断表格当前行为第一行
3. 如何判断TxCalldata或者TxLogData开始行开始行
4. LogIndex之间是否需要约束,每一个当前一条的log与上一条log之间的index值是递增的,但是每一条log又被拆分称了多个(logTopic,logSize,logData)
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号