如何节省gas 使用,是很多智能合约开发者头大的问题,这边文章应该会对大家有帮助。
在以太坊区块链上,Gas是用来奖励矿工为智能合约的存储与执行所提供的算力。 目前以太坊的利用率逐渐增长,交易手续费成本也水涨传告 —— 现在每天的gas成本已经高达数百万美元。 随着以太坊生态系统的扩大,Solidity智能合约开发者也需要关注gas使用的优化问题了。本文将介绍在使用Solidity开发以太坊智能合约时常用的一些Gas优化实践。
短路(short-circuiting)是一种使用或/与逻辑来排序不同成本操作的solidity合约 开发模式,它将低gas成本的操作放在前面,高gas成本的操作放在后面,这样如果前面的低成本操作可行,就可以跳过(短路)后面的高成本以太坊虚拟机操作了。
// f(x) 是低gas成本的操作
// g(y) 是高gas成本的操作
// 按如下排序不同gas成本的操作
f(x) || g(y)
f(x) && g(y)
在开发Solidity智能合约时,我们引入的库通常只需要用到其中的部分功能,这意味着其中可能会包含大量对于你的智能合约而言其实是冗余的solidity代码。如果可以在你自己的合约里安全有效地实现所依赖的库功能,那么就能够达到优化solidity合约的gas利用的目的。
例如,在下面的solidity代码中,我们的以太坊合约只是用到了SafeMath库的add
方法:
import './SafeMath.sol' as SafeMath;
contract SafeAddition {
function safeAdd(uint a, uint b) public pure returns(uint) {
return SafeMath.add(a, b);
}
}
通过参考SafeMath的这部分代码的实现,可以把对这个solidity库的依赖剔除掉:
contract SafeAddition {
function safeAdd(uint a, uint b) public pure returns(uint) {
uint c = a + b;
require(c >= a, "Addition overflow");
return c;
}
}
在Solidity合约开发中,显式声明函数的可见性不仅可以提高智能合约的安全性, 同时也有利于优化合约执行的gas成本。例如,通过显式地标记函数为外部函数(External),可以强制将函数参数的存储位置设置为calldata
,这会节约每次函数执行时所需的以太坊gas成本。
External 可见性比 public 消耗gas 少。
在Solidity中,有些数据类型要比另外一些数据类型的gas成本高。有必要 了解可用数据类型的gas利用情况,以便根据你的需求选择效率最高的那种。 下面是关于solidity数据类型gas消耗情况的一些规则:
uint
类型的情况下,不要使用string
类型bytes
类型时,不要在solidity合约种使用byte[]
类型bytes
的长度...如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!