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

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

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

以太坊网络的存在仅仅是为了保持状态机(即以太坊区块链)的单一、连续、不间断和不可变的操作。它是所有以太坊账户、智能合约和数据所在的环境。在任何给定的区块中,以太坊都有一个也是唯一一个全球公认的“状态”。以太坊虚拟机 (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

相关推荐

MySQL合集-mysql5.7及mysql8的一些特性

1、Json支持及虚拟列1.1jsonJson在5.7.8原生支持,在8.0引入了json字段的部分更新(jsonpartialupdate)以及两个聚合函数,JSON_OBJECTAGG,JS...

MySQL 双表架构在房产中介房源管理中的深度实践

MySQL房源与价格双表封神:降价提醒实时推送客户房产中介实战:MySQL空间函数精准定位学区房MySQL狠招:JSON字段实现房源标签自由组合筛选房源信息与价格变更联动:MySQL黄金搭档解决客户看...

MySQL 5.7 JSON 数据类型使用总结

从MySQL5.7.8开始,MySQL支持原生的JSON数据类型。MySQL支持RFC7159定义的全部json数据类型,具体的包含四种基本类型(strings,numbers,boolea...

MySQL 8.0 SQL优化黑科技,面试官都不一定知道!

前言提到SQL优化,大多数人想到的还是那些经典套路:建索引、避免全表扫描、优化JOIN顺序…这些确实是基础,但如果你还停留在MySQL5.7时代的优化思维,那就out了。MySQL8.0已经发布好...

如何在 MySQL 中使用 JSON 数据(mysql的json函数与实例)

在MySQL中学习“NoSQL”MySQL从5.7版本开始就支持JSON格式的数据类型,该数据类型支持JSON文档的自动验证和优化存储和访问。尽管JSON数据最好存储在MongoDB等...

MySQL中JSON的存储原理(mysql中json字段操作)

前言:表中有json字段后,非索引查询性能变得非常糟糕起因是我有一张表,里面有json字段后,而当mysql表中有200w数据的时候,走非索引查询性能变得非常糟糕需要3到5s。因此对mysql的jso...

mysql 之json字段详解(多层复杂检索)

MySQL5.7.8开始支持JSON数据类型。MySQL8.0版本中增加了对JSON类型的索引支持。示例表CREATETABLE`users`(`id`intNOTNULLAU...

VMware vCenter Server 8.0U3b 发布下载,新增功能概览

VMwarevCenterServer8.0U3b发布下载,新增功能概览ServerManagementSoftware|vCenter请访问原文链接:https://sysin.or...

Spring Boot 3.x 新特性详解:从基础到高级实战

1.SpringBoot3.x简介与核心特性1.1SpringBoot3.x新特性概览SpringBoot3.x是建立在SpringFramework6.0基础上的重大版...

如何设计Agent的记忆系统(agent记忆方法)

最近看了一张画Agent记忆分类的图我觉得分类分的还可以,但是太浅了,于是就着它的逻辑,仔细得写了一下在不同的记忆层,该如何设计和选型先从流程,作用,实力和持续时间的这4个维度来解释一下这几种记忆:1...

Spring Boot整合MyBatis全面指南:从基础到高级应用(全网最全)

一、基础概念与配置1.1SpringBoot与MyBatis简介技术描述优点SpringBoot简化Spring应用开发的框架,提供自动配置、快速启动等特性快速开发、内嵌服务器、自动配置、无需X...

5大主流方案对比:MySQL千亿级数据线上平滑扩容实战

一、扩容方案剖析1、扩容问题在项目初期,我们部署了三个数据库A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在Service服务层使用uid%3进行取模分片,从而将数据...

PostgreSQL 技术内幕(五)Greenplum-Interconnect模块

Greenplum是在开源PostgreSQL的基础上,采用MPP架构的关系型分布式数据库。Greenplum被业界认为是最快最具性价比的数据库,具有强大的大规模数据分析任务处理能力。Greenplu...

在实际操作过程中如何避免出现SQL注入漏洞

一前言本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。二SQL注入漏洞的原理、形...

运维从头到尾安装日志服务器,看这一篇就够了

一、rsyslog部署1.1)rsyslog介绍Linux的日志记录了用户在系统上一切操作,看日志去分析系统的状态是运维人员必须掌握的基本功。rsyslog日志服务器的优势:1、日志统一,集中式管理...