以太坊虚拟机EVM究竟是个啥

article/2025/10/30 23:51:04

基本概念

在这里插入图片描述

EVM(ETHereum Virtual Machine)是「以太坊虚拟机」的缩写。如果你有一些软件开发的背景,一定听过java虚拟机。通俗的解释java虚拟机的就是:

我们写的java代码(不只是java,groovy,scala等也可以)会被编译成字节码,但是字节码计算机是没办法识别的。 java虚拟机的作用就是把字节码编译成计算机系统可以识别的机器码指令,然后在计算机上运行。如下图所示:

在这里插入图片描述

好,再说回来EVM。EVM的存在是为了能让我们用Solidity编写的合约代码,运行在以太坊的环境中。这样类比的话,以太坊就相当于计算机环境,EVM把合约代码编译成以太坊能识别的机器码运行。那现在可能还不止以太坊,市面上涌现了很多新的公链也兼容EVM(这个下面的章节会讲到)。我们把上面的图改一改,类比下:

在这里插入图片描述

EVM和公链有啥关系

目前市面上主流的公链,大部分都兼容EVM。所谓的兼容,就是假如你写了一个智能合约部署在以太坊上,那么同时你也可以迁移到任意的兼容链上。

为什么这些链要做EVM兼容呢?核心当然是以太坊在公链领域的影响力。目前市场上的各种公链此起彼伏,但是以太坊依然是公链领域的龙头。这些新兴的公链需要利用以太坊引流,如果开发者可以把智能合约直接无缝迁移到自己的链上,那就是最好的引流方式。

在这些公链产生之前,以太坊的生态里,EVM已经部署了大量的应用。如果你不兼容这些应用,前进的道路必然是举步维艰。就好像咱们的鸿蒙系统,是可以兼容安卓全部应用的,这也是鸿蒙其中一个最重要的战略。

下面这个图是截止到我写这篇文章,全球公链的市场份额:

在这里插入图片描述

然后你可以在下面这个网站看到所有兼容EVM的公链,

https://www.coincarp.com/zh/chainlist/

你会发现市场份额靠前的这些公链基本都是兼容EVM的。

技术细节

这部分比较偏技术,如果你觉得比较枯燥也可以跳过这部分。

大部分了解以太坊,会简单的认为它是跟比特币区块链一样的一个分布式账本,可以交易,有自己的货币,余额等。这个理解没错,但是以太坊不仅仅是这样,它还支持一种更强大的功能叫智能合约。这种情况下我们把以太坊比喻为分布式的状态机器可能更合适。它可以根据预定义的一组规则在不同的区块之间进行更改,并且可以执行任意的机器代码。 在区块中更改状态的具体规则由 EVM 定义。

在这里插入图片描述

我们可以把以太坊看成是一个基于交易的状态机:在给定输入的情况下,它会产生确定性的输出。 因此,将以太坊更正式地描述为具有状态转换函数非常有帮助:

Y(S, T)= S'

给定一个旧的有效状态 (S)> 和一组新的有效交易 (T),以太坊状态转换函数 Y(S,T) 产生新的有效输出状态 S’。

这个看起来是不是就很像计算机了。

智能合约会被编译成字节码,而这些字节码遵守EVM的opcodes指令,可以被执行。比如xor,and,add,sub等。关于所有的opcodes指令,感兴趣的可以看下面这里:

https://ethereum.org/zh/developers/docs/evm/opcodes/

前面我们提到了两个关键的词:交易和状态。交易触发了状态的改变,那么什么是状态呢?

在以太坊中,状态其实是一个叫默克尔树的数据结构。我在几年前写过一篇文章专门讲默克尔树,如下:

Merkle Tree与区块链

我这里再简单总结两句。

在默克尔树中,由叶子节点保存区块数据的哈希,而由非叶子节点保存其子节点的哈希。这样一个数据结构有两条很重要的特点:

  1. 判断两个默克尔数是否相同,只需要判断根节点的哈希值即可。
  2. 可以快速的判断数据是否存在于默克尔树中。

以太坊有个概念叫世界状态,它的数据结构就是默克尔树。世界状态里保存着账户的映射关系,随着交易的进行这些状态会不断的变化。

而以太坊的账户分为两种,一种是交易发币用的账户,一种是合约账户。后者是我们创建一个智能合约的时候建立的。所以智能合约的数据也是存储在账户中,它的状态也是随着交易的发生而变化。

总结

经常有人讨论,EVM和非EVM哪个好。我们其实可以看到排名靠前的公链里其实也有不兼容EVM的。那到底哪个好呢?未来又是谁能一统天下呢?

我个人的看法是,目前来看兼容EVM是主流。非兼容EVM的公链需要靠创意和落地的场景来打出自己的一片天地。目前各方竞争都很激烈,一切还未成定局,时间才是最好的见证者。


参考:

  • https://www.footprint.network/dashboards
  • https://ethereum.org/zh/developers/docs/evm/
  • https://zhuanlan.zhihu.com/p/203347169

http://chatgpt.dhexx.cn/article/HJ0qDT9D.shtml

相关文章

介绍 EVM 等效性

介绍 EVM 等效性 上个月,我们宣布了Optimistic 以太坊历史上最重要的升级。最近,我们将Optimistic Kovan迁移到真正的一键式部署,并增加了稳定性,主网在不到三周的时间内就会跟上。 这篇文章是关于我们相信EVM 等效性——完全符合…

EVM的深入研究和分析

最终目标是能够完整地理解已编译的Solidity合同 1、执行 evm-tools 安装 https://github.com/CoinCulture/evm-tools/blob/master/INSTALL.md /home/xue/go/bin/evm --debug --code 366020036101000a600035045b6001900380600c57 --input 05 不同字节码编译成不同EVM指令 1、基…

Ethereum EVM简介

1. 引言 首先需了解以下基本概念: 1)区块链2)世界状态3)账号4)交易5)消息6)去中心化账本7)原子性和顺序性 1.1 何为以太坊区块链? 以太坊可看成是基于交易的状态机&a…

误差向量幅度(EVM)

转自:http://blog.sina.com.cn/s/blog_6c46cb860100otm3.html 误差向量幅度(EVM):误差向量(包括幅度和相位的矢量)是在一个给定时刻理想无误差基准信号与实际发射信号的向量差。Error Vector Magnitude E…

WiFi基础知识

术语和定义 1. 发射功率RF Power 在给定频段范围内发射机通过天线对空间辐射的能量。 2. 矢量误差(EVM) EVM是发射信号理想状态下的IQ分量与实际发送信号的IQ分量之间的矢量差,如图1 所示,其数值等于误差矢量幅度与最大符号幅度之比(取百…

三分钟读懂什么是EVM

虚拟机指的是,通过软件模拟的、具备完整硬件系统功能并运行在隔离环境下的完整计算机系统,比如虚拟化物理机VMware、Java虚拟机等。实际上在PC上常见的各种手机模拟器、主机模拟器,也都是一种虚拟机。这样的虚拟机往往需要固件运行&#xff0…

射频指标之EVM

说到EVM首先先介绍下EVM是什么,其是指目标功率与实际功率的一个矢量差,用下图可以比较详细的表示: 下面就以几个问题来讨论EVM的问题: 1.问题背景: TC芯片输出的EVM正常,单独测试PA输出的EVM也正常&#…

.lib 静态链接库 的破解方法(局限)(1)

因为之前程序调用了一个试用版的.lib库 , 而这个库有时间限制 , 导致程序在试用期过后不能使用 . 然后编译之后要破解一下编译出来的程序 , 很难受 闲来无事,突然想破解一下.lib , 毕竟是个代码库 , 看看是不是破解完了在编译 , 能正常使用 结果当然是能正常用了 不然就没这…

InfluxDB源码编译、安装、配置及主从同步实现

先扯点蛋 公司有个项目要求使用InfluxDB时序数据库储存点东西。第一次听说还有这种数据库,哈哈哈,孤陋寡闻了,先从各位大佬的博客看起,慢慢学习,逐渐了解了之后在服务器上进行安装。直接使用官方包进行安装很简单&…

一种破解静态链接库(.lib)的简单方法

一种破解静态链接库(.lib)的简单方法 作者:游蓝海 博客:http://blog.csdn.net/you_lan_hai 最近,在研究某代码时,遇到这样一个问题:整个解决方案中,有一个工程没有cpp源码,只有头文件跟一个静…

Linux下静态库生成和使用

一.静态库概念 1.库是预编译的目标文件(object files)的集合,它们可以被链接进程序。静态库以后缀为”.a”的特殊的存档(archive file)存储。 2.标准系统库可在目录/usr/lib与/lib中找到。比如,在类Unix系统中C语言的数序库一般…

libuvc介绍及简单使用

libuvc是一个用于USB视频设备的跨平台库,构建在libusb之上,编译libuvc时需要依赖libusb。libuvc的License为BSD,最新发布版本为0.0.6,源码地址: https://github.com/libuvc/libuvc libuvc支持在非windows系统上直接编译&#xff0…

linux下封装函数库——动态库.so和静态库.a(代码实现及链接方式)

在linux环境下的链接库分为静态链接库(.a库)和动态链接库(.so库),其作用是把C程序编译好做成一种可执行链接文件,主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要includ…

Hyperledger fabric应用的多机部署(自动化一键部署)

前面关于fabric部署的介绍都是基于单机环境下的,实际生产环境中一般会根据应用场景将节点分开部署在多台物理机上,面临的难题主要是不同主机间的节点如何通过网络进行通信。文章最后会分享一键完成多机增加组织的自动化部署脚本。 前言 这里仍然以balan…

Linux系统编程makefile制作动态库和静态库

目录 制作动态库 制作静态库 首先准备简单的add.c&#xff0c;sub.c,main.c,head.h.具体代码如下 #head.h文件 int Add(int a, int b); int Sub(int a, int b);#add.c文件 #include <stdio.h> int Add(int a, int b) {return a b; }#sub.c文件 #include <stdio.h&…

Linux动态库的下载与配置(以libevent库为例)

** Linux动态库的下载与配置 ** 本章以下载、安装、配置libevent库为例(安装libevent的前提是已经成功安装openssl库) 一、libevent的下载 https://libevent.org/ //官网下载源码包如果学习下载1.0版本为好&#xff0c;使用可以下载2.0版本 1.如果Linux已经进行桥接联网&am…

Linux下编译安装libusb动态库(.so) - libus1-0 vs libusb-0.1

最近在调试代码的过程中&#xff0c;发现libusb库中的一些方法没办法debug到&#xff0c;所以试着下载了一版源码&#xff0c;编译安装到指定的目录。这样&#xff0c;在工程的pro文件中&#xff0c;直接指定库和头文件的目录就可以引用自己编译的libusb库了。 在网上查了相关的…

linux编译生成动态库、静态库,以及使用

一、介绍 在实际开发过程中&#xff0c;当代码的文件较多&#xff0c;可以将一部分代码编译成动态库或者静态库然后再加载到程序中使用 编译过程 1、预编译 2、编译 3、汇编 4、链接 静态库和动态库的差异 1、链接静态库简单理解就是复制目标代码嵌入可执行文件中 2、动态库是…

Linux·libusb源码编译

libusb系列--Linux下libusb源码编译​​ ​ ​源码下载及解压​​ ​​下载源码​​ ​​解压下载的源码压缩包​​ ​​打开终端​​ ​​准备编译环境​​ ​​安装make dh-autoreconf​​ ​​安装 libudev-dev​​ sudo ​./autogen.sh​ ​​​​sudo ./configure --prefi…

ESP32如何用makefile直接编译生成.a静态库

目录 编译痛点前提环境编译准备makefile代码编译痛点 开发过esp系列的攻城狮们都知道,esp32的sdk包含了编译器、组件代码和例程代码,编译都是基于cmake的,都是整体一起编译,CMakeList.txt,component.mk,project.mk等等一系列和编译相关的文件,如果你想要自己编译一个自…