... | ... | @@ -6,22 +6,41 @@ |
|
|
|
|
|
具体操作:从栈顶弹出两个值a和b,进行整数加法(mod 2^256),将结果存进栈。
|
|
|
|
|
|
trace示例:
|
|
|
示例具体操作流程如下:
|
|
|
|
|
|
**初始状态**:
|
|
|
|
|
|
- 栈内容:`[a, b]`
|
|
|
- 其中,`a` 和 `b` 是256位整数,`a` 在栈顶,`b` 在栈顶下方。
|
|
|
|
|
|
**操作步骤**:
|
|
|
|
|
|
- **弹出值**:从栈中弹出两个值 `a` 和 `b`。此时栈变为空。
|
|
|
- **计算**:执行加法操作:`result = (a + b) % 2^256`。这个操作确保结果始终保持在256位整数范围内。
|
|
|
- **推入结果**:将计算得到的结果 `result` 推入栈中。
|
|
|
|
|
|
**最终状态**:
|
|
|
|
|
|
- 栈内容:`[result]`
|
|
|
|
|
|
evm中trace示例:
|
|
|
|
|
|
```code
|
|
|
// Example 1
|
|
|
// Result 0x14
|
|
|
PUSH1 10
|
|
|
PUSH1 10
|
|
|
// Result 20 //0x14
|
|
|
PUSH1 10 //0x10
|
|
|
PUSH1 10 //0x10
|
|
|
ADD
|
|
|
|
|
|
// Example 2
|
|
|
// Result 0x0
|
|
|
PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
|
|
PUSH1 1
|
|
|
PUSH1 1 //0x01
|
|
|
ADD
|
|
|
```
|
|
|
|
|
|
由于在evm中`ADD`指令会自动从栈中弹出两个操作数并将结果推入栈中,所以在trace中没有显式的`POP`操作。
|
|
|
|
|
|
### Witness Core Row
|
|
|
|
|
|
core row中的表格设计如下:
|
... | ... | @@ -29,14 +48,14 @@ core row中的表格设计如下: |
|
|
| cnt | ver[0-7] | ver[8-15] | ver[16-23] | 其他 |
|
|
|
| ---- | ------------------- | ------------------- | ------------------ | ---- |
|
|
|
| 2 | ARITH | - | - | - |
|
|
|
| 1 | STATE (stack_pop_b) | STATE (stack_pop_a) | STATE (stack_push) | - |
|
|
|
| 1 | STATE (stack_pop_a) | STATE (stack_pop_b) | STATE (stack_push) | - |
|
|
|
| 0 | DYNA_SELECTOR | AUX | - | - |
|
|
|
|
|
|
cnt=2,vers[0]~vers[8]的位置用来存放arithmetic table lookup;
|
|
|
|
|
|
cnt=1,vers[0]~vers[7]的位置用来存放栈顶弹出的值stack_pop_b;
|
|
|
cnt=1,vers[0]~vers[7]的位置用来存放栈顶弹出的值stack_pop_a;
|
|
|
|
|
|
cnt=1,vers[8]~vers[15]的位置用来存放栈顶弹出的值stack_pop_a;
|
|
|
cnt=1,vers[8]~vers[15]的位置用来存放栈顶弹出的值stack_pop_b;
|
|
|
|
|
|
cnt=1,vers[16]~vers[23]的位置用来存进栈顶的值stack_push。
|
|
|
|
... | ... | @@ -88,8 +107,8 @@ cnt=1,vers[16]~vers[23]的位置用来存进栈顶的值stack_push。 |
|
|
|
|
|
这些约束确保算术操作数和栈操作的值一致。具体来说:
|
|
|
|
|
|
- `arithmetic_operand_b = lookup_stack_pop_b`
|
|
|
- `arithmetic_operand_a = lookup_stack_pop_a`
|
|
|
- `arithmetic_operand_b = lookup_stack_pop_b`
|
|
|
- `arithmetic_operand_push = lookup_stack_push`
|
|
|
|
|
|
这些约束对操作数的高位 (`hi`) 和低位 (`lo`) 进行约束,并确保它们与状态查找中的值相等。
|
... | ... | |