以太坊101:走进EVM

栏目: IT技术 · 发布时间: 4年前

内容简介:本文将聚焦于EVM,但我们不会做太多详细的介绍。EVM是图灵完备的以太坊虚拟机,可以完成以太坊网络上的所有交易处理。与此同时,它还是一个完整的256位虚拟机,用于执行任意EVM字节码。本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

本文将聚焦于EVM,但我们不会做太多详细的介绍。EVM是图灵完备的以太坊虚拟机,可以完成以太坊网络上的所有交易处理。与此同时,它还是一个完整的256位虚拟机,用于执行任意EVM字节码。

快速概览

EVM**是以太坊的一部分,其用于处理智能合约的部署和执行。实际上,从一个EOA到另一个EOA的简单的价值转移交易并不需要EVM,但是其他所有事情都将涉及由EVM计算的状态更新。从更高的角度来看,以太坊区块链上运行的EVM可以被视为全球去中心化计算机,其中包含数百万个可执行对象,每个对象都有自己的永久数据存储。

——Andreas Antonopoulos**和Gavin Wood博士《掌握以太坊》

本文将聚焦于EVM,但我们不会做太多详细的介绍。EVM是图灵完备的以太坊虚拟机,可以完成以太坊网络上的所有交易处理。与此同时,它还是一个完整的256位虚拟机,用于执行任意EVM字节码。

字节码

字节码是高级智能合约语言被编译成的机器代码,它看起来像这样(以下省略大量数字): 以太坊101:走进EVM

这些代码并不能被人类理解。如果你有空闲时间,可以对其进行反向工程,你会发现针对字节码进行反向工程的意义并不大。此外,如果你没有合约的高级源代码和应用程序二进制接口(ABI),那么你不应该与区块链上的合约进行交互。

部署与运行字节码

上面展示了我们之前在关于智能合约的文章中部署的HelloWorld.sol Solidity智能合约的部署字节码。部署字节码是包装在辅助代码中的运行字节码,以帮助合约成功部署。合约部署成功后,运行字节码将单独驻留在其新的合约地址中。

EVM****程序集

Solidity编译器可以以人类可读的格式打印出HelloWorld.sol合约的EVM程序集:

/ "HelloWorld.sol":109:871 contract HelloWorld //定义合约....../ mstore(0x40, 0x80) /"HelloWorld.sol":231:395constructor() // 构造函数,可选,在部署时执行一次,无法再次调用....../callvalue / "--CODEGEN--":8:17 / dup1/ "--CODEGEN--":5:7 / iszero tag_1 jumpi/ "--CODEGEN--":30:31 / 0x00/ "--CODEGEN--":27:28 / dup1 / "--CODEGEN--":20:32 /revert / "--CODEGEN--":5:7 / tag_1:/ "HelloWorld.sol":231:395 constructor() // 构造函数,可选,在部署时执行一次,无法再次调用....../ pop / "HelloWorld.sol":362:388 greeting ="Hello, World." / 0x40 dup1 mload swap1 dup2 add 0x40 mstoredup1 0x0d dup2 mstore 0x20 add 0x48656c6c6f2c20576f726c642e00000000000000000000000000000000000000dup2 mstore pop /"HelloWorld.sol":362:370 greeting / 0x00/ "HelloWorld.sol":362:388 greeting = "Hello,World." / swap1 dup1 mload swap1 0x20 add swap1 tag_4 swap3 swap2swap1 tag_5 jump // in tag_4: pop /"HelloWorld.sol":109:871 contractHelloWorld // defining the contract... / jump(tag_6) tag_5: dup3 dup1sload 0x01 dup2 0x01 and iszero 0x0100 mul sub and 0x02 swap1 div swap1 0x00mstore keccak256(0x00, 0x20) swap1 0x1f add 0x20 swap1 div dup2 add swap3 dup30x1f lt tag_8 jumpi dup1 mload not(0xff) and dup4 dup1 add or dup6 sstorejump(tag_7)

-------------------------------分割线------------------------------- 以太坊101:走进EVM

这个EVM程序集被截断了。它实际上很长。这比原始字节码更容易解释。

EVM****指令集快速入门

指令集包含许多我们称之为操作码的操作。每个操作码都是一个计算步骤,需要花费特定的gas成本。举个例子:某些操作码的gas成本为0,比如跟停止执行相关的操作码。例如,0x00 STOP操作码停止执行的gas成本为0;终止交易的操作码通常不消耗任何gas费用。其他一些会强制EVM终止事务的操作码是无效操作码,无效的跳转目标(EVM仅在落在有效的跳转目标上时才能够跳转到任意位置)以及栈下溢。

关于EVM性能的说明

在主网中,EVM执行字节码的速度通常比其他虚拟机慢。这么做的原因是,每个操作都必须由网络中的每一个完整节点执行,以实现无需信任的环境。这是设计使然,EVM旨在实现整个网络的去中心化共识。因此,与中心化网络相比,EVM计算速度较慢且成本较高。但其好处在于,以太坊网络几乎具有不变性,大大提高了容错能力,并且停机时间为零。

此外,EVM的gas计量机制可确保矿工将交易包括在区块中,从而获得奖励。这种计量机制还可以防止程序永远循环。因为到最后,交易一旦超过其gas限制,其将立即停止并回滚所有沙盒性质的状态更改。交易失败所导致的唯一状态变化是发送方的随机数增加1,而直到交易失败为止的所有gas成本将全部支付给矿工。

补充阅读

EVM是一个应该详细讨论的主题。但我们不再赘述,因为本文的目的是向用户简单介绍EVM的内部机制。如果你对这一主题感兴趣,那么我们建议你从下述《以太坊虚拟机(EVM)终极列表》开始了解:

https://github.com/ethereum/wiki/wiki/Ethereum-Virtual-Machine-(EVM)-Awesome-List

本文翻译:Jacky

本文校对:Jacky/Vivian

原文作者:Wil

原文链接:

https://kauri.io/ethereum-101-part-7-the-evm/a7ac47d26eab4ce899a865619122d42e/a

快速概览

*EVM* 是以太坊的一部分,其用于处理智能合约的部署和执行。实际上,从一个EOA到另一个EOA的简单的价值转移交易并不需要EVM,但是其他所有事情都将涉及由EVM计算的状态更新。从更高的角度来看,以太坊区块链上运行的EVM可以被视为全球去中心化计算机,其中包含数百万个可执行对象,每个对象都有自己的永久数据存储。

*——Andreas Antonopoulos* 和Gavin Wood博士《掌握以太坊》

本文将聚焦于EVM,但我们不会做太多详细的介绍。EVM是图灵完备的以太坊虚拟机,可以完成以太坊网络上的所有交易处理。与此同时,它还是一个完整的256位虚拟机,用于执行任意EVM字节码。

字节码

字节码是高级智能合约语言被编译成的机器代码,它看起来像这样(以下省略大量数字): 以太坊101:走进EVM

这些代码并不能被人类理解。如果你有空闲时间,可以对其进行反向工程,你会发现针对字节码进行反向工程的意义并不大。此外,如果你没有合约的高级源代码和应用程序二进制接口(ABI),那么你不应该与区块链上的合约进行交互。

部署与运行字节码

上面展示了我们之前在关于智能合约的文章中部署的HelloWorld.sol Solidity智能合约的部署字节码。部署字节码是包装在辅助代码中的运行字节码,以帮助合约成功部署。合约部署成功后,运行字节码将单独驻留在其新的合约地址中。

EVM**程序集**

Solidity编译器可以以人类可读的格式打印出HelloWorld.sol合约的EVM程序集:

/ "HelloWorld.sol":109:871 contract HelloWorld //定义合约....../ mstore(0x40, 0x80) /"HelloWorld.sol":231:395constructor() // 构造函数,可选,在部署时执行一次,无法再次调用....../callvalue / "--CODEGEN--":8:17 / dup1/ "--CODEGEN--":5:7 / iszero tag_1 jumpi/ "--CODEGEN--":30:31 / 0x00/ "--CODEGEN--":27:28 / dup1 / "--CODEGEN--":20:32 /revert / "--CODEGEN--":5:7 / tag_1:/ "HelloWorld.sol":231:395 constructor() // 构造函数,可选,在部署时执行一次,无法再次调用....../ pop / "HelloWorld.sol":362:388 greeting ="Hello, World." / 0x40 dup1 mload swap1 dup2 add 0x40 mstoredup1 0x0d dup2 mstore 0x20 add 0x48656c6c6f2c20576f726c642e00000000000000000000000000000000000000dup2 mstore pop /"HelloWorld.sol":362:370 greeting / 0x00/ "HelloWorld.sol":362:388 greeting = "Hello,World." / swap1 dup1 mload swap1 0x20 add swap1 tag_4 swap3 swap2swap1 tag_5 jump // in tag_4: pop /"HelloWorld.sol":109:871 contractHelloWorld // defining the contract... / jump(tag_6) tag_5: dup3 dup1sload 0x01 dup2 0x01 and iszero 0x0100 mul sub and 0x02 swap1 div swap1 0x00mstore keccak256(0x00, 0x20) swap1 0x1f add 0x20 swap1 div dup2 add swap3 dup30x1f lt tag_8 jumpi dup1 mload not(0xff) and dup4 dup1 add or dup6 sstorejump(tag_7)

-------------------------------分割线------------------------------- 以太坊101:走进EVM

这个EVM程序集被截断了。它实际上很长。这比原始字节码更容易解释。

EVM**指令集快速入门**

指令集包含许多我们称之为操作码的操作。每个操作码都是一个计算步骤,需要花费特定的gas成本。举个例子:某些操作码的gas成本为0,比如跟停止执行相关的操作码。例如,0x00 STOP操作码停止执行的gas成本为0;终止交易的操作码通常不消耗任何gas费用。其他一些会强制EVM终止事务的操作码是无效操作码,无效的跳转目标(EVM仅在落在有效的跳转目标上时才能够跳转到任意位置)以及栈下溢。

关于EVM性能的说明

在主网中,EVM执行字节码的速度通常比其他虚拟机慢。这么做的原因是,每个操作都必须由网络中的每一个完整节点执行,以实现无需信任的环境。这是设计使然,EVM旨在实现整个网络的去中心化共识。因此,与中心化网络相比,EVM计算速度较慢且成本较高。但其好处在于,以太坊网络几乎具有不变性,大大提高了容错能力,并且停机时间为零。

此外,EVM的gas计量机制可确保矿工将交易包括在区块中,从而获得奖励。这种计量机制还可以防止程序永远循环。因为到最后,交易一旦超过其gas限制,其将立即停止并回滚所有沙盒性质的状态更改。交易失败所导致的唯一状态变化是发送方的随机数增加1,而直到交易失败为止的所有gas成本将全部支付给矿工。

补充阅读

EVM是一个应该详细讨论的主题。但我们不再赘述,因为本文的目的是向用户简单介绍EVM的内部机制。如果你对这一主题感兴趣,那么我们建议你从下述《以太坊虚拟机(EVM)终极列表》开始了解:

https://github.com/ethereum/wiki/wiki/Ethereum-Virtual-Machine-(EVM)-Awesome-List

本文翻译:Jacky

本文校对:Jacky/Vivian

原文作者:Wil

原文链接:

https://kauri.io/ethereum-101-part-7-the-evm/a7ac47d26eab4ce899a865619122d42e/a

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 10分钟前
  • 阅读 ( 4 )
  • 学分 ( 0 )
  • 分类:以太坊

以上所述就是小编给大家介绍的《以太坊101:走进EVM》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程之美

编程之美

《编程之美》小组 编 / 电子工业出版社 / 2008-3 / 40.00元

这本书收集了约60道算法和程序设计题目,这些题目大部分在近年的笔试、面试中出现过,或者是被微软员工热烈讨论过。作者试图从书中各种有趣的问题出发,引导读者发现问题,分析问题,解决问题,寻找更优的解法。本书的内容分为下面几个部分: (1)游戏之乐:从游戏和其他有趣问题出发,化繁为简,分析总结。 (2)数字之魅:编程的过程实际上就是和数字及字符打交道的过程。这一部分收集了一些好玩的对数字进行......一起来看看 《编程之美》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具