合约调用合约时,EVM 会为每一次调用新开一个帧:各自的栈、各自的内存、共享的世界状态。CALL、DELEGATECALL、STATICCALL 的区别就在于新帧里『我是谁』和『用谁家的存储』怎么填。本文拆解调用帧的资源划分、gas 传递规则、返回数据缓冲区和 revert 如何在帧间传播。
汇总与「智能合约」相关的文章,帮助你系统了解该主题。
合约调用合约时,EVM 会为每一次调用新开一个帧:各自的栈、各自的内存、共享的世界状态。CALL、DELEGATECALL、STATICCALL 的区别就在于新帧里『我是谁』和『用谁家的存储』怎么填。本文拆解调用帧的资源划分、gas 传递规则、返回数据缓冲区和 revert 如何在帧间传播。
EVM 规定 JUMP 与 JUMPI 只能落在不处于 PUSH 立即数之中的 0x5b 字节上,为此每个被跳转的代码都要先做一次线性扫描。EIP-7921 提议取消这层歧义检查。本文讲清这条校验从哪来、它挡住什么又拖累什么,以及为什么这份提案停留在 Stagnant。
在 EIP-684 之前,规范没有明确禁止在一个已有代码的地址再次执行合约创建。EIP-684 规定:创建目标地址只要已有非零 nonce 或非零代码,创建必须立即像首字节非法一样抛错,并追溯适用于所有既有区块。本文讲这个「部署碰撞回滚」规则的来龙去脉,以及它和后继提案 EIP-7610 的关系。
EIP-7705 提议给 EVM 增加 NONREENTRANT 与 REENTRANT 两条操作码,用协议级开关代替合约里逐手写下的重入锁。本文讲清这两条操作码各自做什么、标志位的作用域与回滚语义,以及这份 2024 年提出、目前处于停滞状态的提案距离主网还有多远。
智能合约里一次余额更新要读、算、写三步,并行执行引擎很难判断两次更新能不能同时跑。EIP-7519 提议加两个原子存储操作码 SCREDIT 与 SDEBIT,让协议自己完成加减并检查上下溢。本文解释这种并行原语解决什么、边界在哪。
EIP-8337 提议给字节码加一个 MAGIC 前缀:带前缀的代码在部署时做静态验证,保证控制流完全静态、每个返回都有对应调用、数据栈深度可静态证明不会下溢。本文解释这套静态合约与 EOF 的关系和实际意义。
EVM至今用一条二次方公式给合约内存计价,被批评为沿袭上世纪的防御设计。EIP-7923提议改用线性的按页计费:每页4096字节,首次触碰收100 gas,全交易上限64MB。本文拆解新账本的算法、动机里给出的历史包袱,以及它对合约语言的松绑效果。
Geth可在eth_call中用state override临时改写账户余额、nonce、代码或存储。本文说明参数位置、state与stateDiff差异及模拟结果边界。
EIP-7543 提议给 EVM 加一组任意精度十进制浮点指令:DECADD、DECMUL、DECEXP、DECLN、DECSIN 等,用系数加指数精确表示小数,把科学计算器级别的初等函数变成一条指令。本文解释为什么二进制存不下0.1、合约里的幂运算为什么贵,以及这份提案停摆的原因。
EIP-7791 提议在 EVM 里加一条 GAS2ETH 指令:合约执行消耗的 Gas 可按交易gas价折算成 ETH,直接打给指定地址,且不动区块奖励账本。本文拆解它的预算机制、想解决的合约变现难题,以及草案阶段就要面对的博弈。