本文探讨了在以太坊区块链上编写高效、节省Gas(gas)费用的智能合约的技巧,主要介绍了如何通过使用汇编代码来优化gas使用,包括在哈希和数学运算中使用汇编实现,以及相关的代码示例和gas使用对比。
照片由 Lenny Kuhne 提供于 Unsplash
如果由于防火墙无法阅读本文,请 点击这里免费阅读!
在以太坊区块链上编写高效且具有成本效益的智能合约时,每一点Gas节省都是重要的。根据需要在合约的某些部分使用汇编代码而非 Solidity 是优化 gas 使用的一种方法。
在本文中,我们将探讨如何通过使用汇编代码来帮助你在各种场景中节省 gas,从哈希和数学操作到写入存储和检查零地址。我们将提供 Solidity 代码及其相应的汇编实现示例,并附上 gas 使用比较,以便你可以亲自看到潜在的 gas 节省。
function solidityHash(uint256 a, uint256 b) public view {
// 未优化
keccak256(abi.encodePacked(a, b));
}
Gas: 313
function assemblyHash(uint256 a, uint256 b) public view {
// 优化
assembly {
mstore(0x00, a)
mstore(0x20, b)
let hashedVal := keccak256(0x00, 0x40)
}
}
Gas: 231
让我们看看使用的 Yul 指令及其解释。
unchecked{++i}
你还可以使用 unchecked{++i;}
进行更多的 gas 节省,但这不会检查 i
是否溢出。为了获得最佳的 gas 节省,请使用内联汇编,但这会限制你能实现的功能。
// 循环使用 unchecked{++i}
function uncheckedPlusPlusI() public pure {
uint256 j = 0;
for (uint256 i; i < 10; ) {
j++;
unchecked {
++i;
}
}
}
Gas: 1329
// 循环使用内联汇编
function inlineAssemblyLoop() public pure {
assembly {
let j := 0
for {
let i := 0
} lt(i, 10) {
i := add(i, 0x01)…
- 原文链接: medium.com/@bloqarl/soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!