当前位置: 首页 > news >正文

EVM(以太坊虚拟机)及其运行机制详解

1. EVM 是什么?

EVM(Ethereum Virtual Machine)是以太坊区块链的核心组件,是一个完全隔离的、图灵完备的虚拟机。

基本概念

// EVM 执行这样的智能合约代码
contract SimpleEVMExample {uint256 public data;function setData(uint256 _data) public {data = _data;  // 这个操作在EVM中执行}
}

核心特性

  • 完全隔离:EVM 与主机系统完全隔离
  • 确定性:相同输入总是产生相同输出
  • 沙盒环境:智能合约在受限环境中运行
  • 全球单例:整个以太坊网络只有一个EVM

2. EVM 的架构组成

EVM 组件架构

EVM 架构:
┌─────────────────┐
│   智能合约代码    │
├─────────────────┤
│   执行引擎       │  ← 解释字节码
├─────────────────┤
│   内存 (Memory)  │  ← 临时存储
├─────────────────┤
│   存储 (Storage) │  ← 永久存储
├─────────────────┤
│   栈 (Stack)     │  ← 计算操作
└─────────────────┘

3. EVM 运行机制详细解析

3.1 编译过程

// 1. Solidity 源代码
contract Counter {uint256 public count;function increment() public {count += 1;}
}// 2. 编译为 EVM 字节码
// 变成类似这样的机器码:
// PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE ...

3.2 执行流程

// EVM 执行步骤伪代码
class EVM {execute(bytecode, transaction) {// 1. 初始化let pc = 0;              // 程序计数器let stack = [];          // 操作数栈let memory = [];         // 内存let storage = {};        // 存储// 2. 逐条执行指令while (pc < bytecode.length) {let opcode = bytecode[pc];switch(opcode) {case 0x60: // PUSH1stack.push(bytecode[pc + 1]);pc += 2;break;case 0x01: // ADDlet a = stack.pop();let b = stack.pop();stack.push(a + b);pc += 1;break;case 0x55: // SSTORElet key = stack.pop();let value = stack.pop();storage[key] = value;pc += 1;break;// ... 更多操作码}// 检查Gas是否耗尽gasRemaining -= getOpcodeGasCost(opcode);if (gasRemaining < 0) throw new Error('Out of gas');}}
}

4. EVM 的数据存储结构

4.1 三种存储类型

contract StorageTypes {// 1. 存储 (Storage) - 永久,昂贵uint256 public storageVar;  // 写入消耗约20,000 Gasfunction demonstrateStorage() public {// 2. 内存 (Memory) - 临时,便宜uint256[] memory memoryArray = new uint256[](10);memoryArray[0] = 123;  // 临时使用// 3. 栈 (Stack) - 最快,容量有限// 在函数内部自动使用栈进行计算uint256 a = 1;  // 进入栈uint256 b = 2;  // 进入栈uint256 c = a + b;  // 栈操作}
}

4.2 存储布局

contract StorageLayout {// EVM 存储是键值对数据库// 地址:0x0 → 值// 地址:0x1 → 值uint256 public var1 = 100;    // 存储在 slot 0uint256 public var2 = 200;    // 存储在 slot 1mapping(address => uint) public balances;  // 复杂存储布局function getStorageSlot() public pure returns (bytes32) {// 计算映射项的存储位置address user = 0x123...;bytes32 slot = keccak256(abi.encode(user, uint256(2)));return slot;  // balances[user] 的存储位置}
}

5. Gas 机制

5.1 Gas 计算原理

contract GasExample {// 不同操作消耗不同Gasfunction gasCosts() public {uint256 x = 1;           // 3 Gasx = x + 1;               // 3 Gaskeccak256("hello");      // 30 Gas + 6 Gas/字节address(this).balance;   // 700 Gas// 存储操作最昂贵uint256 storageVar;      // 声明不消耗GasstorageVar = 100;        // 首次写入: 20,000 GasstorageVar = 200;        // 修改: 5,000 Gas}
}

5.2 Gas 限制和优化

contract GasOptimization {uint256[] public data;// 糟糕的Gas消耗function badFunction() public {for(uint256 i = 0; i < data.length; i++) {data[i] = data[i] * 2;  // 每次循环都访问存储}}// 优化的Gas消耗function goodFunction() public {uint256 length = data.length;  // 一次读取uint256[] memory localData = data;  // 复制到内存for(uint256 i = 0; i < length; i++) {localData[i] = localData[i] * 2;  // 内存操作便宜}data = localData;  // 一次写入存储}
}

6. EVM 操作码详解

6.1 常见操作码分类

; EVM 汇编示例
contract OpcodeExample {function arithmetic() public pure returns (uint256) {assembly {// 算术操作let a := 5let b := 3let sum := add(a, b)      // 0x01 ADDlet product := mul(a, b)  // 0x02 MUL// 比较操作let isGreater := gt(a, b) // 0x11 GT// 位操作let andResult := and(a, b) // 0x16 AND}}function storageOps() public {uint256 value = 100;assembly {// 存储操作sstore(0, value)  // 0x55 SSTORElet retrieved := sload(0)  // 0x54 SLOAD}}
}

7. EVM 执行上下文

7.1 执行环境

contract ExecutionContext {function contextVars() public view returns (address, uint256, bytes memory) {// EVM 提供执行上下文信息address sender = msg.sender;      // 调用者地址uint256 value = msg.value;        // 发送的以太币bytes memory data = msg.data;     // 调用数据address origin = tx.origin;       // 交易发起者uint256 gas = gasleft();          // 剩余Gasreturn (sender, value, data);}
}

7.2 调用机制

contract CallMechanism {function demonstrateCalls() public {address otherContract = 0x...;// 1. CALL - 最常用(bool success, ) = otherContract.call{value: 1 ether}("");// 2. DELEGATECALL - 使用当前合约的存储(bool delegateSuccess, ) = otherContract.delegatecall(abi.encodeWithSignature("someFunction()"));// 3. STATICCALL - 只读调用(bool staticSuccess, ) = otherContract.staticcall(abi.encodeWithSignature("readFunction()"));}
}

8. EVM 的确定性特性

8.1 为什么需要确定性

contract NonDeterministicDanger {// 这些在EVM中是不允许或危险的function dangerousPatterns() public view {// 不允许访问随机数(在没有预言机的情况下)// uint256 random = block.difficulty; // 不是真随机// 时间依赖可能有问题// if (block.timestamp > someTime) { ... }// 区块高度依赖// if (block.number > someBlock) { ... }}
}

9. 实际执行示例

9.1 完整交易执行流程

// 一个交易在EVM中的完整生命周期
const transactionExecution = {// 1. 交易到达tx: {from: "0x123...",to: "0xcontract...", value: "1.0 ETH",data: "0xabcd...", // 函数调用数据gasLimit: 21000},// 2. EVM初始化evmState: {programCounter: 0,stack: [],memory: Buffer.alloc(0),storage: {},gasRemaining: 21000},// 3. 执行循环execution: {steps: ["加载合约字节码","解析函数选择器", "执行函数逻辑","更新存储状态","返回结果"]},// 4. 状态更新result: {success: true,gasUsed: 18942,returnData: "0x...",stateChanges: {"0xslot1": "newValue1","0xslot2": "newValue2"}}
};

10. EVM 的发展演进

10.1 各版本改进

// EVM 版本的重大改进
contract EVMEvolution {// 柏林升级: EIP-2929 Gas成本调整// 伦敦升级: EIP-1559 费用市场改革  // 上海升级: EIP-4895 提款功能function modernFeatures() public {// 0.8.x 自动数学安全检查uint256 x = 100;uint256 y = 200;uint256 z = x - y;  // 0.8+ 版本会自动检测下溢// try/catch 错误处理try this.someFunction() {// 成功} catch {// 失败处理}}
}

EVM 是

  1. 以太坊的运行时环境 - 执行所有智能合约
  2. 完全确定的 - 相同输入总是相同输出
  3. Gas驱动的 - 计算资源需要付费
  4. 沙盒化的 - 与外部世界隔离
  5. 全球状态的 - 维护整个区块链的状态
http://www.dtcms.com/a/605993.html

相关文章:

  • 跨境电商支付全链路解析
  • Qt+C++ 混合开发架构设计:QML 与 C++ 高效通信的解耦方案及设计模式
  • 网站项目实施方案聊城手机网站建设公司
  • Rust开发之Trait 定义通用行为——实现形状面积计算系统
  • The JAVA_HOME environment variable is not defined correctly 解决方案
  • 南昌网站建设工作开通微信公众号需要多少钱
  • 从“并发安全”到 Rust 的无畏并发实战
  • 当前网站开发的现状数据库网站建设公司
  • 网站竞价推广做网站资源管理是
  • 子域名泛解析技术详解与安全防护
  • SuperPoint 和 SIFT 的对比
  • 【云计算】【Kubernetes】 ① K8S的架构、应用及源码解析 - 核心架构与组件全景图
  • docker容器和分布式事务
  • 【剑斩OFFER】算法的暴力美学——寻找旋转排序数组中的最小值
  • Linux:基础开发工具(一)
  • 下载和调用通义千问大模型
  • 易站网站建设怎么做淘宝客网站和APP
  • 网站开发模板系统网站建设 排行
  • 安卓C语言编译器 | 提高开发效率,便捷进行C语言编程
  • python中的鸭子类型
  • 基于球面透视投影模型的鱼眼图像校正算法matlab仿真
  • TCP连接还在吗?主机拔掉网线后再插上,连接会断开吗?
  • 网站设计规划教学设计wordpress 代码转义
  • 分享一个基于服务端地图服务裁剪的方法
  • 嵌入式Linux系统搭建本地JavaScript运行环境
  • 网站seo优化分析登录页面html模板
  • 从 0 到 1:Vue3+Django打造现代化宠物商城系统(含AI智能顾问)
  • 支持向量机(SVM)在脑电情绪识别中的学术解析与研究进展
  • dj网站建设广州有做虚拟货币网站
  • 音视频学习(七十):SVC编码