You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity合约函数执行Gas成本为何随入参取值变化?

问题描述

在Remix环境中测试如下Solidity合约代码时,发现test函数的执行Gas成本与入参x的取值相关:当x的数值增大时,Gas消耗以12为单位阶梯式上升,无明确直观变化规律。
相关测试代码如下:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.4; 
contract Example{
    function test (uint x) external pure returns(bool z) {
        if(x > 0)
          z=true;
        else
          z=false;
    }
}
现象成因

这个现象是EVM calldata计费规则+Solidity编译器优化共同作用的结果:

  • EVM层对calldata读取有明确的Gas计费标准:calldata中每个字节如果值为0,读取Gas成本是4;如果值非0,读取Gas成本是16,单字节成本差值正好是12,和观测到的阶梯步长完全吻合。
  • Solidity 0.8.4版本编译器对x > 0这类判断做了定向优化:不需要把32字节长的uint类型入参x完整从calldata加载到栈中再做比较,只需要逐字节检查x对应的calldata段是否存在非0字节——只要存在任意非0字节,就判定x > 0返回true,所有字节全为0则返回false。
  • 无符号整数x的数值越大,其二进制表示中最高位的1位置越靠左,对应的非0字节数量就越多:
    • 当x取值在0~255区间时,仅最低位1个字节可能非0,Gas成本最低
    • 当x取值在256~65535区间时,有2个字节可能非0,Gas成本对应上涨12
    • 后续每多一个非0的高位字节,Gas成本就固定增加12,最终呈现出随x数值增大阶梯上升的表现。
  • 这个Gas差异和函数内布尔赋值、分支判断的执行成本无关,完全来自calldata读取阶段的计费差。编译器的优化逻辑本意是减少不必要的calldata读取以降低Gas消耗,反而产生了Gas随入参大小阶梯变化的直观表现。

内容的提问来源于stack exchange,提问作者vipin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:03:33