使用汇编的Solidity 进行 Gas优化

  • bloqarl
  • 发布于 2023-12-07 20:13
  • 阅读 62

本文探讨了在以太坊区块链上编写高效、节省Gas(gas)费用的智能合约的技巧,主要介绍了如何通过使用汇编代码来优化gas使用,包括在哈希和数学运算中使用汇编实现,以及相关的代码示例和gas使用对比。

照片由 Lenny Kuhne 提供于 Unsplash

如果由于防火墙无法阅读本文,请 点击这里免费阅读!

在以太坊区块链上编写高效且具有成本效益的智能合约时,每一点Gas节省都是重要的。根据需要在合约的某些部分使用汇编代码而非 Solidity 是优化 gas 使用的一种方法。

在本文中,我们将探讨如何通过使用汇编代码来帮助你在各种场景中节省 gas,从哈希和数学操作到写入存储和检查零地址。我们将提供 Solidity 代码及其相应的汇编实现示例,并附上 gas 使用比较,以便你可以亲自看到潜在的 gas 节省。

1. 使用汇编进行哈希而不是使用 solidity

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 指令及其解释。

2. 尽可能使用汇编而不是 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
bloqarl
bloqarl
江湖只有他的大名,没有他的介绍。