技术咖 | 以太坊虚拟机原理简析

作者:infiny  时间:2019-11-04  分类:以太坊(Ethereum)教程  

  点击蓝字关注我们

  以太坊虚拟机(EVM)是以太坊区块链中的重要概念,也是其智能合约实现的重要组成模块。学习EVM有助于开发者加深对智能合约实现的理解,也有助于开发者学习使用汇编语言(Assembly)来对智能合约进行更精细和更复杂的操作,甚至实现Solidity语言原本无法实现的功能。本篇文章将简要概述用Solidity编写的智能合约如何被编译成字节码以及EVM如何对字节码进行执行和运算。

  以太坊虚拟机(EVM)是智能合约的执行时环境,它是完全孤立的沙盒:运行在EVM中的代码无法访问网络、文件系统或其他进程。

  创建智能合约

  智能合约通常使用高级语言Solidity来进行编写,其代码风格类似JavaScript与C 。

  Solidity智能合约示例

  其他语言例如Vyper和Bamboo也可以用来编写智能合约。当创建一个智能合约时,包含数据信息(payload)的交易被发送至空地址时,其数据信息将作为输入在EVM中执行,其输出将作为代码永久地保存在合约地址中。需要注意的是:Solidity这样的高级语言是无法在EVM中被直接执行的,代码会被编译成更加接近机器的低级语言—操作码(opcode)来执行。

  EVM与操作码(Opcode)

  EVM是基于栈的虚拟机,为了方便计算,EVM定义了以32个字节为一个词(word)进行操作,栈中最多存储1024个词。

  Solidity加法函数

  在执行上图的加法运算时,EVM的实际流程是:

  1. PUSH b, 将b推入栈

  2. PUSH a, 将a推入栈

  3. ADD, 栈顶两列相加

  上述的PUSH,ADD称为操作码(opcode),是虚拟机可以直接执行的指令,目前EVM定义了大约140个操作码,几乎可以完成所有的计算(图灵完备)。操作码可以简单地分为以下几类:

  § 栈操作码(POP, PUSH, DUP, SWAP)

  § 算术/比较/位运算操作码(ADD, SUB, GT, LT, AND, OR)

  § 环境操作码(CALLER, CALLVALUE, NUMBER)

  § 内存操作码(MLOAD, MSTORE)

  § 硬盘操作码(SLOAD, SSTORE)

  § 终止操作码(STOP, RETURN, REVERT, INVALID. SELEFDESTRUCT)

  字节码(Bytecode)

  为了方便存储操作码,EVM采用字节码(Bytecode)来对操作码进行标记。一个字节等于两位16进制数,因此最多存储256个操作码。

  EVM字节码-操作码参照图

  EVM执行时,字节码将按照字节(即每两位16进制数)划分执行。字节0x60-0x7f(PUSH1 – PUSH32)是特殊的字节,该字节后的字节数将作为输入压入栈中。

  下面来看一组字节码的实际执行步骤:0x6002600101

  1. 0x60是特殊的字节码(PUSH1),它取之后的一个字节0x02作为输入。

  因此0x6002在EVM中是PUSH1 0x02

  2. 同理0x60是特殊的字节码(PUSH1),它取之后的一个字节0x01作为输入。

  因此0x6001在EVM中是PUSH1 0x01

  3. 0x01对应直接码ADD 

  因此,上述的字节码在EVM中是对2和1进行求和运算,它先后将0x02和0x01压入栈中,再将栈顶的2个数字弹出栈进行相加,最后将结果0x03压入栈中。

  结语:

  本文简单介绍了EVM的执行原理:以Solidity编写的智能合约将被编译成字节码在EVM中执行,在下一节我们将对智能合约的存储结构和字节码进行更加详细地解析。

   福 / 利

  为回馈广大客户一直以来的支持与信任,Infiny现推出重大福利!!!

  凡新老客户,只要关注本公众号,即可获得一次免费的法律咨询机会,Infiny法务总监将亲自在线为您解答!机会难得,不要错过~

  参与方式:

  关注公众号,转发本篇推文至朋友圈➡添加Garret微信好友 ➡ 将关注本公众号的截图发至Garret

  Infiny法务总监将在24小时之内,为您服务!

  往期精选

  英非尼学院 | 区块链课堂第一期:区块链征途即将启航,准备好上车了吗?

  区块链爆红!除了比特币,你还应该知道它!

  人物 | 烦嚣城中的一抹沉香

  Infiny,新加坡一站式咨询服务领导企业!

  英非尼学院 | 第一期:蓝海战略详解及案例分析

  移民新加坡,看这篇就够了!

  若有更多问题,欢迎联系我们~

  (Infiny法务总监Garrett)

  注册公司 | 基金会 | 法律合规 | 秘书服务

  证券通证 | 实用通证 | 白皮书 | 市值管理

  量化交易 | 社交媒体 | 社群 | 市场营运

  海外PR | 交易所链接 | 技术支持

  智能合约 | 培训

  扫码关注我们

  微信号 : infiny

  新浪微博:@infiny

版权信息
作者:infiny
来源:Infiny

关于我们

联系我们

作者进驻

公众号

Copyright © 2013 比特巴 www.btb8.com
只为您提供客观公正有用的比特币 区块链 加密数字货币新闻、技术教程、行情分析、行业人物资讯
手机版