关于区块链:了解区块链虚拟机EVMHVMWASMMOVE

50次阅读

共计 7448 个字符,预计需要花费 19 分钟才能阅读完成。

在区块链上,用户通过运行部署在区块链上的合约,实现须要共识的操作。而为智能合约提供运行环境的便是对应的虚拟机。

EVM

根底概念

EVM,是 ERC 协定和运作的心脏。

简略的类比:EVM 之于以太坊,正如 Java 虚拟机之于 Java 语言

咱们写的 java 代码会被编译成字节码,但计算机无法辨认字节码;java 虚拟机把字节码编译成计算机系统能够辨认的机器码指令,而后在计算机上运行。如下图所示:

EVM 的存在是为了能让咱们用 Solidity 编写的合约代码,运行在以太坊的环境中。这样类比的话,以太坊就相当于计算机环境,EVM 把合约代码编译成以太坊能辨认的机器码运行。如下图所示:

大抵流程:

当智能合约被编译成二进制文件后,被部署到区块链上。用户通过调用智能合约的接口,来触发智能合约的执行操作。EVM 执行智能合约的代码,批改以后区块链上的数据(状态)。被批改的数据,会被共识,确保一致性。

它实际上是齐全隔离的,这意味着在 EVM 上运行的代码无法访问网络、文件系统和其余过程。智能合约对其余的智能合约的拜访权也无限,在区块链网络上独自运作。

编写智能合约有三个次要步骤:

  1. 用高级语言编写,如 Solidity
  2. 用 EVM 编译器编译成字节码
  3. 用客户端上传到区块链网络

技术细节

EVM 的存储模型

EVM 是一个基于堆栈的虚拟机,具备长期内存字节数组和长久键值存储(长久存储在 Storage 中)。

Stack:EVM 是基于栈 (stack) 的虚拟机,stack 用来保留指令的输入输出数据,最大深度为 1024 个字,其中每个单元就是一个字。

长期存储 Memory:内存,一个简略的内存数组,用于长期存储 EVM 代码运行中须要存取的各种数据,基于字进行寻址和扩大

永恒存储 Storage:用来保留所有合约“状态”的永恒存储,由以太坊客户端独立保护,每个账户的存储区域被以“字”为单位划分为若干个“槽”(solt),合约中的状态变量会依据其具体类型别离保留到这些槽中。例如在合约创立时由 EVM 依据合约定义的状态变量进行初始化,将他们保留进以“字”为单位划分的“存储槽(solt storage)”中。

Storage 也是作为是世界状态的一部分存在的,客户端会用一个 MPT 来保护其数据。

ROM:用来保留所有 EVM 程序代码的只读存储,由以太坊客户端独立保护。

交易在 EVM 的执行

输出一笔交易,外部会转换成一个 Message 对象,传入 EVM 执行。

一般转账交易

如果是一笔一般转账交易,那么间接批改 StateDB 中对应的账户余额即可。

智能合约的创立或者调用

如果是智能合约的创立或者调用,则通过 EVM 中的解释器加载和执行字节码,执行过程中可能会查问或者批改 StateDB。

1. 生成 Contract 对象

交易会被转换成一个 Message 对象传入 EVM,而 EVM 则会依据 Message 生成一个 Contract 对象以便后续执行。

2. 送入解释器执行

EVM 是基于栈的虚拟机,解释器中须要操作四大组件

PC:相似于 CPU 中的 PC 寄存器,指向以后执行的指令

Stack:执行堆栈,位宽为 256bits,最大深度为 1024

Memory:内存空间

Gas:油费池,耗光油费则交易执行失败

EVM 的每条指令称为一个 OpCode,占用一个字节,所以指令集最多不超过 256

  • 首先 PC 会从合约代码中读取一个 OpCode
  • 而后从一个 JumpTable 中检索出对应的 operation,也就是与其相关联的函数汇合
  • 接下来会计算该操作须要耗费的油费,如果油费耗光则执行失败,返回 ErrOutOfGas 谬误。如果油费短缺,则调用 execute()执行该指令,依据指令类型的不同,会别离对 Stack、Memory 或者 StateDB 进行读写操作。

EVM 机器语言

EVM 机器语言分为特定的指令集组,例如算术运算,逻辑和比拟运算,控制流,零碎调用,堆栈操作和储存器操作。除典型的 Bytecode 操作外,EVM 还必须治理帐户资讯(即地址和余额),以后 gas 价格和区块资讯。

通用堆栈操作

POP // 我的项目出栈
PUSH // 我的项目入栈
MLOAD // 将我的项目加载到记忆体中
MSTORE // 在记忆体中贮存我的项目
JUMP // 扭转程式计数器的地位
PC // 程式计数器
MSIZE // 流动的记忆体大小
GAS // 交易可用的 gas 数量
DUP // 复制栈我的项目
SWAP // 替换栈我的项目

通用零碎操作

CREATE // 创立新的帐户
CALL // 在帐户间传递音讯的指令
RETURN // 执行停机
REVERT // 执行停机,复原状态更改
SELFDESTRUCT // 执行停机,并标记帐户为删除的

算术运算

MUL // 乘法
SUB // 减法
DIV // 整数除法
SDIV // 有符号整数除法
MOD // Modulo(残余)操作
SMOD // 签名模运算
ADDMOD // 模数加法
MULMOD // 模数乘法
EXP // 指数运算
STOP // 进行操作

环境操作码

ADDRESS // 以后执行帐户的地址
BALANCE // 帐户余额
CALLVALUE // 执行环境的交易值
ORIGIN // 执行环境的原始地址
CALLER // 执行调用者的地址
CODESIZE // 执行环境程式码大小
GASPRICE //gas 价格状态
EXTCODESIZE // 帐户的程式码大小
RETURNDATACOPY // 从先前的记忆体调用输入的数据的正本

与现有的虚拟机科技作比拟

  • 虚拟机(Virtual Machine)
  • Java 虚拟机(VM)

虚拟机技术与 EVM 的不同之处在于它们的目标是提供治理程式性能,或者解决客户作业系统与底层主机作业系统和硬体之间的零碎调用,任务调度和资源管理的软体形象。

然而,Java VM(JVM)标准的某些方面的确蕴含与 EVM 的相似之处。从高级概述来看,JVM 旨在提供与底层主机作业系统或硬体无关的运行时环境,从而实现各种零碎的兼容性。在 JVM 上运行的高级程式语言(如 Java 或 Scala)被编译到相应的指令集 Bytecode 中。这与编译要在 EVM 上运行的 Solidity 源档案相当。

EVM 的几个性能

  • 便于测试:为了保障各种“智能合约”的顺利执行,咱们须要给它们创立一个平安的运行环境,EVM 就是一个代码的运行环境。

    正如咱们上文所说,在虚拟机里的各种操作不会影响主机一样,任何想要在 EVM 创立智能合约的开发者能够在虚拟机上测试各种利用而不占用主链资源也不受其余区块链的影响。

  • 减少安全性:ETH 上承载着具备弱小性能的各种利用,其逻辑也就更加简单,开发者也越容易呈现各种破绽。而 EVM 是一个齐全独立的沙盒,合约代码可对外齐全隔离并在 EVM 外部运行。

    不仅能够避免因为不法分子或者程序员的编程谬误而影响整个主链,还能够避免运行智能合约的物理设施蒙受攻打。

  • 保障稳定性:因为 EVM 部署在 ETH 网络的每个节点,整个 ETH 网络的数据由泛滥节点独特保护和更新,这放弃了整个区块链数据的一致性,这同样也使 ETH 有极高的故障容错性,保障零停机。

EVM 和公链的关系

目前市面上支流的公链,大部分都兼容 EVM。

为什么这些链要做 EVM 兼容呢?

外围当然是以太坊在公链畛域的影响力。目前市场上的各种公链此起彼伏,然而 ETH 仍然是公链畛域的龙头。这些新兴的公链须要利用以太坊引流,如果开发者能够把智能合约间接无缝迁徙到本人的链上,那就是最好的引流形式。

在这些公链产生之前,以太坊的生态里,EVM 曾经部署了大量的利用。如果你不兼容这些利用,后退的路线必然是举步维艰。

上面这个图是 2022 年 5 月 31 日的寰球公链的市场份额:

这个网站看到所有兼容 EVM 的公链:

https://www.coincarp.com/zh/c…

HVM

HVM 介绍

概述

HVM 为趣链科技独创反对 Java 语言的智能合约执行引擎,反对合乎 Java 编写标准多种数据结构,内置数据表构造,能够实现业务数据可视化,在保障智能合约执行的安全性、确定性、可终止性的前提下,提供了一系列灵便的利用模式和工具办法集,以满足简单多样的业务场景需要,为宽泛的区块链开发人员提供更便捷、灵便、平安的区块链利用开发模式。

应用

HVM 合约执行的操作:从 SDK 调用一笔 HVM 的合约,首先须要共识模块将通过共识的区块交易发送给执行模块,而后执行模块调用 HVM 裸露进去的合约接口,最初合约执行实现后会将后果返回,将执行后果写入账本中。

在架构层面,HVM 自上而下次要分为三个局部:合约操作层、库函数层以及虚拟机层。

1. 虚拟机层

虚拟机层次要是在合约执行过程中,对于合约解析执行的外部操作。为了进步整体的执行效率,HVM 设计定制类加载器,类加载缓存提供合约地址到合约类加载器的映射,一个合约类加载器保留合约的字节码和合约类实例,采纳最近起码应用淘汰策略(LRU)缩小类反复加载带来的开销;指令解析从开始的每次对指令进行解析到将指令做成单例,并进行栈帧复用,大量节俭指令执行工夫,进步整体执行效率。

2. 库函数层

库函数包含数据结构、账本操作、日志信息以及加解密等性能。

  • 数据结构合乎 Java 编写范式:HyperList、HyperMap 为平台独立研发,为了不便 Java 软件开发者习惯,使其无需感知区块链底层 KV 构造即可编写相应业务逻辑代码。HyperMap 和 HyperList 的应用相似于开发者所熟知的 HashMap 和 ArrayList,但做了原创性地优化,在缩小内存应用的同时也进步了更新账本的插入效率。

  • 内置数据表构造:为了满足简单业务场景下数据类型多样化、业务数据可视化与可剖析的需要,智能合约须要反对简单的表构造数据组织模式。HVM 提供了内置数据结构 HyperTable,反对在合约外部依照表的模式组织业务数据,便于业务数据可视化以及后续的数据分析与价值开掘。这种构造能够让原 Solidity 语言中简单嵌套的数据操作简单化,同时在性能方面,能无效解决序列化、反序列化造成的性能瓶颈,整体保护老本更低、应用更高效。
  • 内置嵌套 Map 数据结构:HyperList、HyperMap 数据结构都无奈满足简单数据组织构造的需要;HyperTable 的表构造领有严格的层级格局(表 - 行 - 列簇 - 列 - 值),不足在简单构造下的灵活性(例如:不可只有列,没有列簇)。针对上述问题,HVM 推出新型的数据结构——NestedMap,反对用户按需进行灵便的数据组织,并且实现对多层映射数据更高的读写性能。

3. 合约操作层

这一层与用户间接相关联,次要包含合约部署、调用等全生命周期治理,对于合约的操作通过会对链上的合约数据状态产生影响,所以平台采取了灵便的合约治理提案申请 - 阈值投票 - 提案执行的策略,通过合约管理员对合约操作进行管制,保障合约治理操作的偏心与平安。

  • 合约部署:编写 Java 智能合约,并通过 SDK 发交易的模式将其部署到区块链上;
  • 合约调用:依据合约地址,调用相应合约中的逻辑。
  • 合约降级:须要对合约进行降级操作时,因为降级合约是一个链级操作(扭转整个链上的状态),所以须要采纳 CAF 联盟自治框架才能够进行合约降级,保障链上合约的安全控制。
  • 合约解冻 / 冻结:将链上的合约解冻,在合约所有者冻结之前,禁止任何人调用,解冻不同于销毁,其具备一个可逆的过程,能够通过合约冻结的操作从新应用。
  • 合约销毁:不同于合约解冻,合约销毁是一个不可逆的操作,被销毁的合约不可能被拜访,不能够复原,不容许再进行任何操作,但合约销毁后的数据依然会存在链的底层账本中,仅用于监管审计。

劣势

  • 反对多级日志

EVM 未对呈现的异样进行具体定位,给编译调试造成极大的难度。而 HVM 通过内置日志工具类,反对六种日志级别:critical、error、warning、notice、info、debug。能够为每种常见的谬误进行正当的提醒,不便使用者对单干操作过程中产生的异样进行 debug,不便开发和运维疾速定位问题。

  • 分层调用模式

HVM 采取分层调用的模式,能够无效升高合约降级的老本。其实现办法次要通过 InvokeBean 的形式在业务调用层在不更新合约的状况下定义丰盛的业务逻辑,合约层只实现最外围、最根本的原子操作。以转账场景为例,合约层只有减少余额和缩小余额的办法,在 InvokeBean 调用层定义转账的逻辑:如余额是否短缺、缩小转让方余额和减少接管方余额。

  • 反对加解密工具

一些业务场景须要在智能合约中进行签名验签逻辑解决,从而进行身份认证,便于进行权限判断或者后续业务的发展。因而 HVM 设计了基于 TEE 的加解密工具,反对在合约中调用存储于 TEE 的公私钥实现签名、验签操作,并反对 ECDSA 国标系列、SM 国密系列等多种加解密算法,具备不便敌对平安的个性。

  • 反对合约访问控制

合约编码者能够通过智能合约和拜访控制策略来限度拜访数据的角色和用户,在合约中针对节点、角色、用户定制不同的合约函数拜访权限。合约编码者能够在 合约中为一些高权限的函数设置权限管制,使得该函数只能被固定地址的调用者调用,从而实现拜访权限管制。

WASM

WASM-VM 简介

概述

WebAssembly(wasm) 是一个基于二进制操作指令的栈式构造的虚拟机,wasm 能够被编译为机器码,能够更快,更高效的执行本地办法和硬件资源,通过和 js 合作,前端能够实现更快,更简单的计算和利用。

不仅能够嵌入浏览器加强 web 利用,也能够利用于其余的场景。

wasm 反对高级语言编程,目前比拟成熟的编译器反对 C \ C++ \Rust。

工作原理

WASM 是一种不依赖于具体物理机器的汇编语言,能够形象的了解成它是概念的机器语言,而不是理论的物理机器语言,因而,WebAssembly 指令也可称为虚构指令,能够更快的更间接的映射的到机器码!

劣势

WASM 虚拟机曾经被 Google,Facebook,Microsoft 等世界顶级互联网公司同时反对,同时也能够在所有风行的浏览器中运行。WASM 虚拟机一开始设计的目标是用于解决 Web 程序日益严厉的性能问题,因其有以下优越的个性,被越来越多的非 Web 我的项目所采纳。

  1. 疾速、高效、可移植:通过利用常见的硬件能力,WASM 代码在不同平台上可能以靠近本地速度运行。
  2. 可读、可调试:WASM 是一门低阶语言,然而它有一种人类可读的文本格式,这容许通过人工来写代码、看代码以及调试代码。
  3. 放弃平安:WASM 被限度运行在一个平安的沙箱执行环境中。像其余网络代码一样,它遵循浏览器的同源策略和受权策略。
  4. 不毁坏网络:WASM 的设计准则是与其余网络技术谐和共处并放弃向后兼容。

与 EVM 比照

速度

  • EVM
  • 只能解决 256 位字节码,这意味着小于 256 位的字节码必须先转换为 256 位格局,而后能力发送给 EVM。
  • EVM 的可扩展性问题很显著,因为它每秒只解决 25 个交易。
  • WASM
  • 间接转换为编译后的代码,这使它可能更快地加载,同时减少每个区块所解决的交易数量。

预编译

  • EVM
  • 依赖于预编译(预编译合约)。当收回预编译调用时,EVM 将执行预约义的本机代码,而后显示后果。这些预编译特定于用于基本操作的特定协定,例如签名计划和哈希。
  • 只管预编译在不耗费大量 gas 的状况下使加密计算变得高效,但它们也带来了问题。引入新的预编译器通常要求网络经验一个零碎范畴的硬分叉。
  • WASM
  • 打消了以太坊对预编译合同的依赖。因为 WASM 十分高效,开发人员能够创立高效、疾速的智能合约,而无需放心潜在的硬分叉。

灵活性和互操作性

WASM 反对更多的语言,并且提供了比 EVM 更宽泛的工具集。WASM 反对传统语言,如 Rust、C 和 c ++。WASM 也被本地 JavaScript 引擎反对,例如 Google 的 V8 引擎(基于 Node.js 和 Chromium 的浏览器)、微软的 Chakra 引擎(Microsoft Edge)和 Mozilla 的 Spidermonkey 引擎(Thunderbird 和 Firefox)。

MOVE

概述

MoveVM 是具备动态类型零碎的堆栈机。MoveVM 从几个方面来束缚 Move 语言标准,包含混合文件格式、验证和运行时的束缚。文件格式的构造容许定义模块,类型(资源和非限度类型)和函数。代码通过字节码指令示意,字节码指令能够援用内部函数和类型。

实现细节

Move VM 执行以 Move 字节码示意的交易。它有两个外围包:外围 VM 和 VM 运行时。

MoveVM 外围包提供文件格式的定义以及与文件格式相干的所有实用程序:

  • 一个简略的 Rust 形象文件格式

    (libra/language/vm/src/file_format.rs) 和字节码。这些 Rust 构造宽泛用于代码库中。

  • 文件格式的序列化和反序列化。这些定义了代码的链上二进制示意。
  • 一些丑陋的输入展现性能。
  • 文件格式的根本架构。
  • gas 老本 / 综合基础设施。

Move 编程语言

Move 是一种新的编程语言,旨在为 Libra 区块链提供平安可编程的根底。

Move 与平台无关,反对跨区块链的共享库、工具和开发人员社区。Move 语言的设计强调安全性,旨在防止许多 Web3.0 用户受益的情景,包含但不限于重入破绽(re-entrancy vulnerabilities)、毒令牌(poison tokens)和欺骗性令牌批准(spoofed token approvals)等问题

Move 语言目录由五个局部组成:

  • 虚拟机 (VM), 它蕴含字节码格局、字节码解释器和执行交易块的基础设施。该目录还蕴含生成创世区块的基础设施
  • 字节码验证器, 其中蕴含一个动态剖析工具,用于回绝有效的 Move 字节码。虚拟机在执行新的 Move 代码前,会先运行字节码验证器。编译器运行字节码验证器则会把输入和谬误显示给程序员。
  • Move 中间层示意 (IR:intermediate representation) 编译器, 它将可读的程序文本编译成 Move 字节码. 正告:IR 编译器是一个测试工具。它会生成将被 Move 字节码验证器回绝的有效字节码。IR 语法工作仍在进行,或将经验重大的变动。
  • 规范库, 其中蕴含 LibraAccount 和 LibraCoin 等外围零碎模块的 Move IR 代码。
  • 一些测试,用于虚拟机,字节码验证程序和编译器。这些测试是用 Move IR 编写的,由测试框架运行,该测试框架从正文中编码的非凡指令解析运行测试的预期后果。

版权申明:本文为 CSDN 博主「鲲志说」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。

原文链接:

https://blog.csdn.net/m0_3748…

文章起源:CSDN 博主「鲲志说」

文章原题目:《web3:智能合约 - 虚拟机(EVM、HVM、WASM、MOVE)》

如有侵权请与咱们分割删除。

正文完
 0