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的方法的主要内容,如果未能解决你的问题,请参考以下文章