【区块链安全 | 第七篇】EVM概念详解

在这里插入图片描述

1. EVM 概述

以太坊虚拟机(Ethereum Virtual Machine,EVM)是以太坊区块链的核心计算环境,负责执行智能合约和处理交易。它不仅是沙盒化(sandboxed)的,而且是完全隔离的,这意味着在 EVM 内运行的代码无法访问网络、文件系统或其他进程。

EVM 让所有以太坊节点能够达成共识,并在去中心化网络中保持一致的计算结果。

EVM 的作用

1.所有以太坊智能合约代码都在 EVM 内部运行,不依赖外部环境,确保代码执行的确定性。
2.EVM 运行在沙箱环境中,合约代码无法直接访问外部系统资源,确保安全性。
3.EVM 通过存储机制(Storage & Memory)记录智能合约的数据,所有交易最终会影响全局状态。
4.EVM 通过 Gas 费用防止恶意计算资源滥用,提高网络稳定性。

EVM 如何执行智能合约

1.EOA(外部拥有账户)发起交易,交易可以:

  • 向另一个 EOA 或合约账户发送 ETH。
  • 向合约账户发送数据,执行智能合约中的某个函数。

2.交易进入等待队列(内存池,Mempool),由矿工(PoW)或验证者(PoS)选择并打包进区块。

3.交易被矿工/验证者执行

  • 交易执行时,EVM 读取合约代码,并根据操作码(Opcode)逐步执行。
  • 操作码可能涉及计算、存储变更、资金转移等。
  • 每个操作码都需要消耗 Gas,如果 Gas 不足,交易失败。

4.交易完成 & 状态更新

  • 交易执行完毕后,EVM 将最终结果提交到全局状态数据库,并存入区块链。
  • 交易的执行结果是不可逆的,区块链上的数据无法修改。

账户类型

以太坊有两种账户类型,EOA(外部拥有账户)与合约账户。

1.EOA(外部拥有账户,Externally Owned Account)
由用户控制,需要私钥进行签名。
可以发送交易(ETH 转账、调用智能合约)。
无法执行合约代码。

2.CA(合约账户,Contract Account)
由智能合约代码控制,存储在区块链上。
不能主动发起交易,只能被 EOA 或其他合约调用。
代码执行后,可以修改状态(如存储变量)或调用其他合约。

在这里插入图片描述

无论账户是否存储代码,EVM 对这两种账户的处理方式都是相同的。

每个账户都有一个持久化的键值存储,用于映射 256 位字到256 位字,这称为存储(storage)。

此外,每个账户还拥有一个以太(Ether)余额(确切来说是以 “Wei” 作为单位,1 Ether = 10¹⁸ Wei),可以通过发送包含以太的交易来修改账户余额。

交易

交易(Transaction)是从一个账户发送到另一个账户的消息(可以是相同账户,也可以是空账户)。交易可以包含二进制数据(称为“payload”)和以太(Ether)。

  • 如果目标账户包含代码,那么该代码将会被执行,并且交易的 payload 将作为输入数据提供给该代码。

  • 如果目标账户未设置(即交易没有接收者,或者接收者被设为 null),则该交易会创建一个新合约。

在合约创建交易中,合约的地址不是 0x0,而是由发送者的地址和其 nonce 计算得出。这种交易的 payload 实际上是EVM 字节码(bytecode),并会被执行,执行的输出数据将被永久存储为该合约的代码。

这意味着,创建合约时,你发送的并不是合约的实际代码,而是一个在执行时返回该代码的代码段。

注意
在合约创建的过程中,其代码仍然是空的。因此,在构造函数(constructor)执行完毕之前,不应在合约内部回调该合约,否则会导致错误。

示例:EOA 发送 ETH
用户 A(EOA)向用户 B(EOA)发送 1 ETH。交易签名后广播到以太坊网络,矿工打包后执行转账。

示例:EOA 调用智能合约
用户 A(EOA)调用一个 DEX 智能合约,要求兑换 ETH → USDT。交易发送到合约账户,合约代码执行兑换逻辑,完成交易。

示例:合约之间的交互
Uniswap 智能合约可以调用另一个合约(如 ERC-20 代币合约)来完成代币交易。

2. EVM 体系结构

在 EVM(以太坊虚拟机)的体系结构中,栈、内存、存储和 Gas 机制是四个非常关键的组件,它们共同影响了合约执行的效率和成本。

栈(Stack)

EVM 基于栈(Stack)运算,而非寄存器(Register)。栈是一种后进先出(LIFO)的数据结构,用于存储临时的计算结果,操作数和结果的进出都是通过栈完成的。每当执行一条指令时,它可能会从栈中弹出操作数并将结果推入栈中。栈最多只能容纳 1024 个元素,每个元素占 256-bit。

同时,栈只能访问顶部的 16 个元素,不能直接访问深层数据。在栈中,我们只能通过 DUP(复制)和 SWAP(交换)操作,在前 16 个元素范围内调整顺序。

内存(Memory)

EVM 中的内存是一个临时的存储区域,EVM 在每次执行消息调用(Message Call)时,都会提供一个全新的内存实例。

内存用于存储合约执行过程中需要的临时数据,比如数组、字符串等,通常用于函数调用的中间数据存储。内存的内容在交易完成后会被清除。

特点
1.内存的大小是动态变化的,可以根据需求扩展。访问未使用的内存时ÿ

猜你喜欢

转载自blog.csdn.net/2301_77485708/article/details/146565983
今日推荐