Solidity Gas消耗

本文探讨了在以太坊智能合约中,常量与变量读取的Gas消耗差异,指出常量的使用可以减少 Gas 成本。同时,通过比较if-else与三元运算符的Gas效率,发现三元运算符的消耗更高。建议开发者在编写合约时考虑这些细节以优化效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.常量和变量读取GAS消耗

pragma solidity ^0.8.7;
// 21420 gas
contract demo1{
    address public constant admin = 0x6BaB7a0e1696D654adEdf4266B563c7CD656E212;
}
//23553 gas
contract demo2{
    address public admin = 0x6BaB7a0e1696D654adEdf4266B563c7CD656E212;
}

常量比变量少消耗2133 Gas费

在以太坊中读取变量不需要消耗gas费,但是当使用写入合约时读取数据就会消耗对应的Gas费

在合约中根据实际需求 尽量多定义常量而不是变量

2.if-else和三元运算符

pragma solidity ^0.8.7;

contract demo{
    //传入参数:1000 21820 gas
    function example_1(uint _x) external pure returns (uint) {
        if (_x <=100){
            return 1;
        }
        else
        {
            return 2;
        }
        
    }
    //传入参数:1000 21861 gas
    function example_2(uint _x) external pure returns (uint){
        return _x <=100 ? 1 : 2;
    }
}

三元运算符的Gas消耗比if-else要更多,大概多了40个gas

### Solidity 中交易 Gas 费用优化方法 #### 1. 数据类型的优化 在 Solidity 编程中,合理选择数据类型可以有效降低 Gas 消耗。例如,使用 `uint8` 替代默认的 `uint256` 是一种常见的做法。这种调整能够减少存储空间的需求,从而降低 Gas 成本[^3]。 #### 2. 常量与不可变变量的应用 通过将不会改变的状态变量定义为 `constant` 或 `immutable`,可以进一步节约 Gas。其中,`constant` 类型的数据会在编译阶段嵌入到字节码中,而 `immutable` 则是在合约部署时初始化并固定下来。相比普通的存储变量,这两种方式都更加节省 Gas,因为它们不需要额外的存储插槽来保存值[^4]。 #### 3. 函数参数传递模式的选择 当处理大尺寸的数据结构作为函数输入时,推荐采用 `calldata` 关键字代替传统的 `memory` 方式。由于 `calldata` 提供了一种只读访问机制,它不允许任何修改操作,因此相较于允许更改内容的 `memory` 来说更为经济高效[^5]。 #### 4. 避免不必要的循环迭代次数过多的操作 复杂的业务逻辑通常伴随着较高的计算开销,这不仅增加了用户的负担也影响了整个网络性能。为了改善这一点,应该尽量简化算法流程设计,避免深嵌套或者重复调用外部接口等情况发生;同时还可以考虑引入缓存技术预先计算好一些固定的中间结果以备后续多次查询之需[^2]。 #### 5. 合约内部状态管理改进措施 除了以上提到的技术细节外,在实际项目开发过程中还需要关注整体架构层面的设计思路——比如适当拆分大型单体合同成若干个小模块分别实现各自独立的功能单元,并且利用事件日志记录重要信息而不是完全依赖链上永久性保留全部历史痕迹等方式都可以帮助达到更好的经济效益目标[^1]。 ```solidity // Example of using calldata to save gas function processLargeData(bytes calldata data) external pure returns (bytes memory result){ // Process the large input without modifying it. } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值