【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)
}
}
}
Facebook评论