学习 EVM 字节码和合约的对应关系
source:https://youtu.be/RxL_1AfV7N4?si=oTGjUI0lQWkEqn0t
Intro
使用Solidity
编写的智能合约已经超过90%
以太坊交易的接口
对于合约部署的交易,目的地址必须为空且Data
字段为init code
对于合约调用的交易,目的地址为合约,Data
字段为functioncall和参数
Stack, Memory, Storage, Code, CallData, & Logs
EVM是基于栈的处理器,输入从栈中来,输出pop到栈中
calldata是read-only的memory
EVM的log是write-only
Yellow paper
操作码在yellow paper中被定义
操作码的数值越大,语义更可能是以太坊定义的
6080604052是在初始化内存指针
函数调用
检查calldata是否小于4bytes,涉及到函数选择器function selector
32bytes右移0xe0比特
function selector查询网站 https://www.4byte.directory/signatures/
solidity是按照函数签名的值排序jump table的,如果自己选择的函数名能够生成数值更小的函数签名,可以节约gas。如果函数签名超过4个,进行二分查找
每次进入函数会push返回地址
get val1和val2的返回地址是相同的,代码复用(compiler开启代码优化后)
EVM client通过gas机制防御内存扩张造成的问题
storage overwrite
solidity内存覆盖攻击
不同合约的storage是隔离的
- CODECOPY
- EXTCODECOPY