百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

WEB3系列教程之入门篇——5. 以太坊虚拟机(EVM)

liuian 2025-03-01 14:38 29 浏览

以太坊网络的存在仅仅是为了保持状态机(即以太坊区块链)的单一、连续、不间断和不可变的操作。它是所有以太坊账户、智能合约和数据所在的环境。在任何给定的区块中,以太坊都有一个也是唯一一个全球公认的“状态”。以太坊虚拟机 (EVM) 定义了从块到块计算新的有效状态的规则。

先决条件

理解 EVM 需要对字节[1]内存[2]堆栈[3]有一些基本的了解。

熟悉一些密码学(如散列函数[4])也可能会有所帮助。

以太坊作为状态机

像比特币这样的区块链通常被描述为“分布式账本”,它使用密码学的基本工具来实现去中心化货币的存在。

加密货币的行为可以像“正常”货币一样,因为规则规定了人们可以做什么和不可以做什么来修改这个分类帐。例如,一个比特币地址不能花费比它之前收到的更多的比特币。这些规则支持在比特币以及类似的其他区块链上发生的所有交易。

虽然以太坊也有其原生加密货币以太币,但它还支持我们已经看到的更强大的功能——智能合约。对于这个更复杂的功能,我们需要一个比“分布式账本”更强大的类比。

以太坊可以描述为分布式状态机[5],而不是分布式账本。状态机本质上是可以响应某些输入而从一种状态变为另一种状态的任何机器。

简单的状态机是一种投币式旋转门[6],常见于地铁或火车站,用于防止人们进入,除非他们使用硬币支付或有票。

旋转门的初始状态是锁定的。在锁定状态下,如果你继续推动它,它会保持锁定状态。如果您插入硬币,它会进入解锁状态。如果您继续插入硬币,它会保持解锁状态。一旦您进入解锁状态(有人通过),它就会再次锁定。

对于以太坊来说,状态要复杂得多。它使用包含区块链所有状态的大型数据结构来描述。状态如何从一个块到另一个块的变化的具体规则由 EVM 定义。

以太坊状态转换

在高层次上,EVM 的行为类似于数学状态转换函数。给定当前状态和一组新的有效交易,它会产生一个新状态。输出是确定性的,这意味着对于相同的输入,它总是会产生相同的输出。

Y(S, T) = S'

给定旧的有效状态S和一组新的有效交易T,状态转换函数Y产生新的有效状态S

以太坊中的状态存储为一个非常大的数据结构,称为Merkle Patricia Trie。您不需要确切了解它的结构,但如果您愿意,可以阅读给定的链接。

EVM层

EVM 作为以太坊软件堆栈中的一个层存在。

以太坊节点包含 EVM 的实现,然后 EVM 可以在其上执行 EVM 代码。EVM 代码是编译后的可以执行的智能合约字节码。

EVM 代码生成

EVM 指令(操作码)

EVM 本身就像一个堆栈机器[7],堆栈上的最大深度为 1024 个项目。堆栈中的每一项都是一个 256 位(32 字节)的字。

在执行期间,EVM 维护一个临时内存,作为一个 32 字节寻址的字节数组,它不会在事务之间持续存在。执行新事务时清除瞬态内存。

然而,智能合约确实在区块链中维护自己的状态。该状态也被建模为Merkle Patricia Trie[8]。这通常被称为事务执行期间的 EVM存储。

EVM 具有允许其执行EVM Opcodes[9]的逻辑,这些操作码在堆栈上执行标准操作,例如、 、 、XOR等ADD。EVMAND还实现了许多区块链特定的堆栈操作,例如和。SUBMULBALANCEBLOCKHASH

当智能合约被编译成字节码(以十六进制表示)时,它会编译成 EVM 操作码。这些操作码是在 EVM 上执行的。

EVM 实现

EVM 的所有实现都必须遵守以太坊黄皮书[10]中描述的规范。在以太坊的历史上,EVM 经历了多次修订,现在存在多种编程语言的 EVM 实现。

所有以太坊客户端都包含一个 EVM 实现。除此之外,还有多个独立的实现。

Ethereum 客户端 (with EVM)

  • ? Geth[11] | Programming Language = Go
  • ? OpenEthereum[12] | Programming Language = Rust
  • ? Nethermind[13] | Programming Language = C# (.NET)
  • ? Besu[14] | Programming Language = Java
  • ? Erigon[15] | Programming Language = Go

独立的EVM实现

  • ? Py-EVM [16]| Programming Language = Python
  • ? evmone[17] | Programming Language = C++
  • ? ethereumjs-evm[18] | Programming Language = Javascript
  • ? Enclave EVM[19] | Programming Language = C++

资料

以下是推荐的,但可选择的阅读/观看内容,以了解更多关于EVM的信息。

  • ? Ethereum EVM: Illustrated[20]
  • ? EVM Opcodes[21]
  • ? Ethereum Yellowpaper[22]
  • ? Understanding EVM[23]
  • ? Merkle Patricia Trie[24]

引用链接

[1] 字节: https://en.wikipedia.org/wiki/Byte
[2] 内存:
https://en.wikipedia.org/wiki/Computer_memory
[3] 堆栈:
https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
[4] 散列函数:
https://en.wikipedia.org/wiki/Cryptographic_hash_function
[5] 状态机:
https://en.wikipedia.org/wiki/Finite-state_machine
[6] 旋转门:
https://i.imgur.com/Uh7m6jN.png
[7] 堆栈机器:
https://en.wikipedia.org/wiki/Stack_machine
[8] Merkle Patricia Trie:
https://eth.wiki/en/fundamentals/patricia-tree
[9] EVM Opcodes:
https://ethereum.org/en/developers/docs/evm/opcodes/
[10] 以太坊黄皮书:
https://ethereum.github.io/yellowpaper/paper.pdf


[11] Geth:
https://geth.ethereum.org/
[12] OpenEthereum:
https://github.com/openethereum/openethereum
[13] Nethermind:
https://nethermind.io/
[14] Besu:
https://consensys.net/quorum/developers/
[15] Erigon:
https://github.com/ledgerwatch/erigon
[16] Py-EVM :
https://github.com/ethereum/py-evm
[17] evmone:
https://github.com/ethereum/evmone
[18] ethereumjs-evm:
https://github.com/ethereumjs/ethereumjs-monorepo
[19] Enclave EVM:
https://github.com/microsoft/eevm
[20] Ethereum EVM: Illustrated:
https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf


[21] EVM Opcodes:
https://www.ethervm.io/
[22] Ethereum Yellowpaper:
https://ethereum.github.io/yellowpaper/paper.pdf
[23] Understanding EVM:
https://www.youtube.com/watch?v=RxL_1AfV7N4
[24] Merkle Patricia Trie:
https://www.youtube.com/watch?v=OxofT39TJgg

相关推荐

教你把多个视频合并成一个视频的方法

一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...

零代码编程:用kimichat合并一个文件夹下的多个文件

一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...

Java APT_java APT 生成代码

JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...

Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器

在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...

挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?

如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...

五年后,谷歌还在全力以赴发展 Kotlin

作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...

kotlin和java开发哪个好,优缺点对比

Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...

移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?

掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...

颜值非常高的XShell替代工具Termora,不一样的使用体验!

Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...

预处理的底层原理和预处理编译运行异常的解决方案

若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...

为“架构”再建个模:如何用代码描述软件架构?

在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...

深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型

2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...

比分网开发技术栈与功能详解_比分网有哪些

一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...

设计模式之-生成器_一键生成设计

一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...

构建第一个 Kotlin Android 应用_kotlin简介

第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...