一条老公式的三笔旧账
EVM 给合约使用内存定价的方式,多年来是一条二次方曲线:内存用得越多,每单位的新增成本越高。设计它的最初理由是防拒绝服务——不想让攻击者用廉价计算迫使节点处理巨量内存。EIP-7923 的动机文本认为这条曲线到今天已经积了三笔旧账。第一笔叫时代错位:即便在 3000 万 gas 的区块上限下,一条消息调用最多也就用 3MB 内存,而用满它花光的 gas 早到了离谱的程度;文本举了一个刺眼的例子,按现行公式动用 64KB 内存就要付一万多 gas,而 64KB 恰好是上世纪八十年代初个人电脑的全部内存量级。第二笔叫难以推理:二次方模型下要算清一笔交易到底能分配多少内存,得把调用栈递归深度、每层调用的配额一起纳入优化问题,用户、语言和工具都很难给出直观答案。第三笔叫语言枷锁:现代语言的运行时需要堆和调用栈分区管理,靠的是操作系统虚拟内存里两头生长的布局;合约语言拿不到虚拟内存这个福利,只能在二次方计费下用各种抠门的内存管理方案省 gas,Vyper 和 Solidity 的很多低效都源于此。
新账本怎么记
提案的规格部分把内存改成按页分配、线性计价。一页 4096 字节,与主流操作系统的页大小一致;本条消息调用内第一次触碰某页,收 100 gas,之后随便读写不再重复收费;零号页免费,因为调用指令的基础开销已经覆盖了它的分配成本。MLOAD、MSTORE 这些指令自身的基础 gas 保持 3 不变,二次项和线性项则整体删除。虚拟寻址下内存地址限制在 32 位以内,越界访问触发异常停机;同时给整笔交易设了一个硬顶——最多分配 16384 页,合计 64MB。页 0 免费、每页 100 的定价来自实测:论文时代的基准测试显示,映射一页平均一到两微秒,对比每 gas 约 20 纳秒的换算率,100 是留有安全边际的整数。MSIZE 的语义被原样保留,以免破坏依赖它的已部署合约。
草案阶段的正确读法
这份 EIP 在官方仓库标注为 Draft,作者包括 Charles Cooper 与 Qi Zhou,尚未排入升级。它的取舍同样有讨论空间:线性计价把成本从用得越深越贵改成一视同仁,DoS 防御就改押在那条 64MB 硬顶上;一些过去会因内存耗尽 gas 的合约,在新模型下可能反而跑得动,这类行为翻转需要测试网长期验证。对普通用户,这篇文章的实际价值是理解层面的:Gas 不是单一价格,而是计算、内存、状态各自有账本的复合体系;任何一页账本的改法,背后都是安全性与效率之间的重新议价。
风险提示:本文为EVM计费机制的技术介绍,不构成投资建议,不构成对Gas费用水平的预测。合约交互前请核实所用工具链的官方文档。
老公式与硬件的错位
现行公式的来历要放在时间线里看:二次方惩罚是为防某类构造超大内存的攻击而加,阈值以上按内存字数平方级加价,动机文本里那句动用64KB内存要花14336 gas 的测算,就是这条曲线在今天的样子。提案则押注现代硬件的真相:内存访问是分层的,热页在缓存里、次热在页缓存、冷数据才落盘,按是否使用收费远比按深度惩罚收费更贴近成本。实现层面文本给了两条路——有虚拟内存能力的系统直接映射一大段地址空间,让操作系统按需分配,真正花钱的只是记账用的页登记表;没有这能力的实现自己维护页号到内容的映射。这些细节意味着:即便将来某天落地,它也必然先经历测试网对100每页这个价格的反复校准,以及一批依赖内存膨胀特性挖矿或做压力测试的工具失效阵痛。把它当成一次为工具链松绑的底层工程即可。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。