EVM Overview

What is EVM?

以太坊虚拟机(EVM, Ethereum Virtual Machine )是以太坊中智能合约的运行时环境。它在给定的状态下使用提供的上下文(Context)运行合约,计算有效的状态转换(智能合约代码执行的结果)来更新以太坊状态(word state) [5]。 EVM只是一个计算引擎,只提供了计算和存储的抽象,与Java虚拟机类似。 EVM没有调度功能,因为执行哪个智能合约、以什么样的顺序执行都是从外部获得的,没有与之交互的物理机。 它实际上是完全隔离的,无法访问网络、文件系统或其他进程。甚至智能合约访问其他合约时也会受到限制。[6]

以太坊底层通过EVM模块支持合约的执行与调用,调用时根据合约地址获取到代码,生成环境后载入到EVM中运行。 EVM是一个准图灵完备的状态机,这个“准”的限定来源于其中的运算是通过参数 gas 来限制的,也就是限定了可以执行的运算总量,从而避免了程序永远运行的问题。[5] 如果一个系统或编程语言可以运行任何程序,那么它就是图灵完备的。

EVM是执行事务代码的引擎,是以太坊区别于其他系统的核心特性。EVM的设计目标如下[3]:

  • 简单:操作码尽可能的少并且低级;数据类型尽可能少;虚拟机的结构尽可能少;
  • 结果明确:在VM规范语句中,没有任何可能产生歧义的空间,结果应该是完全确定的。此外,计算步骤应该是精确的,以便可以测量gas的消耗量;
  • 节约空间:EVM组件应尽可能紧凑;
  • 预期应用应具备专业化能力:在VM上构建的应用应能处理20字节的地址,以及32位的自定义加密值,拥有用于自定义加密的模数运算、读取区块和交易数据与状态交互等能力;
  • 简单安全:为了让VM不被利用,应该能够容易地建立一套gas消耗成本模型的操作;
  • 优化友好:应该易于优化,以便即时编译(JIT)和VM的加速版本能够构建出来。

Architecture

EVM 采用的是基于栈的架构。其中字(Word)的大小(也就是栈中数据项的大小)是 256 位(32字节)。这是为了便于执行 Keccak-256 位哈希和椭圆曲线计算。其内存(memory)模型是基于字寻址(word-addressed)的字节数组。栈的最大深度为 1024。EVM 也有一个独立的存储(storage)模型;它类似于内存,但并不是一个字节数组,而是一个基于字寻址(word-addressable)的字数组(word array)。存储是持久化的键值存储,且作为系统状态的一部分被维护(持久存储在Merkle树中)。所有内存和存储中的数据都会初始化为 0。EVM 不是标准的冯诺依曼结构。程序代码被保存在一个独立的、仅能通过特定的指令进行交互的虚拟 ROM中,而不是保存在一般的可访问内存或存储中。[1, 4]

栈、内存、存储数据结构源码

core/vm/stack.go

// Stack is an object for basic stack operations. Items popped to the stack are
// expected to be changed and modified. stack does not take care of adding newly
// initialised objects.
// Stack是用于堆栈基本操作的对象。弹出到堆栈中的项将被更改。堆栈不负责添加新初始化的对象。
type Stack struct {data []*big.Int //指针的切片,堆栈中本质上存储的是指针
}func newstack() *Stack {return &Stack{data: make([]*big.Int, 0, 1024)} //初始长度为0,容量1024
}

core/vm/memory.go

// Memory implements a simple memory model for the ethereum virtual machine.
// Memory为以太坊虚拟机实现一个简单的内存模型
type Memory struct {store       []byte // 字节数组lastGasCost uint64 // 已分配的内存所花费的gas,用于扩展内存时计算花费的gas。
}// NewMemory returns a new memory model.
// NewMemory返回一个新的内存模型
func NewMemory() *Memory {return &Memory{}
}

core/state/state_object.go

// EVM code
type Code []byte// 存储,地址->数据hash
type Storage map[common.Hash]common.Hash

以太坊智能合约的代码使用低级的基于堆栈的字节码的语言写成的,被称为“以太坊虚拟机代码”或者“EVM代码”。代码由一系列字节构成,每一个字节代表一种操作。一般而言,代码执行是无限循环,程序计数器每增加一(初始值为零)就执行一次操作,直到代码执行完毕或者遇到错误,STOP或者RETURN指令。代码可以像访问区块头数据一样访问数值,发送者和接收到的消息中的数据,代码还可以返回数据的字节数组作为输出。[2]

Security

EVM是一种面向安全的虚拟机,旨在允许全球计算机网络执行不受信任的代码。为了安全起见,它规定了以下限制[4]:

  • 程序执行中的每个计算步骤都必须预先付费,从而防止拒绝服务(DoS, Denial-of-Service)攻击。
  • 程序之间只能通过传输一个任意长度的字节数组进行交互;它们不能访问彼此的状态。
  • 程序执行是沙箱化的;EVM程序可以访问和修改它自己的内部状态,并可以触发其他EVM程序的执行,但除此之外不能做任何事情。
  • 程序执行是完全确定的,并且对于任何一致性实现,从相同状态出发必然引发相同的状态转换。

EVM指令集

指令的所有操作数均从堆栈中取出,结果(在适当的情况下)通常压入堆栈。EVM指令集大致分为以下几类[5]:

  • 算术和位运算
  • 获取执行上下文
  • 堆栈、内存和存储访问
  • 控制流操作
  • 日志记录、调用和其他操作符

参考文献

  1. Ethereum Yellow Paper
    ETHEREUM: A SECURE DECENTRALISED GENERALISED TRANSACTION LEDGER
    https://ethereum.github.io/yellowpaper/paper.pdf
  2. Ethereum White Paper
    A Next-Generation Smart Contract and Decentralized Application Platform
    https://github.com/ethereum/wiki/wiki/White-Paper
  3. Design Rationale
    https://github.com/ethereum/wiki/wiki/Design-Rationale
  4. Notes on the EVM
    https://github.com/CoinCulture/evm-tools/blob/master/analysis/guide.md
  5. ethereumbook
    The Ethereum Virtual Machine
    https://github.com/ethereumbook/ethereumbook/blob/develop/13evm.asciidoc
  6. The Ethereum Virtual Machine
    https://solidity.readthedocs.io/en/v0.4.24/introduction-to-smart-contracts.html
  7. Ethereum EVM Illustrated
    https://github.com/takenobu-hs/ethereum-evm-illustrated

Appendix A

EVM结构源码
core/vm/evm.go

// EVM is the Ethereum Virtual Machine base object and provides
// the necessary tools to run a contract on the given state with
// the provided context. It should be noted that any error
// generated through any of the calls should be considered a
// revert-state-and-consume-all-gas operation, no checks on
// specific errors should ever be performed. The interpreter makes
// sure that any errors generated are to be considered faulty code.
// EVM 是以太坊虚拟机的基本对象,并且提供必要的工具,以便在给定的状态下使用提供的上下文运行合约。
// 应该注意的是,通过任何调用产生的任何错误都会导致状态回滚并消耗掉所有gas,
// 不应该执行任何对特定错误的检查。解释器确保产生的任何错误都被认为是错误代码。
//
// The EVM should never be reused and is not thread safe.
// EVM不应该被重用,而且也不是线程安全的。
type EVM struct {// Context provides auxiliary blockchain related information// Context提供区块链相关的辅助信息 提供访问当前区块链数据和挖矿环境的函数和数据Context// StateDB gives access to the underlying state// StateDB 以太坊状态数据库对象 提供对底层状态的访问StateDB StateDB// Depth is the current call stack// Depth 是当前调用堆栈depth int// chainConfig contains information about the current chain// chainConfig包括当前链的配置信息 当前节点的区块链配置信息chainConfig *params.ChainConfig// chain rules contains the chain rules for the current epoch// chainRules包含当前阶段的链规则chainRules params.Rules// virtual machine configuration options used to initialise the// evm.// vmConfig 是用于初始化evm的虚拟机配置选项。 虚拟机配置信息vmConfig Config// global (to this context) ethereum virtual machine// used throughout the execution of the tx.// 交易执行所采用的全局(对于这个上下文来说)以太坊虚拟机interpreters []Interpreterinterpreter  Interpreter// abort is used to abort the EVM calling operations// NOTE: must be set atomically// abort用来终止EVM的调用操作// 注意:设置时必须是原子操作abort int32// callGasTemp holds the gas available for the current call. This is needed because the// available gas is calculated in gasCall* according to the 63/64 rule and later// applied in opCall*.// callGasTemp 保存当前调用可用的gas。这是必要的,因为可用的gas是根据63/64规则在gasCall*中计算的,之后应用在opCall*中。// // 除去父合约在内存等方面花去的杂七杂八的gas成本,实际用于执行子合约的gas。也就是子合约可以使用的gas数量。callGasTemp uint64
}
gas。这是必要的,因为可用的gas是根据63/64规则在gasCall*中计算的,之后应用在opCall*中。// // 除去父合约在内存等方面花去的杂七杂八的gas成本,实际用于执行子合约的gas。也就是子合约可以使用的gas数量。callGasTemp uint64
}

# EVM Overview相关推荐

  1. WASM VS EVM,波卡的选择预示了公链未来

    波卡公链以原生支持 WASM 和兼容 EVM 的开发便利,吸引了广大开发者,其生态发展迅速,为用户带来了诸多优秀的产品和项目.而以太坊2.0的推出,向 PoS 共识机制的转变,从 EVM 到 EWAS ...

  2. Overview of ISA and TMG Networking and ISA Networking Case Study (Part 1)

             老方说:此篇文章摘自ISASERVER.ORG网站,出自Thomas Shinder达人之手.严重建议ISA爱好者看看. Published: Dec 16, 2008 Update ...

  3. 论文: Data-Driven Evolutionary Optimization: An Overview and case studies(1) 数据驱动概念,文章结构,大数分类

    声明: 只作为自己阅读论文的相关笔记记录,理解有误的地方还望指正  论文下载链接: https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumb ...

  4. Android开发者指南(18) —— Web Apps Overview

    前言 本章内容为开发者指南(Dev Guide)/Web Applications/Web Apps Overview,版本为Android 3.2 r1,翻译来自:"happyjiahan ...

  5. SAP WM初阶之TO报表LX12 - TOs Resident Documents(Detailed Overview)

    SAP WM初阶之TO报表LX12 - TOs Resident Documents(Detailed Overview) SAP WM模块里的TO的报表LX12 – Detailed Overvie ...

  6. SAP Retail Execution Overview

    SAP Retail Execution Overview 如下地址可以下载SAP Retail Execution Overview相关介绍的PDF文件. REX 3x (edgesuite.net ...

  7. SAP Forecasting and Replenishment for Retail – A short Overview【中英文双语版】

    SAP Forecasting and Replenishment for Retail – A short Overview SAP零售预测和补货–简要概述 General Objectives a ...

  8. [译]5.1. System Initialization Overview 系统初始化简介

    目录:http://www.cnblogs.com/WuCountry/archive/2008/11/15/1333960.html   [不提供插图,读者最好从网上下载源书] 5.1. Syste ...

  9. Openstack组件部署 — Overview和前期环境准备

    目录 目录 前言 软件环境 Openstack 简介 Openstack 架构 Openstack Install Overview 创建Node虚拟机 环境准备 基础设置 Install OpenS ...

最新文章

  1. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)
  2. 当你打开的程序在任务栏出现两个一样的怎么办?
  3. MathWorks.MATLAB.NET.Arrays.MWArray”的类型初始值设定项引发异常 解决方法
  4. monkeyrunner的录制与回放
  5. 盘它:1200 天积淀,超 750 篇干货,为你甄选这 100 + 篇精华!
  6. datepicker不能选择是为什么_为什么客厅不好看?休闲椅选错了
  7. 前端开发 选择器的优先级 0229
  8. 服务器文件夹和电脑文件夹同步软件哪个好,windows文件同步备份软件-文件夹同步工具哪个好?...
  9. python成功之路,Day1-发展历史
  10. Flutter之Stack
  11. C#基础-获得当前程序的 空间名.类名.方法名
  12. 多尺度卷积稀疏编码的无监督迁移学习
  13. ffmpeg的使用笔记
  14. STM32F446RET6产品描述
  15. qq物联网 android sdk,qcloud-iot-sdk-android
  16. 本文为转载-------Web常使用的功能经验笔记第1季 -转载自刘岩
  17. 计算机网络:随机访问介质访问控制之CSMA协议
  18. OneDrive说明与OneNote的同步操作
  19. 懒猫社长便利店成焦虑boy的温暖港湾!
  20. spring security4 cas4 整合 j_spring_cas_security_check 404

热门文章

  1. C语言--使用循环语句设计简易计算器
  2. Latex排版Algorithm之algorithmic,algorithmicx,algorithm2e
  3. 关于onsubmit事件return的使用
  4. 环境光传感芯片在手机背光控制中的应用
  5. python学习笔记(一)——hello world、变量、字符串、数字、禅
  6. 「 C++ 函数 」 “ZeroMemory()使用”讲解
  7. Python设计模式之原型模式(4)
  8. 泛型(Generic)到底是什么,泛型总结
  9. 时尚复古流行流苏元素在拨弦您的心
  10. 微软惟一许可的美化软件 让XP更像Vista