BasicBlock:
在解释EVM是如何执行之前,先来解释一下BasicBlock(基本块)。一个基本块由一系列的指令构成,有一个入口和一个出口,入口就是第一个指令,出口就是最后一个指令。出口的类型有: 1. 条件跳转(JUMPI),2. 非条件跳转(JUMP),3. 结束指令(RETURN,REVERT)4.什么都没有,直接fall to下一个block
1. 条件跳转(JUMPI):
EVM中条件跳转的指令是JUMPI,它会从stack中读取2个元素,分别代表跳转的条件和pc(programmer counter)。下面是一个JUMPI的跳转例子:
Block1: JUMPDEST CALLVALUE ISZERO PUSH2 0x0100 JUMPI
Block2: PUSH1 0x00 DUP1 REVERT
Block1由5个指令构成(PUSH2 0x0100是一个), JUMPDEST表明这个Block是一个跳转的起始位置,CALLVALUE代表从transaction中获得的值,比如用户发送的ether额度,就可以用该指令获得。ISZERO判断CALLVALUE获得的值是否为0, PUSH指令向stack中放入了一个值。 最后执行到JUMPI,它从条件中读取了两个值: 1.ISZERO(CALLVALUE) 2. 0x0100. 如果满足1,则跳转到0x0100指向的block, 否则继续执行下一个BasicBlock(Block2) (PS: 如果满足条件跳转之后,执