Solidity汇编教程汇编教程
在用Solidity开发以太坊智能合约时,使用汇编可以直接与EVM交互,降低gas开销成本,更精细的控制智能合约的行为,因
此值得Solidity开发者学习并加以利用。本文是Solidity汇编开发的简明教程,旨在帮助你快速熟悉如何在Solidity智能合约代码
中嵌入汇编代码。
以太坊教程链接:Dapp入门 | 电商Dapp实战 | Token实战 | Php对接 | Java对接 | Python对接 | C#对接 | Dart对接
2、以太坊虚拟机和堆栈结构机器、以太坊虚拟机和堆栈结构机器
以太坊虚拟机EVM有自己的指令集,该指令集中目前包含了144个操作码,详情参考Geth源代码
这些指令是Solidity抽象出来的,可以在Solidity内联使用。例如:
contract Assembler {
function do_something_cpu() public {
assembly {
// start writing evm assembler language
}
}
}
EVM是一个栈虚拟机,栈这种数据结构只允许两个操作:压入(PUSH)或弹出(POP)数据。最后压入的数据位于栈顶,
因此将被第一个弹出,这被称为后进先出(LIFO:Last In, First Out):
栈虚拟机将所有的操作数保存在栈上,关于栈虚拟机的详细信息可以参考stack machine 基础
3、堆栈结构机器的操作码、堆栈结构机器的操作码
为了能够解决实际问题,栈结构机器需要实现一些额外的指令,例如ADD、SUBSTRACT等等。指令执行时通常会先从堆栈
弹出一个或多个值作为参数,再将执行结果压回堆栈。这通常被称为逆波兰表示法(RPN:Reverse Polish Notation):
a + b // 标准表示法Infix
a b add // 逆波兰表示法RPN
4、在、在Solidity合约中使用内联汇编合约中使用内联汇编
可以在Solidity中使用assembly{}来嵌入汇编代码段,这被称为内联汇编:
assembly {
// some assembly code here
}
在assembly块内的代码开发语言被称为Yul,为了简化我们称其为汇编或EVM汇编。
另一个需要注意的问题时,汇编代码块之间不能通信,也就是说在一个汇编代码块里定义的变量,在另一个汇编代码块中不可
以访问。例如:
assembly {
let x := 2
}
assembly {
let y := x // Error
}
上面的代码编译时会报如下错误:
评论0