Uint 类型 Gas 比较
在Solidity中,通常认为使用较小的整数类型如 uint8, uint16, uint32, uint64, uint128, 和 uint256 可能会因为它们的尺寸较小而节省gas。 然而,情况并非总是如此。
以太坊虚拟机(EVM)为每个存储变量分配一个256位的槽。 例如,如果我们声明了一个 uint8 类型的变量,EVM会用 0 填充缺失的位以适应一个单独的槽。 Additionally, during execution, the EVM converts uintN types to uint256 for computations.
代码演示
让我们测试 uint8, uint32, 和 uint256 ,观察它们在写入数据时的行为。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Uint8Example {
    uint8 public uint8val;
    // gas 22234
    function set() external {
        uint8val = 1;
    }
    // gas 53427
    function compute() external returns (uint8) {
        uint8 target = 50;
        for (uint8 i = 0; i < target; i++) {
            uint8val += 1;
        }
        return uint8val;
    }
}
contract Uint32Example {
    uint32 public uint32val;
    // gas 22234
    function set() external {
        uint32val = 1;
    }
    // gas 53895
    function compute() external returns (uint32) {
        uint32 target = 50;
        for (uint32 i = 0; i < target; i++) {
            uint32val += 1;
        }
        return uint32val;
    }
}
contract Uint256Example {
    uint256 public uint256val;
    // gas 22238
    function set() external {
        uint256val = 1;
    }
    // gas 42950
    function compute() external returns (uint256) {
        uint256 target = 50;
        for (uint256 i = 0; i < target; i++) {
            uint256val += 1;
        }
        return uint256val;
    }
}
如观察所见,在循环计算中,uint256 节省了超过10,000 gas。 因此,较小的变量并不一定等同于节省gas。
关于 gas 优化的建议:
🌟如果变量不能被一起打包,使用 uint 或 uint256 是最佳选择。