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

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

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

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

相关推荐

搭建一个20人的办公网络(适用于20多人的小型办公网络环境)

楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...

笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)

1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...

汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)

使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...

xpsp3安装版系统下载(windowsxpsp3安装教程)

xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...

没有备份的手机数据怎么恢复

手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。  2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。  3、...

电脑怎么激活windows11专业版

win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...

华为手机助手下载官网(华为手机助手app下载专区)

华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...

光纤线断了怎么接(宽带光纤线断了怎么接)

宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...

深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
win7旗舰版和专业版区别(win7旗舰版跟专业版)

1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...

万能连接钥匙(万能wifi连接钥匙下载)

1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...

雨林木风音乐叫什么(雨林木风是啥)

雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...

aics6序列号永久序列号(aics6破解序列号)

关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...

win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)

答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...