Solidity节省GAS的方法

Posted l1423

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solidity节省GAS的方法相关的知识,希望对你有一定的参考价值。

1、使用struct结构体

使用struct结构体会结构存储空间,编译器会自动优化struct的存储。比如uint类型,不管是uint32还是uint256,默认都会使用256存储。两个uint32也占用2个256的存储单元。但如果是在struct内部的两个uint32,则只会占用一个256存储单元。

2、对于不需要修改链上内容的函数,加上view关键词。

当玩家从外部调用一个view函数,是不需要支付一分 gas 的。

这是因为 view 函数不会真正改变区块链上的任何数据 - 它们只是读取。因此用 view 标记一个函数,意味着告诉 web3.js,运行这个函数只需要查询你的本地以太坊节点,而不需要在区块链上创建一个事务(事务需要运行在每个节点上,因此花费 gas)。

稍后我们将介绍如何在自己的节点上设置 web3.js。但现在,你关键是要记住,在所能只读的函数上标记上表示“只读”的“external view 声明,就能为你的玩家减少在 DApp 中 gas 用量。

注意:如果一个 view 函数在另一个函数的内部被调用,而调用函数与 view 函数的不属于同一个合约,也会产生调用成本。这是因为如果主调函数在以太坊创建了一个事务,它仍然需要逐个节点去验证。所以标记为 view 的函数只有在外部调用时才是免费的。

Solidity高级理论:Gas

solidity高级理论(二):Gas

关键字:Gas、结构体、节省小技巧

Gas是什么

在Solidity中,用户想要执行DApp都需要支付一定量的Gas,Gas可以用以太币购买,所以,用户每次使用DApp都会发费以太币。

一个 DApp 收取多少 gas 取决于功能逻辑的复杂程度。每个操作背后,都在计算完成这个操作所需要的计算资源,(比如,存储数据就比做个加法运算贵得多), 一次操作所需要花费的 gas 等于这个操作背后的所有运算花销的总和。

由于运行你的程序需要花费用户的真金白银,在以太坊中代码的编程语言,比其他任何编程语言都更强调优化。同样的功能,使用笨拙的代码开发的程序,比起经过精巧优化的代码来,运行花费更高,这显然会给成千上万的用户带来大量不必要的开销。

gas是计算费用的方式。不过,这些费用仍然是以ether计算,这与gas不同。gas成本是工作量,如劳动时数,而gas价格就像您为完成工作付出的小时工资。 两者的组合决定了您的总交易费用。如果您的gas价格太低,没有人会处理您的交易。如果您的gas价格不错,但交易的gas成本超过预算,交易失败,但仍然被打包进区块,劳动者工作了,您不会获得退款。这样确保没有任何东西永远运行,而且人们会对他们运行的代码注意一点。 它使矿工和用户都能安全避免错误的代码!

节省Gas的小技巧

其实很多人觉得,使用uint变种会节省gas,如uin8,其实并不是,即使使用uint8,solidity还是会为它保留256位的存储空间。
例如,使用uint8而不是使用uint256,消耗的gas是一样的。

结构封装(Struct packing)

有一种办法可以节省gas,那就是把uint绑定到struct里面。
如果一个struct中有多个uint,则尽可能使用较小的uint,solidity会将这些uint打包在一起,从而占用较小的存储空间。例如:

    struct da{
        uint a;
        uint b;
        uint c;
    }
    strcut xiao{
        uint32 a;
        uint32 b;
        uint c;
    }
    da normal = da(10, 20, 30);
    xiao mini = xiao(10, 20, 30);
    // 因为使用了结构打包,‘xiao’比‘da’占用的空间更少

这样就符合大家的逻辑了,使用uint32比uint256节省了很多的gas。

所以,当 uint 定义在一个 struct 中的时候,尽量使用最小的整数子类型以节约空间。 并且把同样类型的变量放一起(即在 struct 中将把变量按照类型依次放置),这样 Solidity 可以将存储空间最小化。例如,有两个 struct:

uint c; uint32 a; uint32 b; 和 uint32 a; uint c; uint32 b;

前者比后者需要的gas更少,因为前者把uint32放一起了。

技术分享图片



以上是关于Solidity节省GAS的方法的主要内容,如果未能解决你的问题,请参考以下文章

10.区块链系列之hardhat部署抵押赎回Fund合约

区块链Solidity智能合约与Solidity介绍

区块链之智能合约 solidity踩坑 --上篇

区块链开发之Solidity智能合约开发

区块链Solidity智能合约语言学习笔记

区块链开发之Solidity编程基础合约数据存储