一次指数运算值多少 Gas:EIP-160 与一次被重算的算术定价 图 1
一次指数运算值多少 Gas:EIP-160 与一次被重算的算术定价 · 图 1

以太坊给每条虚拟机指令标了价,这套价目表不是数学推导出来的,更像一份不断补丁的体检报告。EIP-160 是其中不起眼的一条:2016 年 10 月 20 日起草,状态 Final,随 Spurious Dragon 硬分叉在主网区块 2,675,000 生效。内容一句话能说清——EXP 指令(求幂运算)的计价,从’基础十 Gas、指数每字节再十 Gas’改成’基础十 Gas、指数每字节五十 Gas’。改动背后是一次对全网算术成本的重新审计。

便宜价目表养出的攻击

2016 年 9 到 10 月,以太坊连续挨了两波拒绝服务攻击。攻击不偷钱,目标是让全网节点做赔本算术:交易付的钱(Gas 乘单价)与节点消耗的真实工时之间的比价被打破,攻击者用极低成本让每个节点反复验证高消耗指令。第一波之后,社区用 Tangerine Whistle 分叉给一批被实测证明’价格与耗时倒挂’的操作码集体涨价;对算术指令的审计则拆到指令粒度,EXP 就是在那轮细账里被点名的:提案原文的说法是,基准测试显示 EXP 大约被低估了四到八倍。

指数为什么比底数贵

EXP 的计价只对指数的字节数敏感,这个设计本身是对的:求幂用反复平方法,计算量跟着指数的位数线性走,一个填满 32 字节的指数意味着上百次平方加上上百次乘法的域内运算,而附加费每字节只收十个 Gas。换句话说,节点执行一笔大额求幂花掉的毫秒,按当时每 Gas 的工时汇率算,远超过交易付的钱。涨价到每字节五十 Gas,把比价拉回同一量级。注意基础费十 Gas 没动——付小指数的普通用户几乎无感,被重新定价的只有拿大指数烧算术的那类用法。

指令定价是一份体检报告

EIP-160 值得记住的不是那四十个 Gas,而是它示范的流程:发现倒挂、按指令粒度基准测试、在下一次分叉里批量或单点调价。以太坊的 Gas 表后来反复走过这个循环——2017 年 EIP-150 重画调用族、2021 年 EIP-2929 给存储读分冷热、2021 年 EIP-3529 削退款,每次都是’真实负载变了或测量精了,价目表就跟一版’。对读协议史的人,一条指令的价格史就是半部攻击史。

一条直觉算术

把账摊开:一个节点处理交易要付的’协议成本’是 Gas 数乘 Gas 单价,处理一笔大额求幂的真实成本是 CPU 毫秒。假设攻击者把指数填满三十二字节,旧价下这条指令收三百三十 Gas,而它相当于近四百次域乘法——一段正经乘法循环的真实开销远比它贵,收费却只是零头。攻击者把同样的钱反复投到单位 Gas 含算术量最高的指令上,每笔合法交易被挤出的空间就成了武器。定价审计要做的,就是让任何指令的每 Gas 真实耗时都接近全表平均值,不给套利留尖峰。

一次调价改不了整张表

也要说清这条提案的边界:它只修了 EXP 一个点。同一时期,哈希类指令、存储读写、调用开销的合理价位都在别的提案里各自演化,有的改了、有的停在草稿。指令定价因此从来不是一次终局,而是一场长期拉锯:新的合约形态带来新的热点指令,客户端实现提速又让老价格过时,于是每隔几轮升级就有人重新跑一遍全表基准。读冷门提案的价值正在于此——你能从一条五十对十的改动里,看清整个体系依靠测量而非信仰来维护秩序的方式。

快速问答

问:涨价会误伤正常合约吗? 答:正常合约的求幂几乎都用在模运算场景、指数不大,基础费未动,影响集中在刻意构造的大指数——而那正是攻击形态本身。

问:为什么不给 EXP 设燃料上限而是提价? 答:提价保留了合法用法的价格通道,上限则一刀切;Gas 体系的设计偏好是让成本如实反映资源,把选择权留给市场。

风险提示:本文为协议机制历史科普,不构成任何投资建议;区块高度与价格参数以 EIP 仓库与同期分叉公告文本为准。