... | ... | @@ -207,7 +207,7 @@ CONCAT_RLC = R^5 RLC[0] + R^4 RLC[1] + R^3 RLC[2] + R^2 RLC[3] + R^1 RLC[4] + RL |
|
|
|
|
|
`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`
|
|
|
`cnt`,`length`, `concat_rlc_acc`、`hash`
|
|
|
|
|
|
|
|
|
|
... | ... | @@ -221,7 +221,9 @@ CONCAT_RLC = R^5 RLC[0] + R^4 RLC[1] + R^3 RLC[2] + R^2 RLC[3] + R^1 RLC[4] + RL |
|
|
|
|
|
以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开始计数,持续累加
|
|
|
length: 整个表格的长度,一列的值都相等
|
|
|
|
|
|
cnt: 从0开始,持续自增,直到length-1, cnt==0是第一行,cnt==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
|
|
|
|
... | ... | @@ -257,9 +259,9 @@ Hash: `Column<Advice>`类型,只有在length-1和length两行有值,分别 |
|
|
|
|
|
当tag_cur != nil && 当前行不是第一行 则有 tag_prev == nil && tag_next == nil
|
|
|
|
|
|
当tag_cur == nil && tag_next == nil 则有 tag_cur = tag_next (有些无意义已经知道都是nil,因为无法确认当前行是否为0-15行的第0行还是第15行)
|
|
|
~~当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 (无效值所在行是填充0还是原始值???)
|
|
|
`block_tx_id`、`value0`、`value1`、`value2`、`value3`与tag类似,如果tag == nil,则value_cur == value_prev (无效值所在行是填充0,witness中填充的是None)
|
|
|
|
|
|
根据tag进行判断
|
|
|
|
... | ... | @@ -269,21 +271,21 @@ Hash: `Column<Advice>`类型,只有在length-1和length两行有值,分别 |
|
|
|
|
|
- TxCalldata 或 TxLogData
|
|
|
|
|
|
对于TxCalldata或者TxLogData开始行,idx=0
|
|
|
|
|
|
如果不是TxCalldata或者TxLogData开始行
|
|
|
对于TxCalldata或者TxLogData开始行(idx=0)
|
|
|
|
|
|
  同时是每一个value(0-15行)的第一行(0行,tag != nil),则idx_cur = idx_prev+1,且tag_cur = tag.Rotation(-16)
|
|
|
如果TxCalldata或者TxLogData的idx !=0
|
|
|
|
|
|
  其他行(1-15行,tag==nil)则有idx_cur = idx_prev, byte_cur == u8_cur (还不确定byte是否为大端序)
|
|
|
  同时是每一个value(0-15行)的第一行(0行,tag != nil),则idx_cur = idx_prev+1,~~且tag_cur = tag.Rotation(-16) (不需要约束这个tag)~~
|
|
|
|
|
|
(如何判断TxCalldata或者TxLogData开始行开始行)
|
|
|
  其他行(1-15行,tag==nil)则有idx_cur = idx_prev, byte_cur == u8_cur
|
|
|
|
|
|
4. u8
|
|
|
|
|
|
每一个原始值被展开为了16行u8
|
|
|
|
|
|
对于u8的来说,当tag_cur != nil && 当前行不是第一行,以value0为例,则有
|
|
|
对于u8的来说,当tag_cur != nil && 当前行不是第一行,以value0为例,则有(TxLog和TxData不需要进行约束)
|
|
|
|
|
|
可以使用`expr_from_bytes`函数
|
|
|
|
|
|
```rust
|
|
|
let v1 = value0_u8.Rotation(-1);
|
... | ... | @@ -317,9 +319,11 @@ Hash: `Column<Advice>`类型,只有在length-1和length两行有值,分别 |
|
|
|
|
|
1. 如何判断当前行是最后一行
|
|
|
|
|
|
cnt==length-1是最后一行
|
|
|
|
|
|
2. 如何判断表格当前行为第一行
|
|
|
|
|
|
length==0,即第一行
|
|
|
cnt==0,即第一行
|
|
|
|
|
|
3. 如何判断TxCalldata或者TxLogData开始行开始行
|
|
|
|
... | ... | @@ -327,12 +331,18 @@ Hash: `Column<Advice>`类型,只有在length-1和length两行有值,分别 |
|
|
|
|
|
问题:是根据idx==0来判断TxCalldata开始的第一行,还是根据TxCalldata开始的第一行来判断idx==0
|
|
|
|
|
|
4. 无效行(0~15行的1~15行)填充0还是和有效行(0~15行中的第0行)一样的值
|
|
|
4. 无效行(0~15行的1~15行)填充0还是和有效行(0~15行中的第0行)一样的值、
|
|
|
|
|
|
填充0
|
|
|
|
|
|
5. LogIndex之间是否需要约束,每一个当前一条的log与上一条log之间的index值是递增的,但是每一条log又被拆分称了多个(logTopic,logSize,logData)
|
|
|
|
|
|
不需要约束,只要保证最终的hash一致即可
|
|
|
|
|
|
6. 如block_tx_idx等是否需要约束
|
|
|
|
|
|
不需要约束,只要保证最终的hash一致即可
|
|
|
|
|
|
|
|
|
|
|
|
#### 其他:
|
... | ... | |