26

以太坊101:走进EVM

 4 years ago
source link: https://learnblockchain.cn/article/1229
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

快速概览

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

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

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

字节码

字节码是高级智能合约语言被编译成的机器代码,它看起来像这样(以下省略大量数字): iIVVRfn.jpg!web

这些代码并不能被人类理解。如果你有空闲时间,可以对其进行反向工程,你会发现针对字节码进行反向工程的意义并不大。此外,如果你没有合约的高级源代码和应用程序二进制接口(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)

-------------------------------分割线------------------------------- UbmaQrz.jpg!web

这个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字节码。

字节码

字节码是高级智能合约语言被编译成的机器代码,它看起来像这样(以下省略大量数字): iIVVRfn.jpg!web

这些代码并不能被人类理解。如果你有空闲时间,可以对其进行反向工程,你会发现针对字节码进行反向工程的意义并不大。此外,如果你没有合约的高级源代码和应用程序二进制接口(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)

-------------------------------分割线------------------------------- UbmaQrz.jpg!web

这个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 )
  • 分类:以太坊

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK