本文讨论了在Solidity智能合约中优化Gas消耗的方法,尤其是如何使用uint256代替布尔值,以减少不必要的SLOAD操作,进而节省Gas成本。文章通过示例展示了优化前后的Gas消耗差异,并提及相关工具与资源以帮助读者进一步了解气体优化策略。
照片由 Danny Howe 在 Unsplash 上提供
如果你无法因为付费墙而阅读这篇文章,请点击此处免费阅读!
布尔值比 uint256 或任何占满一个字的类型更昂贵,因为每次写操作都会发出额外的 SLOAD 以首先读取插槽的内容,替换布尔值占用的位,然后再写回。
如果这听起来很熟悉,那是因为你可能在 Openzeppelin 的 ReentrancyGuard 智能合约中读到或听说过。
这种方法具有巨大的节省气体的潜力,我想向你展示在什么情况下它可以对优化智能合约的Gas消耗产生很大影响。
如果你还不知道如何通过热访问节省气体,尤其是不知道从零值更改为非零值是多么昂贵,请先阅读这篇文章:“ 理解 EVM 的工作原理可以节省你的气体”。
你现在也可以观看我在 Remix 中解释这个内容的视频:
让我们来找出答案。
这是一个简单的智能合约,我们能够将地址添加到或移除出白名单。
contract GasOptimization {
address owner;
mapping(address => bool) whitelistedAddresses;
// 311497 gas
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Ownable: caller is not the owner");
_;
}
modifier isWhitelisted(address _address) {
require(whitelistedAddresses[_address], "Whitelist: You need to be whitelisted");
_;
}
// 24857 gas
function addUser(address _addressToWhitelist) public onlyOwner {
whitelistedAddresses[_addressToWhitelist] = true;
}
// 7801 gas
function…
- 原文链接: medium.com/@bloqarl/save...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!