深入了解EVM(以太坊虚拟机)的工作原理?

580 阅读6分钟

[

Subhash Das

](medium.com/@subhashdas…)

苏巴什-达斯

关注

6月9日

-

6分钟阅读

深入了解EVM(以太坊虚拟机)是如何工作的?

一篇关于EVM的通俗易懂的文章

照片:Michael FörtschonUnsplash

你可能听说过Ethereum虚拟机(EVM),但你和我一样觉得它有点吓人。以下是我试图向你解释EVM是什么以及它是如何工作的。

  1. 首先,了解什么是虚拟机是很重要的。在以太坊的背景下,虚拟机是一个内置于软件(以太坊客户端)中的程序,它重现了计算机的功能。
  2. 为了理解它是如何工作的,让我们通过以太坊验证器的视角,通过分解一些关键类别来看看它的用途。客户端、存储、交易和执行。
  3. 客户端。为了成为一个验证者并产生区块,运行EVM作为换算状态转换的手段是必要的。为了最好地理解什么是状态和状态转换,考虑到当你发送以太币时,这需要区块链的状态转换。
  4. 代币现在比以前属于一个新的账户,这需要反映在以太坊的谁拥有什么的地图上。为了做到这一点,验证者需要接受输入/交易,在EVM中运行各自的指令,并在区块头中打印输出。
  5. 验证者通过下载一个包含EVM程序的ETHEREUM客户端软件来运行EVM。一个以太坊客户端包含以太坊虚拟机以及其他必要的功能。
  • a) 内存池。准备纳入区块的签名交易的位置被存储。
  • b) JSON-RPC API。为处理向以太坊读/写数据的请求提供一个数据结构。

6.有许多不同类型的客户端以不同的语言运行,但它们可以相互操作,因为它们遵循Ethereum黄皮书中的相同规范。

7.7.存储。EVM如何在新交易之前存储状态?像计算机一样,虚拟计算机能够存储数据。在EVM的背景下,其关键功能之一是存储所有账户的 "状态 "以及这些账户存储的信息。

8.EVM根据一种叫做 "Merkle Patricia trie "的数据结构来存储状态,它能够包含以太坊上所有地址的所有键:值对。

9.9.密钥对应于公共和智能合约地址,它们各自的值代表这些地址的当前状态。

10.10.每个地址的值/状态本身就是地址各自代码的哈希值的编码,是账户存储的数据的哈希值,它的余额,以及它所进行的交易的数量。

11.11. Merkle Patricia trie被用来存储这些数据,因为它使所有键值对的哈希值容易执行,最终得到谁拥有什么的状态的单一 "Merkle根哈希值"--这是验证者提议的区块头中的必要字段。

12.由于哈希值的工作方式,即使区块链状态的微小变化也会导致完全不同的根哈希值。强制验证者在区块头中包括这个根哈希的原因是,它大大增强了网络的安全性。

13.这是因为它使没有空间存储这个Merkle Patricia trie的轻型节点,能够验证验证者试图扩散的区块的合法性。

14.轻节点可以用根哈希值、账户密钥和提议的全节点的余额值计算一个 "Merkle证明",并将其与自己的地址和余额的Merkle证明进行比较。如果有任何不正确的数据,Merkle证明中就不会有匹配。

15.交易。当用户通过钱包提交签名交易时,交易数据被编译成字节码,并使用上述的JSON-RPC API发送到一个节点。Bytecode是EVM读取的低级语言,用于计算状态转换。

16.Bytecode以二进制字符串的HEX编码出现。这些字节的集合代表特定的操作,被称为EVM将执行的操作码。

17.操作码是EVM遵循的指令,用来操作堆栈上的输入数据/交易(后面会详细介绍),作为改变状态的一种手段。HEX格式只是一个数字系统(像二进制和十进制系统),用于以可读的方式传达二进制。

18.操作码之所以重要,是因为在计算时,它们能使EVM找到事务所要求的状态转换的输出。

19.当发送到mempool时,字节码作为参数被传递到使用JSON-RPC API的节点mempool的事务广播中。此后,该事务与其他未确认的事务一起位于mempool中,准备被验证者纳入一个区块中。

20.当验证器挑选它想包含在一个区块中的交易时,它将不得不计算由每个交易的各自字节码所指示的操作/操作码所定义的状态转换。这就是EVM的核心功能--执行--的地方。

21.执行。存储所有账户的状态是EVM永久存储的数据,但EVM使用临时内存来执行操作码。为了理解这一点,有必要了解两种类型的临时内存--"堆栈 "和操作码执行时使用的 "内存"。

22.a) 堆栈是执行操作码定义的计算的数据区。 b) 内存是一个数据数组,可以用来临时存储信息,以通过堆栈顶部的指令计算所需的数据。

23.当事务被EVM通过mempool使用上述的客户进程访问时,EVM按照字节码指定的顺序接受指令,字节码被分离成各自的操作码。

24.24.操作码以堆叠的顺序被加载到数据区--每个操作码按照字节码指定的顺序落在另一个上面。

25.堆栈跟随堆栈顶部的指令,并利用在此过程中移动到内存中的数据/变量来计算堆栈顶部的指令。EVM也需要从存储中获取的状态信息来运行这些操作码。

26.当所有的操作码都被运行后,这意味着任何关于状态变化的输出都将被堆栈加载到永久存储中。值得注意的是,每个操作码都会导致对以太坊状态是什么的新计算,每个操作码都有特定的成本。

27.一旦每个操作码被运行,执行它所消耗的气体量将从用户最初提交交易时指定的可用气体中减去。

28.如果发送的气体不足以支付运行操作码的费用,验证人就不把交易列入区块,但用户不会得到退款,因为验证人已经产生了运行计算的费用。

29.一旦这个过程对验证者想要包含在区块中的mempool中的所有交易都完成了,验证者就可以计算上述新状态的根哈希值并将其包含在区块头中。

谢谢你阅读这么长的文章😊😊

如果你想阅读更多类似的文章,请关注我 并订阅新闻简报