智能合约基础语言(十)——Solidity内联汇编
一、目录
☞概念
☞语法
☞操作码
☞字面量
☞函数风格
☞访问外部函数与变量
☞标签
☞定义局部变量
☞赋值
☞Switch
☞循环
☞函数
☞内联汇编中注意事项
☞Solidity中的惯例
二、概念
通常我们通过库代码,来增强语言,实现一些精细化的控制,Solidity为我们提供了一种接近于EVM底层的语言,内联汇编,允许与Solidity结合使用。由于EVM是栈式的,所以有时定位栈比较麻烦,Solidty的内联汇编为我们提供了下述的特性,来解决手写底层代码带来的各种问题:
• 允许函数风格的操作码:mul(1, add(2, 3))等同于push1 3 push1 2 add push1 1 mul
• 内联局部变量:let x := add(2, 3) let y := mload(0x40) x := add(x, y)
• 可访问外部变量:function f(uint x) { assembly { x := sub(x, 1) } }
• 标签:let x := 10 repeat: x := sub(x, 1) jumpi(repeat, eq(x, 0))
• 循环:for { let i := 0 } lt(i, x) { i := add(i, 1) } { y := mul(2, y) }
• switch语句:switch x case 0 { y := mul(x, 2) } default { y := 0 }
• 函数调用:function f(x) -> y { switch x case 0 { y := 1 } default { y := mul(x, f(sub(x, 1))) } }
需要注意的是内联汇编是一种非常底层的方式来访问EVM虚拟机。他没有Solidity提供的多种安全机制。
2.1 示例
下面的例子提供了一个库函数来访问另一个合约,并把它写入到一个bytes变量中。有一些不能通过常规的Solidity语言完成,内联库可以用来在某些方面增强语言的能力。
内联汇编在当编译器没办法得到有效率的代码时非常有用。但需要留意的是内联汇编语言写起来是比较难的,因为编译器不会进行一些检查,所以你应该只在复杂的,且你知道你在做什么的事情上使用它。