主页 > 苹果怎么下载imtoken > 关于以太坊虚拟机 EVM - ccbupt

关于以太坊虚拟机 EVM - ccbupt

苹果怎么下载imtoken 2023-03-13 06:06:15

一、什么是EVM

EVM 是以太坊协议的一部分,负责处理智能合约的部署和执行。 除了 EOA(所谓的由用户私钥控制的“外部账户”)之间的简单转账交易外,所有其他涉及状态更新的操作都是通过 EVM 计算的。 从高层抽象来看,运行在以太坊区块链上的 EVM 可以想象成一台全球去中心化计算机,包含数百万个可执行对象,所有这些对象都有自己的永久数据存储。

EVM 是一个“准”图灵完备状态机,因为其中任何智能合约的执行都必须限制在有限数量的计算步骤中,该数量受可用气体总量的限制。

EVM 是一种基于堆栈的架构,将所有内存值存储在一个堆栈中。 EVM 的数据处理单元定义为一个 256 位的“字”,它还有以下数据组成:

一个不可变的程序代码存储区域 ROM,其中加载了要执行的智能合约字节码。

严格初始化为全零值的可变内存。

作为以太坊状态的一部分存在的永久存储,也被初始化为 0

以太坊虚拟机如何实现循环_蚂蚁矿机 以太坊_eth以太坊怎么实现充值

2、与现有技术的比较

所谓“虚拟机”的概念通常是用来虚拟化真实的计算机,通常是通过像 virtualbox 或 QEMU 这样的“管理程序”,或者像 Linux 上的 KVM 这样的完整操作系统实例。 这些方案中的每一个都必须分别提供实际硬件、系统调用和其他内核函数的软件抽象。

另一方面,EVM 在更有限的领域内运作。 它只是一个计算引擎,只提供计算和存储的抽象。

就像 Java 虚拟机 (JVM) 一样。 从高层的角度来看,JVM 的设计提供了一个不需要了解底层主机操作系统或硬件的操作环境,从而提供了跨不同系统平台的兼容性。 Java、Scala(基于JVM)或C#(基于.NET)等高级编程语言被编译成对应的虚拟机字节码指令集。同样,高级智能合约开发语言如LLL、SerPent 、Mutan或solidity也会被编译成字节码指令集,由EVM执行

EVM 没有可调度性,因为执行顺序是外部组织的,即以太坊客户端通过验证区块中的交易来决定应该运行哪些智能合约以及它们的执行顺序应该是什么。 从这个角度来看,以太坊世界计算机和 JavaScript 引擎一样是“单线程”的。 EVM 没有任何“系统接口”或“硬件支持”,因为没有物理机器可以与之交互。 以太坊世界计算机是完全虚拟化的。

EVM指令集(字节码)

蚂蚁矿机 以太坊_以太坊虚拟机如何实现循环_eth以太坊怎么实现充值

EVM指令由许多标准的机器码指令组成,包括:算术和位操作逻辑操作; 执行上下文查询; 堆栈、内存和存储访问; 处理流程操作; 日志、跳转等操作

3. 以太坊的状态

EVM 的任务是根据基于以太坊协议的智能合约代码的执行计算合法的状态转换,以更新以太坊的状态。

这是以太坊被描述为基于交易的状态机的层次,也是外部用户(即账户持有人和矿工)通过创建、接受、排序和打包交易来触发状态转换的层次。

在 ***,我们对以太坊世界的状态有一个概念。 世界状态是以太坊地址到账户数据的映射。

具体来说,每个以太坊账户地址对应的账户数据由以下部分组成:以太坊余额、随机数、账户存储(仅智能合约的永久数据存储)和账户程序代码(如果账户是智能合约账户), EOA 永远不会有代码,只有空存储空间。

eth以太坊怎么实现充值_以太坊虚拟机如何实现循环_蚂蚁矿机 以太坊

当一笔交易最终体现为智能合约代码的执行时,会根据当前正在创建的区块信息和交易信息初始化一个EVM实例。 具体来说,调用的合约账户对应的代码会被加载到EVM的ROM中,程序计数器会被置0,存储的数据会从被调用的合约账户对应的storage中加载,内存会被清空并且会在 block 中存储设置其他环境变量相关的信息。 本次执行中的关键变量是为本次执行提供的gas,设置为交易发送方在原始交易开始时支付的gas总量。 在执行过程中以太坊虚拟机如何实现循环,会根据操作执行的消耗减少gas的供应。

每当 gas 供应减少到 0 时,我们将得到一个“out of gas”异常,执行将立即终止,相应的交易将失败。

将 EVM 的操作想象成将以太坊世界的状态复制到一个沙箱中,如果由于任何原因执行没有完成,那么这个沙箱中的状态将被丢弃。 然而,如果执行成功结束,真实世界的状态将更新为沙箱的状态,包括对调用合约的存储数据的所有修改、新创建的合约以及其间所有以太币余额的转移。

请注意,代码执行是一个递归过程,因为智能合约可以自己生成交易。 一个合约可以调用其他合约,每次调用最终都会反映到另一个基于新目标的 EVM 执行中。

EVM 的每个实例化都是基于之前的 EVM 沙箱构建的。 每个实例化也会得到指定数量的gas供给,可能会因为gas太少而无法完成执行。 在这种情况下,沙箱的状态被丢弃并且执行返回到之前的调用。

4.合约部署代码

以太坊虚拟机如何实现循环_蚂蚁矿机 以太坊_eth以太坊怎么实现充值

我们用来在以太坊平台上创建和部署新合约的代码与合约代码本身之间存在重要但微妙的区别。

为了创建一个新的合约,我们需要一个特殊的交易,它的目标地址字段需要被指定为0x0,并且它的数据字段需要被设置为合约初始化代码。

在处理这样的合约创建交易时,新合约账户的代码实际上并不是交易数据的数据字段附带的代码。 EVM 实例会将交易所附带的数据字段作为程序代码加载到其 ROM 中,并将部署代码的执行输出作为新合约账户的关联代码。 通过这种方式,新合约可以在部署时使用 以太坊世界的状态可以通过编程方式初始化并更改合约的存储数据甚至发送以太币或创建更多新合约。

我们在编译合约的时候,比如在命令行使用solc,会得到部署字节码,也会得到运行时字节码。

使用部署字节码执行初始化新合约账户的所有操作,包括实际交易调用新合约时需要执行的字节码(即运行时字节码)和合约构造函数中初始化处理的代码.

换句话说,运行时字节码就是调用新合约时执行的所有字节码,仅此而已,它不包括部署中需要使用的初始化合约的字节码。

蚂蚁矿机 以太坊_以太坊虚拟机如何实现循环_eth以太坊怎么实现充值

5.图灵完备性和gas

简单来说,如果一个系统或编程语言能够解决你给它的所有问题,那么它就是图灵完备的。 然而,这种能力有一个非常重要的警告:有些问题需要无限的资源来解决。

由于停机问题,以太坊世界计算机面临被编程为永远执行的风险。 这可能是由于某些意外或恶意目的造成的。 我们讨论过,以太坊就像一台单线程计算机,没有调度器,所以会陷入死循环以太坊虚拟机如何实现循环,导致无法使用。

有了gas之后,还有一个解决办法:如果在用完预先设定的最大计算量时还没有完成计算,那么就无条件停止所有的处理。 这使得 EVM 成为一个准图灵完备的机器:它可以解决你给它的任何问题,但前提是该问题可以在一定的计算量内解决。

6.区块gas限制

一个区块的gas limit是指一个区块中的所有交易总共可以消耗的最大gas量,同时也限制了一个区块中可以包含多少笔交易。

例如,假设有 5 笔交易,gas 上限分别为 30000、30000、40000、50000 和 50000。 如果区块gas limit为180,000,那么一个区块中可以包含任意四笔交易,第五个区块需要等待后续区块。 如果矿工试图包含消耗超过区块 gas 限制的交易,则该区块将由网络解决。