EVM 第一部分:以太坊虚拟机基础知识

本文详细介绍了以太坊虚拟机(EVM),EVM可以理解为是一种隔离环境,专门用于处理智能合约交易,以及确定每个新挖出的区块的以太坊区块链的总体状态。文章从EVM的虚拟机器、状态机器、准图灵完备机器三个角度,由浅入深地介绍了EVM的原理、架构和工作机制,为读者构建了EVM的完整知识体系。

100 字解读 EVM

以太坊虚拟机可以简单地理解为一个隔离环境,专门用于处理智能合约交易,以及最重要的是,确定每个新挖出的区块的 以太坊区块链的整体状态

将 EVM 想象成一台计算机,专门处理智能合约交易,并定义以太坊区块链中区块到区块的状态变化规则。

然而,与物理计算机不同,EVM 是一台虚拟机,不受单一操作系统或位置的限制,因此允许任何愿意运行以太坊节点的人进行全局访问。


好了,这就是 EVM 的精确 100 字解释。去吧,数数看 😃

让我们开始解读 EVM

现在是时候更深入地了解 EVM 了。

如果你以前尝试过理解和阅读有关 EVM 的内容,你可能遇到过定义 EVM 的不同方式。例如:

  • EVM 是虚拟机…
  • EVM 是状态机…
  • EVM 是准图灵完备机…

我认为有效理解 EVM 的最佳方式是解读关于 EVM 的每个陈述。

那么,让我们开始吧

EVM 作为虚拟机...

首先,让我们从 EVM 的 VM(虚拟机)部分开始。

让我们回到过去,忘记以太坊,甚至忘记虚拟机。

让我们谈谈物理机。

物理机可以简单地理解为在你的计算机上运行的硬件,如 x86、ARM,或者,也许你最喜欢的,新的 Apple M1。重要的是要注意,对于物理机来说,最低级别的指令是二进制。基本上只有 0 和 1。

物理机基于它们对这些二进制操作码指令本身的解释来执行操作。

现在,虚拟机与物理机非常相似,因为它们也有操作码来执行特定任务。你可能知道的一些虚拟机是 JVM、LLVM 等。

然而,一个关键的区别是,尽管这些虚拟机与物理机非常相似,但它们不与任何物理硬件绑定。

这意味着虚拟机提供了一个运行时环境,但完全与平台无关。它允许跨各种系统的兼容性,而不管底层硬件如何。

好了,既然我们了解了 VM,那么掌握以太坊虚拟机并不难。

EVM 是一台虚拟机,这意味着它可以在多个硬件上运行,而不管底层平台/操作系统如何。这非常关键,因为它在实现去中心化方面发挥着重要作用,因为我们可以在我们想要的任意数量的平台上运行 EVM。

事实上,EVM 使以太坊如此有趣并且 有点 具有革命性,因为我们现在有能力在区块链上执行任何任意代码。

在 EVM 时代之前,这将是一场噩梦,因为每次要构建具有特定用例的新应用程序时,都必须创建一个具有自定义逻辑的新区块链。

因此, EVM 是一台虚拟机,它 为我们提供了一个完全虚拟的运行时执行环境,用于处理智能合约交易,并且具有全局可访问性,任何拥有任何硬件的人都可以轻松运行这台虚拟机。

EVM 作为状态机...

正如先前在 100 字 EVM 简介中 讨论的那样,EVM 的一个重要目标是确定以太坊区块链的状态,因此是 状态机。

但状态机到底是什么?

状态机,用非常简单的术语来说,是一种专门用于存储状态以及定义特定系统状态变化规则的设备。

它可以根据提供给它的输入将状态从一个状态更改(转换)到另一个状态。见

现在,考虑到以太坊的世界,状态 是指一个广泛的数据结构,它保存所有帐户,即外部拥有的帐户 (EOA) 或合约帐户(稍后详细介绍),通过哈希链接在一起。

换句话说,以太坊区块链上的每个细节,即 你持有的 ERC20 代币数量,治理提案及其投票数,NFT 所有权 等,在技术上都是网络上的不同状态。这些状态可以简化为单个根哈希,或者我们称之为 世界状态。

以太坊的这个世界状态基本上代表了整个区块链的当前状态,它包括所有历史状态,这些状态共同构成当前的这个状态哈希。

现在重要的是要注意,即使任何帐户(EOA 或合约帐户)发生最轻微的更改,也会导致世界状态的更改/转换。这意味着每笔被挖掘的交易,无论是你的 NFT 所有权变更还是正在执行的治理提案, 都会导致链的整体状态发生变化。在此文章中详细了解以太坊的世界状态在这个文章里

简而言之,每个成功执行的交易,无论大小,都会导致以太坊状态的改变。

而这一切之所以成为可能,是因为 EVM 充当状态机。

那么,为什么这很重要?

EVM 作为一个状态机在使以太坊区块链如此有效方面发挥着重要作用。

如果我们快速浏览一下 比特币区块链,我们会发现它是一个分布式账本,其状态转换非常严格。比特币区块链上的交易会导致全局状态转换,主要跟踪或记录原生货币(BTC)的所有权。

另一方面,以太坊作为一个分布式状态机,提供的远不止这些。

它不仅可以简单地记录货币所有权状态,还可以响应任意智能合约输入数据而转换为新状态。

这非常重要,因为状态转换中的这种灵活性使我们能够使用智能合约创建自定义货币(ERC-20 代币)、NFT、复杂的 Defi 协议,甚至完整的 DAO。

EVM 作为准图灵完备机...

好了,所以按照我们通常的方法,让我们忘记以太坊或 EVM,只关注 -图灵完备部分。

实际上,只关注 图灵完备 部分。

图灵完备是指能够运行程序的机器,该程序可以回答/解决任何计算问题,而不管完成该问题所需的时间或内存如何。

换句话说 👇

例如,C、C++ 或 Java 等语言是图灵完备系统。

那么,现在出现了一个显而易见的问题 - 以太坊区块链可以被认为是图灵完备系统吗?

嗯,是的。(但请阅读全部内容,这里有一个陷阱

它是图灵完备的,因为它可以执行类似于图灵机的任何程序,并且可以读取以及将数据写入存储器。事实上,图灵完备性在允许以太坊通过智能合约运行任意逻辑方面发挥着重要作用,这是其他区块链无法做到的。

但是,以太坊的图灵完备性存在一个不容忽视的警告。陷阱来了。

如果你回想起图灵机系统的性质,它们基本上可以 永远运行 并且 使用无限内存。

然而,在以太坊的世界里,我们不能真正拥有永远运行或使用无限内存的程序。

虽然常规计算机可以简单地 停止 这种无限运行的程序,但我们无法对以太坊执行相同的操作,因为它是一个全球计算机(和一个分布式账本),必须始终可访问/在线。

现在,为了避免以太坊中的 停止 问题,它在任何智能合约执行的计算步骤中都包含一种特定的限制。它使用 Gas 的概念来强制执行此限制。

查看这篇文章Consensys 的文章,以了解有关以太坊中 Gas 的基本原理的更多信息。

这意味着 EVM 会跟踪要执行的每条指令,并为交易中使用的每次计算或存储收取特定数量的 Gas 费以 ETH 为单位)。换句话说,如果你耗尽了 gas(基本上是钱),你将无法再执行交易,从而解决了无限运行的交易/计算问题。

简而言之,以太坊确实是一个图灵完备的系统。但是,它确实使用 gas 施加了限制,这实际上不允许该系统包括永远运行的计算或使用无限存储的计算。

因此,虽然 EVM 并不完全属于图灵完备系统的范畴,但我们称之为 准图灵完备系统。


了解 EVM 和以太坊的关键组件

EVM 可以被认为是一个具有简单基于堆栈的架构的机器。

为了有效地理解 EVM 的工作机制,我们必须了解它的一些最关键的组成部分及其职责。

但是,在深入研究 EVM 组件之前,我认为重要的是了解以太坊区块链的一些基本概念。

快速回顾基础知识

好了,现在我们了解了以太坊区块链的基本主题,我们都准备好深入了解一些关键的 EVM 组件的要点。


EVM 架构及其组件

存储

首先,存储 可以看作是计算机的硬盘驱动器,用于永久存储数据。

存储 可以简单地理解为 EVM 的永久存储。写入存储的任何值即使在执行完成后也会被保留。

简单来说,存储基本上是一个键值存储系统,它将 32 字节的槽映射到 32 字节的值。

必须注意的是,由于 存储 永久保存数据,因此它会消耗更多的 gas,因此在你的智能合约中使用起来成本更高。

内存

虽然 EVM 存储类似于硬盘驱动器,但内存更像是计算机的 RAM,一种临时数据持有者。

EVM 内存实际上不是持久的,并且在函数执行完成后立即被擦除。

存储 不同,智能合约中的内存使用相对来说是一种廉价的操作,消耗的 gas 更少。但是,必须记住,随着函数中内存使用量的增加,使用内存的成本可能会增加。

Calldata:

Calldata 是 EVM 的一个有趣的部分,同样非常重要。

它是 EVM 的一个非常特殊的数据位置,指的是存储要调用的函数的输入参数或参数的位置。

与内存非常相似,calldata 也是一个非持久的数据持有者,在执行交易后会被清除。

Calldata 相当便宜,消耗的 gas 非常少。

还应该注意的是,它永远无法写入,因为它是 只读的。

堆栈

堆栈是 EVM 中最重要的组件。

EVM 在技术上是一台 堆栈机器,因为它在 EVM 中执行的每个计算或操作中都起着重要作用。EVM 堆栈 总共最多可以容纳 1024 个值,可以包含 256 位的字

它主要用于存储智能合约指令输入和输出。

程序计数器

EVM 中的程序计数器指示代码中应该由 EVM 读取和执行的特定指令。

该计数器基本上允许 EVM 逐步执行整个合约 代码,并 解释和执行特定指令 以达到期望的结果/状态。

在任何交易执行的最开始,程序计数器都设置为

EVM 是如何工作的?

好了,现在我们已经掌握了以太坊虚拟机的核心基础知识及其组件,现在是时候将所有这些组合在一起,了解 EVM 的工作原理了。

注意: 这只是对 EVM 工作原理的概括性描述。在本系列的下一篇文章中,我们将深入研究有关 EVM 的许多技术性、深入和有趣的细节。

在深入研究 EVM 的工作机制之前…

如果你还记得文章的 100 字 EVM 部分的第一行,它说 - 以太坊虚拟机专门用于处理智能合约交易。

虽然这是事实,但也应该牢记,EVM 实际上无法直接执行 Solidity 智能合约。这是因为 EVM 实际上并不理解像 Solidity 这样的高级语言,因此无法直接解释或执行它。

每个 Solidity 智能合约都被编译成称为 操作码 的低级机器指令,这些指令可以被 EVM 理解。

为了执行任何任务,无论是 将数据存储在状态变量中还是执行代币交换,EVM 都会使用这些 操作码。

目前大约有 140 个独特的总操作码,每个操作码都有一个特定的功能。我们将在本系列的下一篇文章中广泛阅读有关操作码的内容。

EVM 工作机制

首先,一切都始于 交易

以下是一个虚拟以太坊交易的示例。👇

{
  from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
  to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
  gasLimit: "21000",
  maxFeePerGas: "300",
  maxPriorityFeePerGas: "10",
  nonce: "0",
  value: "10000000000",
  data: "0xabcd",
}

让我们将此交易视为 EVM 即将执行的交易。

  1. EVM 实例化

每当交易触发智能合约代码的执行时,都会实例化一个包含所有必要信息的以太坊虚拟机 (EVM)。这些详细信息与当前正在创建的区块相关。

to”字段中的地址是要定位的合约的地址。此外,交易还包括所有其他关键细节,如 gas 限制以太币值 以及要在目标合约上执行的 数据

一旦实例化了 EVM,它基本上会准备好开始处理新的智能合约交易。

例如,此准备工作包括:

EVM 的程序计数器设置为零,从合约帐户加载存储,设置环境变量以及将内存初始化为零等。

然后,EVM 提取合约及其与交易中给定地址关联的代码。

这就是 程序计数器 的重要作用开始的地方。程序计数器现在帮助机器逐步执行整个代码,这允许 EVM 逐个解释和执行给定的指令。

一旦完成所有此类准备工作,从技术上讲,EVM 就可以开始执行指令(操作码),从而导致合约的预期状态更改。

2. Gas 供应和调整

虽然 EVM 现在已准备好开始处理这些操作码,但我们不能将 Gas 的概念排除在该等式之外。

正如前面在 EVM 作为准图灵完备机 部分讨论的那样,对于要执行的每个智能合约操作,必须以 gas 的形式支付交易费用。

当启动智能合约交易时,交易的发送者必须提供 一定数量的 gas 费以以太币的形式),他愿意为执行此交易而支付。

有趣的是,随着智能合约操作的执行,交易提供的 gas 供应会减少。

换句话说,如果发送者没有提供完成交易所需的足够 gas 供应,则供应最终会变为零,并且 EVM 会抛出 Out of Gas 异常错误。这会立即停止进一步执行交易。

如果发生此类事件,则会回滚整个交易,并且不会将任何更改包含在以太坊的状态中。

但是,发送者的以太币余额确实会减少,因为他/她必须为交易到目前为止消耗的 gas 付费。

Gas 也可以退还

某些交易还可以包括更高的 gas 限制,即发送者允许在其交易中消耗的 gas 量。

但是,如果提供的 gas 限制远高于交易中所需的 gas,EVM 只会将未使用的 gas 退还给发送者。

3. 处理交易和更改世界状态

好了,让我们假设上述交易既不会抛出任何 Out of gas 错误,也不会有任何可能导致其拒绝的逻辑错误。

从技术上讲,这意味着此交易可以由 EVM 成功处理,消耗所需的 gas 量,并导致不仅目标合约的状态发生预期变化,而且链的整个世界状态也发生预期变化。

合约调用合约

需要记住的一个有趣的要点是,智能合约也可以启动交易或调用其他智能合约。

EOA 发起给某个 合约 X 的交易也可能导致目标 合约 X 向其他 合约 Y 发起新交易,如果需要的话。

每个 对新合约的新调用都会创建一个类似的 EVM 实例化周期 和交易执行,最终导致所需的状态更改。

但是,应该注意的是,原始交易中的每个新智能合约交易都需要 gas 来充分执行该交易。

因此,新的 EVM 实例化高度依赖于为执行新交易剩余的 gas 量。如果随交易传递的 gas 不足以对新合约进行新调用,则该交易将完全恢复。

下图非常清楚地表示了此类交易。

总结

这使我们结束了 EVM 系列的第一部分。

请记住,这部分的核心目标是为以太坊虚拟机的基本知识和重要细节奠定坚实的基础。因此,我们准备好在下一个系列中更深入地研究其技术细节。

我们现在对以下内容有了非常清楚的认识:

EVM 基础知识。为什么 EVM 是一种状态机,以及虚拟机到底是什么?为什么 EVM 被称为准图灵完备机而不是图灵完备机?EVM 的核心组件EVM 工作机制的概括性描述。

在下一部分中,我们将开始探索智能合约的整个过程 - 从开发到其链上执行。敬请关注。

进一步阅读

以太坊虚拟机简介:Ethereum.org深入了解以太坊的世界状态以太坊帐户智能合约_、_和交易来自 Solidity 文档的 EVM

Solidity ABI 编码的深入思维模型:第 1 部分\ Solidity ABI 编码的深入思维模型:第 1 部分为什么要学习难懂的 Solidity [ABI 编码系列:第 0 部分 ]\ 为什么要学习难懂的 Solidity [ ABI 编码系列:第 0 部分 ] \ \ Solidity 很简单。\ \ 它是一种简单而漂亮的语言。\ \ 随着优秀的教育资源、课程、开发工具和 LLM 的兴起,学习和编写 Solidity 从未如此简单。\ \ 但这里有一个残酷的真相 - 如果每个人都很容易上手,那就我在 SUI-Move 中的第一个迷你项目 - 第 2 部分\ 我在 SUI-Move 中的第一个迷你项目 - 第 2 部分我使用 Move 智能合约的初体验 - 第 1 部分\ 我使用 Move 智能合约的初体验 - 第 1 部分 \ \ 我最近尝试了一种新的智能合约语言,MOVE。\ \ 该语言的灵感来自 Rust,因此对于 Solidity 开发人员来说不太直观。\ \ 但是,使用它构建非常有趣。\ \ 在本系列文章中,我旨在介绍 Move 语言及其功能。

  • 原文链接: decipherclub.com/the-abc...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
decipherclub
decipherclub
江湖只有他的大名,没有他的介绍。