请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $10,869,439,887 总市值 : $130,719,185,162
2018
12/07
23:00
分享
评论
  • 深入Solidity的神秘世界2

    BLOCK COMMUNITY



    部署合约


    接下来,转到Remix中的Run部分。首先,确保您使用的是Javascript VM。这基本上是一个嵌入式Javascript EVM +网络,理想的以太坊训练场。确保在ComboBox中选择了BasicToken ,并在Deploy输入框中输入数字10000 。接下来,单击“ Deploy”按钮进行部署。这部署的是我们创建的BasicToken智能合约实例,最初提供的10000个token由当前在ComboBox帐户顶部选择的帐户拥有,该帐户会保留我们设置的所有token供应。


    在“ Run”选项卡的“Deployed Contracts”中,您可以看到已部署的智能合约,其中包含与合约进行交互的三个字段:transfer,balanceOf和totalSupply。在这里,我们能够与刚刚部署的智能合约实例进行交互。


    但在此之前,让我们来看看合同的“Deploy”(部署)究竟是什么意思:


    在页面底部的控制台区域中,你可以看到一条日志“creation of BasicToken pending ...”,然后是一个包含各种字段的事务条目:from,to,value,data,logs和hash。单击此条目以展开交易信息,你应该看到transaction的date、input,以及我们上面提到的字节码。所以,创建一个智能合约实例,其中会包含自己的地址和代码。


    我们将在下一篇文章中详细研究这transaction个过程。


    反汇编字节码


    在控制台中心,transaction框框的右侧,有个“ debug”(调试)按钮。点击这个按钮,你将激活Remix右侧区域中的Debugger选项。我们可以一起看看Instructions部分,如果向下滚动,应该是出现以下内容:

    000 PUSH1 80

    002 PUSH1 40

    004 MSTORE

    005 CALLVALUE

    006 DUP1

    007 ISZERO

    008 PUSH2 0010

    011 JUMPI

    012 PUSH1 00

    014 DUP1

    015 REVERT

    016 JUMPDEST

    017 POP

    018 PUSH1 40

    020 MLOAD

    021 PUSH1 20

    023 DUP1

    024 PUSH2 0217

    027 DUP4

    028 CODECOPY

    029 DUP2

    030 ADD

    031 PUSH1 40

    033 SWAP1

    034 DUP2

    035 MSTORE

    036 SWAP1

    037 MLOAD

    038 PUSH1 00

    040 DUP2

    041 DUP2

    042 SSTORE

    043 CALLER

    044 DUP2

    045 MSTORE

    046 PUSH1 01

    048 PUSH1 20

    050 MSTORE

    051 SWAP2

    ...(缩写)


    为了确保你前面的操作没有出错,你可以把你所操作的Remix编译器中看到的内容与上面进行比较。

    这其实就是合约的反汇编字节码。如果您按字节扫描原始字节码(一次两个字符),则EVM会识别与特定操作关联的特定操作码。例如:

    0x60 => PUSH

    0x01 => ADD

    0x02 => MUL

    0x00 => STOP

    ...

    反汇编的代码非常低级并且很难看懂,但是我们可以通过这种方式可以开始理解它。


    Opcode


    在解构智能合约代码开始之前,你将需要一个基本的工具集理解单个opcode,如PUSH,ADD,SWAP,DUP等的操作码,到最后,每个操作吗只能从EVM的堆栈,内存或属于合约的存储中压入一个项或消费一个项。


    要查看EVM可以处理的所有可用操作码,可以查看Pyethereum,上面显示了操作码列表。要了解每个操作码的工作原理,Solidity官方的汇编文档也是一个很好的参考。即使它不是与原始操作码一一对应,但是非常接近(它实际上是Yul,介于Solidity和EVM字节码之间的中间语言)。如果你能读懂技术文档,可以阅读以太坊黄皮书,其实归根结底都是上面的内容。


    虽然和大家推荐了这么多文档,现在从头到尾阅读这些资源没有什么意义,你只要记住有这么个资料就行,我们将在需要的时候使用到它们。


    指令


    上面反汇编代码中的每一行都是EVM执行的操作指令,每条指令都包含一个操作码,例如,让我们采用其中一条指令,指令88,将数字4推送到堆栈。这个特殊的反汇编程序解释说明如下:


    88 PUSH1 0x04

    | | |

    | | Hex value for push.

    | Opcode

    Instruction number


    尽管反汇编的代码能让我们更加理解底层的东西,但它还是让人摸不着头脑。我们需要一个能够解构所有问题的方法。


    策略


    何一开始看上去不可能完成的任务,其实都可以通过不断的拆解,分解成可以解决的任务,我们遇到的问题也不例外,面对这个问题,我所采取的策略就是“分而治之”。


    我们可以试图找到反汇编代码的分叉点,并逐渐分解,直到分解成很小的块,我们将在Remix的调试器中逐步完成。

    在下图中,我们可以看到我们对反汇编代码进行的第一次拆分(我将在下一篇文章中对其进行全面分析)。

    如果你不了解图表,也不要担心,你不用一开始就什么都会,我们的系列文章将会循序渐进的介绍。现在就跟着我们的节奏,不断深入你的豪车的内部结构吧。




    ·END·
     

    区块公社

    欢迎加入开发者社区

    与技术大咖一起成长

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

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

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

本版积分规则

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