【Solidity】Assembly 内联汇编

Assembly是Solidity更底层的语言,它能够实现Solidity无法实现的逻辑,比如把变量存在特定的内存插槽中,它能够增加细粒度的控制,好处就是可以节省合约执行所需的gas。2022年5月OpenSea开源了他们的新合约SeaPort,他们重写了交易合约,大量的省gas,更多详情可以看这个视频。

编写Assembly需要会操作码,目前Assembly操作码达144个
SeaPort: https://www.youtube.com/watch?v=knLGJ2M3f1o
参考文档:https://learnblockchain.cn/article/675
操作码:https://solidity-cn.readthedocs.io/zh/develop/assembly.html?highlight=%E5%86%85%E8%81%94#id4

代码范例

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Assem {
   function add(uint a, uint b) public pure returns (uint) {
        //assembly内不需要写分号
        //进行a+b, 然后把答案存入内存0x0, 最后从内存0x0获取值然后转换32进制并返回
        assembly { 
            let sum := add(a, b)
            mstore(0x0, sum)
            return(0x0, 32)
        }
    }

    function callMe(uint a) public pure returns (uint) {
        bytes4 sig = bytes4(keccak256("callMe(uint)"));
            assembly {
                mstore(0x0, sig)
                let dataAddress := add(0x0, 4)
                mstore(dataAddress, a)
                return(dataAddress,32)
            }
    } 
}

Loading

Facebook评论