0%

EVM: From Solidity to byte code, memory and storage

学习 EVM 字节码和合约的对应关系

source:https://youtu.be/RxL_1AfV7N4?si=oTGjUI0lQWkEqn0t

Intro

使用Solidity编写的智能合约已经超过90%

以太坊交易的接口

image-20240702191910946

对于合约部署的交易,目的地址必须为空且Data字段为init code

对于合约调用的交易,目的地址为合约,Data字段为functioncall和参数

image-20240702192319122

Stack, Memory, Storage, Code, CallData, & Logs

EVM是基于栈的处理器,输入从栈中来,输出pop到栈中

calldata是read-only的memory

EVM的log是write-only

image-20240702192857556

Yellow paper

操作码在yellow paper中被定义

操作码的数值越大,语义更可能是以太坊定义的

image-20240702195923776

6080604052是在初始化内存指针

image-20240702200704617

函数调用

检查calldata是否小于4bytes,涉及到函数选择器function selector

32bytes右移0xe0比特

function selector查询网站 https://www.4byte.directory/signatures/

solidity是按照函数签名的值排序jump table的,如果自己选择的函数名能够生成数值更小的函数签名,可以节约gas。如果函数签名超过4个,进行二分查找

image-20240702203926364

每次进入函数会push返回地址

get val1和val2的返回地址是相同的,代码复用(compiler开启代码优化后)

EVM client通过gas机制防御内存扩张造成的问题

image-20240703151924150

storage overwrite

solidity内存覆盖攻击

不同合约的storage是隔离的

  • CODECOPY
  • EXTCODECOPY