10.13以太坊Solidity智能合约汇编集成开发2和web3.eth.subscribe详解

                                                 --1--

一、独立组装

上面描述为内联汇编的汇编语言也可以单独使用,实际上,计划是将它用作Solidity编译器的中间语言。在这种形式下,它试图实现几个目标:

  1. 编写的程序应该是可读的,即使代码是由Solidity的编译器生成的。
  2. 从汇编到字节码的转换应包含尽可能少的“惊喜”。
  3. 控制流应易于检测,以帮助进行形式验证和优化。

为了实现第一个和最后一个目标,装配提供了高层次的结构,如for循环,if和switch语句和函数调用。它应该能够编写汇编程序不使用明确的SWAP,DUP, JUMP和JUMPI语句,因为前两个模糊的数据流和最后两个模糊处理的控制流。此外,表单的函数语句优于纯操作码语句, 因为在第一种形式中,更容易看出哪个操作数用于哪个操作码。mul(add(x, y), 7)7 y x add mul

第二个目标是通过以非常规则的方式将更高级别的构造编译为字节码来实现的。汇编程序执行的唯一非本地操作是用户定义标识符(函数,变量,…)的名称查找,它遵循非常简单和常规的作用域规则以及从堆栈中清除局部变量。

范围:声明的标识符(标签,变量,函数,汇编)仅在声明它的块中可见(包括当前块内的嵌套块)。跨越函数边界访问局部变量是不合法的,即使它们在范围内也是如此。不允许隐藏。在声明局部变量之前无法访问它们,但函数和程序集可以。程序集是特殊块,用于返回运行时代码或创建合约。在子装配中看不到外部装配的标识符。

如果控制流经过块的末尾,则插入与该块中声明的局部变量数匹配的弹出指令。每当引用局部变量时,代码生成器需要知道其在堆栈中的当前相对位置,因此需要跟踪当前所谓的堆栈高度。由于在块的末尾删除了所有局部变量,因此块之前和之后的堆栈高度应该相同。如果不是这种情况,则编译失败。

使用switch,for和功能,它应该有可能编写复杂的代码,而无需使用jump或jumpi手动。这使得分析控制流程变得更加容易,从而可以改进形式验证和优化。
此外,如果允许手动跳转,则计算堆栈高度相当复杂。需要知道堆栈上所有局部变量的位置,否则既不能引用局部变量也不会自动从块末尾的堆栈中删除局部变量。
例:

我们将遵循从Solidity到汇编的示例编译。我们考虑以下Solidity程序的运行时字节码:
pragma solidity >=0.4.16 <0.6.0;

contract C {
function f(uint x) public pure returns (uint y) {
y = 1;
for (uint i = 0; i < x; i++)
y = 2 * y;
}
}

将生成以下程序集:
{
mstore(0x40, 0x80) // 存储“自由内存指针”
// 函数调度器
switch div(calldataload(0), exp(2, 226))
case 0xb3de648b {
let r := f(calldataload(4))
let ret := $allocate(0x20)
mstore(ret, r)
return(ret, 0x20)
}
default { revert(0, 0) }
// 内存分配器
function $allocate(size) -> pos {
pos := mload(0x40)
mstore(0x40, add(pos, size))
}
// 合约函数
function f(x) -> y {
y := 1
for { let i := 0 } lt(i, x) { i := add(i, 1) } {
y := mul(2, y)
}
}
}

二、汇编语法
解析器的任务如下:
• 将字节流转换为令牌流,丢弃C ++样式的注释(源引用存在特殊注释,但我们不在此解释)。
• 根据下面的语法将令牌流转换为AST
• 使用它们定义的块(AST节点的注释)注册标识符,并

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值