请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $13,538,193,962 总市值 : $152,012,367,920
2018
12/13
22:31
分享
评论
  • 解构智能合约1

    BLOCK COMMUNITY



    我们正在解构一个简单的solidity智能合约的EVM字节码。


    今天,让我们开始用“分而治之”的策略来拆解智能合约的复杂代码吧。我在介绍性的前言中说过,这个反汇编的代码其实非常低级,但与原始字节码相比会比较易读。

    请确保已在遵循了我在前言中介绍的操作,把BasicToken的代码在remix编译器中进行了部署。


    当EVM执行代码时,是自上而下的顺序,代码中没有其他入口点,始终从顶部开始执行。JUMP和JUMPI可以让代码跳转。JUMP获取堆栈中的最上面的值,并将执行移动到该位置的指令。但是,目标位置必须包含JUMPDEST操作码,否则执行将失败。这样做的唯一目的是:


    JUMPDEST将位置标记为有效的跳转目标。JUMPI也完全相同,但堆栈的第二个位置一定不能有“0”,否则就没有跳转。所以这是一个有条件的跳转,STOP是让智能合约完全停止的指令,RETURN则是暂停智能合约的执行,但返回EVM内存的一部分数据,这很方便。


    所以,让我们开始解释代码时考虑到所有这些。在Remix的调试器中,将“ transaction”的滑块滑到最左边。你可以使用Step Into按钮(看起来像一个向下的小箭头)并按照说明进行操作。


    前面的指令可以忽略,直接到第11条指令,我们找到了第一条JUMPI。如果它没有跳转,它将继续通过指令12到15并最终进入REVERT,接着将停止执行。但如果跳转,它将跳过这些指令到位置16(十六进制0x0010,它在指令8被压入堆栈)。指令16是一个JUMPDEST。


    继续单步执行操作码,直到“ transaction”滑块一直向右。刚刚发生了很多等等,但只有在68的位置才能找到RETURN操作码(以及STOP指令69中的操作码,以防万一)。这很奇怪。如果您考虑一下,本智能合约的控制流程将始终在指令15或68结束。我们刚刚完成它并确定没有其他可能的流程,那么剩下的指令是什么?(如果您滑动“ 指令”面板,您将看到代码在位置566处结束)。


    我们刚刚遍历的指令集(0到69)就是所谓的合约的“创建代码”。它永远不会成为智能合约代码本身的一部分,但仅在创建智能合约的交易期间由EVM执行一次。我们很快就会发现,这段代码负责设置创建的合约的初始状态,以及返回其运行时代码的副本。剩下的497条指令(70到566),正如我们所见,执行流程永远不会达到的,正是这些代码将成为已部署智能合约的一部分。


    接下来,我们对代码进行第一次拆分:把创建时的代码与运行时的代码区分开。




    ·END·
     

    区块公社

    欢迎加入开发者社区

    与技术大咖一起成长

主题帖 166 关注 0 粉丝 0
情感指数

链路大数据分析置信度 18.6 %

TA的主题帖
主题相关
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表