以太坊虚拟机EVM的工作原理是怎样的

2023-11-07

以太坊虚拟机EVM的工作原理是怎样的

如果你打算尝试在以太坊区块链上开发智能合约,或者已经在该领域工作了一段时间,可能会遇到EVM一词,EMV是太坊虚拟机的缩写。 虚拟机本质上是在执行代码和执行的机器之间创建一个抽象级别。需要这一层抽象来提高软件的可移植性,以及确保应用程序彼此分离,并与运行它们的主机分离。

创建智能合约

智能合约通常用一种名为Solidity的编程语言编写,这种语言类似于 JavaScript 和 C++。 其他编写智能合约的语言包括 Vyper 和 Bamboo。 在 Solidity 发布之前,使用了其他语言,如 Serpent(已弃用)和 Mutan(已弃用)。

在这里插入图片描述

像 Solidity 这样的智能合约语言不能由 EVM 直接执行。 相反,它们需要被编译为低级别的指令(称为操作码)。

操作码

在底层,EVM 使用一组指令(称为操作码)来执行特定任务。 在撰写本文时,有 140 个唯一操作码。 这些操作码一起使 EVM 成为图灵完备的环境。 这意味着在有足够资源的情况下,EVM 能够(几乎)计算任何东西。 因为操作码是 1 个字节,所以最多只能有 256 (16²) 个操作码。 简单起见,我们可以将所有操作码分为以下几类:

  • 堆栈操作操作码(POP、PUSH、DUP、SWAP)
  • 算术/比较/按位操作码(ADD、SUB、GT、LT、AND、OR)
  • 环境操作码(CALLER、CALLVALUE、NUMBER)
  • 内存操作操作码(MLOAD、MSTORE、MSTORE8、MSIZE)
  • 存储操作操作码(SLOAD、SSTORE)
  • 程序计数器相关操作码(JUMP、JUMPI、PC、JUMPDEST)
  • 停止操作码(STOP、RETURN、REVERT、INVALID、SELFDESTRUCT)

在这里插入图片描述

字节码

为了有效地存储操作码,它们被编码为字节码。 每个操作码都分配有一个字节(例如;STOP 是 0x00)。 我们来看看下面的字节码:0x6001600101

在这里插入图片描述

在执行过程中,字节码被分成它的字节(1 个字节等于 2 个十六进制字符)。 0x60–0x7f (PUSH1-PUSH32) 范围内的字节处理方式不同,因为它们包含推送数据(需要附加到操作码,而不是被视为单独的操作码)。

第一条指令是 0x60,它转换为 PUSH1。 因此,我们知道推送数据是 1 个字节长,我们将下一个字节添加到堆栈中。 堆栈现在包含 1 个项,我们可以移动到下一条指令。 由于我们知道 0x01 是 PUSH 指令的一部分,因此我们需要执行的下一条指令是另一个 0x60 (PUSH1) 以及相同的数据。 堆栈现在包含 2 个相同的项。 最后一条指令是 0x01,翻译为 ADD。 该指令将从堆栈中取出 2 个项,并将这些项目的总和压入堆栈。 堆栈现在包含一项:0x02

合约状态

虽然许多流行的顶级编程语言允许用户直接将参数传递给函数(function(argument1,argument2)),但低级编程语言通常使用堆栈将值传递给函数。 EVM 使用 256 位寄存器堆栈,可以一次访问或操作最近的 16 项。总共,堆栈只能容纳 1024 个项。

由于这些限制,复杂的操作码改为使用合约内存来检索或传递数据。然而,记忆不是持久的。合约执行完成后,内存内容不会被保存。可以将堆栈类比为函数参数,将内存类比为声明变量。

为了无限期地存储数据并使其可用于未来的合约执行,可以使用存储。合约存储本质上充当公共数据库,可以从外部读取值,而无需向合约发送交易(不收费!)。但是,与写入内存相比,写入存储非常昂贵(高达 6000 倍成本)。

于合约交互的成本(gas fee)

由于所有合约的执行都是由运行以太坊节点的个人运行的,攻击者可以尝试创建包含大量计算成本高的操作的合约来减慢网络速度。 为了防止此类攻击的发生,每个操作码都有自己的基本 gas 成本。 此外,一些复杂的操作码也会收取动态 gas 成本。 例如,操作码 KECCAK256(以前称为 SHA3)的基本成本为 30 gas,每个字的动态成本为 6 gas(字是 256 位项目)。 计算成本高的指令比简单、直接的指令收取更高的 gas 费用。 最重要的是,每笔交易都以 21000 gas 开始。

在这里插入图片描述

当执行减少状态大小的指令时,gas 也可以退还。 将存储值从非零设置为零会退还 15000 gas,而完全删除合约(使用 SELFDESTRUCT 操作码)会退还 24000 gas。 退款仅在合同执行完成后才会发生,因此合同无法自行支付。 此外,退款不能超过当前合同调用所用 gas 的一半。

如果有兴趣阅读更多有关gas的信息,请随时查看这篇出色的文章:“什么是gas?”

https://support.mycrypto.com/general-knowledge/ethereum-blockchain/what-is-gas/

部署智能合约

部署智能合约时,会创建一个常规交易,没有地址。 此外,添加了一些字节码作为输入数据。 此字节码充当构造函数,需要在将运行时字节码复制到合约代码之前将初始变量写入存储。 在部署期间,创建字节码只会运行一次,而运行时字节码将在每次合约调用时运行。

在这里插入图片描述

我们可以把上面的字节码分为三个部分

构造器

60806040526001600055348015601457600080fd5b5060358060226000396000f3fe

在这里插入图片描述

运行时

6080604052600080fdfe

在这里插入图片描述

元数据

a165627a7a723058204e048d6cab20eb0d9f95671510277b55a61a582250e04db7f6587a1bebc134d20029

在这个字节码的末尾,附加了一个由 Solidity 创建的元数据文件的 Swarm 散列。 Swarm 是一个分布式存储平台和内容分发服务,或者更简单地说:一个去中心化的文件存储。 尽管 Swarm 哈希也将包含在运行时字节码中,但它永远不会被 EVM 解释为操作码,因为它的位置永远无法到达。 目前,Solidity 使用以下格式:

0xa1 0x65 'b' 'z' 'z' 'r' '0' 0x58 0x20 [32 bytes swarm hash] 0x00 0x29

因此,在这种情况下,我们可以提取以下 Swarm 哈希:

4e048d6cab20eb0d9f95671510277b55a61a582250e04db7f6587a1bebc134d2

元数据文件包含有关合约的各种信息,例如编译器版本或合约的功能。 不幸的是,这是一个实验性功能,没有多少合约公开将其元数据上传到 Swarm 网络。

反编译字节码

有几个项目已经创建了工具来尝试使字节码更具可读性。 例如你可以使用 eveem.org 或 ethervm.io 在主网上反编译合约。 不过,由于编译器进行了优化,原始合约源的某些部分(例如函数名称或事件名称)总是丢失。 尽管如此,大多数函数名称仍然可以通过将函数签名与包含流行函数和事件名称的大型数据集进行比较来强制执行(参见 4byte.directory)。

合约调用通常需要“ABI”(应用程序二进制接口),它是记录所有功能和事件的数据,包括它们所需的输入和输出。 在合约上调用函数时,函数签名是通过对函数名称(包括其输入)进行哈希处理(使用 keccak256)并截断除前 4 个字节之外的所有内容来确定的。

在这里插入图片描述

如上图所示,我们的函数 HelloWorld() 解析为签名哈希 0x7fffb7bd。 如果我们想调用这个函数,我们的交易数据需要以 0x7fffb7bd 开头。 需要传递给函数的参数(在这种情况下没有)可以在交易输入数据中的签名哈希之后添加到称为单词的 32 字节片段中。

如果一个参数包含超过 32 个字节(256 位)的数据,如数组或字符串,则该参数将拆分为多个字,这些字会在包含所有其他参数后添加到输入数据中。 此外,所有单词的总大小作为另一个单词包含在所有数组单词之前。 在包含参数的位置,将添加数组单词(包括大小单词)的起始位置。

总结

以太坊为开发人员提供了一个去中心化的生态系统,可以使用 Solidity 和 EVM 构建出色的产品。 尽管通过智能合约与 EVM 交互可能比在传统服务器上运行程序要昂贵得多,但在许多用例中,去中心化更受大家的关注。

如果阅读本文使您有兴趣了解有关开发智能合约的更多信息,请通过查看“智能合约简介”来深入了解 Solidity 的工作原理。 谢谢阅读!

引用

  • https://ethereum.github.io/yellowpaper/paper.pdf
  • https://docs.soliditylang.org/en/latest/
  • https://blog.zeppelin.solutions/deconstructing-a-solidity-contract-part-i-introduction-832efd2d7737
  • https://blog.qtum.org/diving-into-the-ethereum-vm-6e8d5d2f3c30

本篇翻译自下面这篇文章

https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太坊虚拟机EVM的工作原理是怎样的 的相关文章

  • 区块链爆发,以太坊客户端还HOLD住吗?

    以太坊网络现在有24 270种代币 27 358笔交易等待转账 463 713个电子猫 数据截止发文时间 2018年1月19日 以太坊最近主持了很多活动 很多加密货币的爱好者认为这是个积极的信号 因为以太坊网络的使用率大增 历史更加长远并且
  • 【虾说区块链】什么是hash算法?什么是好的hash算法?

    欢迎收听 虾说区块链 现在区块链这个概念在互联网上相当火热 这里简单做一个普及 不涉及项目推广投资 单纯地对区块链相关基础知识概念作一个说明讲解 本人区块链技术爱好者 结合相关区块链资料总结整理了 虾说区块链 也是自己一个学习笔记 涉及相关
  • 北京大学肖臻老师《区块链技术与应用》公开课 笔记目录

    北京大学肖臻老师 区块链技术与应用 公开课学习笔记 分章节进行整理 持续更新中 该系列文章中如有任何侵权内容请及时与我个人联系删除或修改 北京大学肖臻老师 区块链技术与应用 视频链接 点击这里 文章目录 01 课程介绍 点击这里 BTC 0
  • 公链分层要怎么设计?

    比特币把人类在密码学和计算机工程中的应用融合到了一起 全球矿工 开发者们对比特币有着十分浓厚的兴趣 他们都在比特币提供的结构思考中完成创新和应用 比特币网络的改良的一个最好例子就是以太坊 而EOS等其余公链的出现则在更多的途径上为区块链技术
  • Merkle Tree与区块链

    什么是merkle tree 假设你已经知道了什么是哈希算法以及哈希是用来干啥的 网络传输数据的时候 A收到B的传过来的文件 需要确认收到的文件有没有损坏 如何解决 有一种方法是B在传文件之前先把文件的hash结果给A A收到文件再计算一次
  • 区块链技术之P2P网络(一)

    与传统的Client Server网络模式相比 P2P网络所有节点平等 数据互相传输 P2P 英文全称 Peer to peernetworking 简称P2P 也称为对等网络 即对等计算机网络 是一种在对等者 Peer 之间分配任务和工作
  • 区块链与分布式数据库的区别

    1 来源 分布式数据库 应对互联网条件下大规模数据的增删改查需求 解决传统数据库面临的通信开销大 性能差 容量可扩展性差和可靠性低的问题 通信开销大 假设只有一个数据库 并且放在北京 那么纽约的用户就需要等待网络从纽约到北京的往返通信延迟
  • 应用二进制接口(ABI) 说明——Solidity中文文档(7)

    写在前面 HiBlock区块链社区成立了翻译小组 翻译区块链相关的技术文档及资料 本文为Solidity文档翻译的第七部分 应用二进制接口 ABI 说明 特发布出来邀请solidity爱好者 开发者做公开的审校 您可以添加微信baobaot
  • 以太坊虚拟机EVM的工作原理是怎样的

    以太坊虚拟机EVM的工作原理是怎样的 如果你打算尝试在以太坊区块链上开发智能合约 或者已经在该领域工作了一段时间 可能会遇到EVM一词 EMV是太坊虚拟机的缩写 虚拟机本质上是在执行代码和执行的机器之间创建一个抽象级别 需要这一层抽象来提高
  • 《北京市政务服务领域区块链应用创新蓝皮书(第一版)》正式发布

    为加快推动区块链技术和产业创新发展 北京市政务服务管理局 北京市科委 北京市经济和信息化局组织相关单位抓紧推进政务服务领域区块链应用建设 取得阶段性成果 在此基础上 北京市区块链工作专班专家组编制了 北京市政务服务领域区块链应用创新蓝皮书
  • 以太坊(二)——账户

    外部账户 Externally owned account EOA 本地产生一个公私钥对 私钥掌握账户的控制权 外部账户包括账户余额 balance 计数器 nonce 也叫普通账户 有对应的以太币余额 可发送交易 转币或触发合约代码 所有
  • 密码学基础(一)——哈希算法

    一 常用密码学算法分类 哈希算法 哈希算法不可逆 包括 MD4 MD5 hash1 ripeMD160 SHA256 SHA3 Keccak256 国家标准SM3 国家密码管理局 加密 解密算法 加密解密算法可逆 但是必须要有秘钥 对称加密
  • 专访《白话区块链》作者蒋勇:学习区块链空谈不如实践

    上周HiBlock区块链社区联合蒋勇老师推出课程 区块链技术概念及智能合约实践 课程上线一天内报名42人 3天时间报名80多人 其中70人通过审核 超额完成第一期招生 为保证学员学习效果 不得已提前关闭报名通道 近几天来 很多学员还在留言问
  • PBFT算法实现过程

    转载 https www jianshu com p 2383c7841d41 PBFT算法 三个阶段 预准备 pre prepare 准备 prepare 和确认 commit 步骤 从全网节点选举出一个主节点 Leader 新区块由主节
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记【01-课程简介】

    北大肖臻老师 区块链技术与应用 点击这里 全系列文章链接 点击这里 该系列文章中如有任何侵权内容请及时与我个人联系删除或修改 一 区块链的本质是什么 有人说区块链是下一代的价值互联网 也有人说它是世界上最慢的数据库 区块链出生以来就饱受争议
  • 解读:新基建为区块链带来的新机遇

    导读 区块链作为融合点对点传输 共识机制 加密算法等技术的分布式数据库技术 目前已渗透到数字金融 供应链管理 数字资产交易等多个领域 2019年10月 中共中央政治局集体学习区块链技术发展现状及趋势 2020年3月4日 中共中央政治局常务委
  • 农业掀起“上链”潮 区块链等数字技术正成为乡村振兴新动力

    目前区块链等数字技术已经广泛应用于农业全链条环节 近日 由中国宏观经济研究院课题组撰写的 数字技术赋能乡村产业发展报告 下简称 报告 指出 长期以来困扰乡村产业发展的难点 堵点正在逐渐被区块链等数字技术所消弭和破解 中国宏观经济研究院所做的
  • Ethereum架构的分析

    架构 1 顶层架构设计上 区块链可以简单的分为三个层次 协议层 扩展层和应用层 其中 协议层又可以分为存储层和网络层 它们相互独立但又不可分割 以太坊最上层的是DApp 它是整个区块链的展示层 通过Web3 js和智能合约层进行交换 如以太
  • 智慧合约:智能合约安全问题的AI解决方案

    一支穿云箭 千军万马来相见 在经历三个月 漫长熊市 后 从4月中旬开始 EOS的一个拉升 形成了数字货币市场大牛市的壮观景象 可是在美链BeautyChain BEC 的智能合约漏洞被黑客利用 随意刷币 SmartMesh SMT 智能合约
  • 区块链技术及应用概述

    一 基本概念 什么是区块链 区块链是一种以密码学方式保证的不可篡改和不可伪造的分布式账本 关键特点 去中心化 不可篡改性 匿名性 安全可信 区块链架构 1 数据层 主要描述区块链系统的物理形式 它是从Genesis区块开始的区块链链结构 包

随机推荐

  • K8S部署步骤:8-部署Master节点

    kubernetes master节点包含的组件 etcd flannel docker kube apiserver kube scheduler kube controller manager 目前这三个组件需要部署在同一台机器上 ku
  • python面试的3大重点,让你顺利拿到offer!

    5月已经过去大半个月了 马上就要迎来毕业季了 你准备好去面试了么 W3C咨询了不少python爬虫岗位从业者 如果你也打算从事python爬虫岗位 掌握这三个重点 能让你更顺利的get到理想的offer 1 Python 因为面试的是Pyt
  • C++入门——引用(重点!!!)

    文章目录 引用概念 引用特性 常引用 const 使用场景 1 做参数 输出型参数 2 做返回值 引用返回 引用和指针的区别 引用概念 引用不是新定义一个变量 而是给已存在的变量取了一个别名 编译器不会为引用变量开辟内存空间 它和它的引用变
  • springboot+MD5实现注册登录的密码的加密解密

    写在前面 你们好 我是小庄 很高兴能和你们一起学习mybatis 如果您对Java感兴趣的话可关注我的动态 写博文是一种习惯 在这过程中能够梳理知识和巩固知识点 需求 登录和注册的密码涉及到网络安全 对密码的加密能够在一定程度上增加安全性
  • linux shell字符串截取

    linux字符串截取很有用 有八种方法 有变量url https www test com 123 html 号截取 删除左边字符 保留右边字符 echo url 输出 www test com 123 html 其中url是变量名 是运算
  • 【极简代码】Unity控制3D物体的自由旋转 缩放和移动

    Unity中以最少代码 控制3D物体的自由旋转 缩放和移动 using UnityEngine public class TestMatrix MonoBehaviour float scaleparam 0f Vector3 oldSca
  • (2)一文懂“AI推理芯片” 测试方法与测试指标

    1 前言 Inference是用于测试系统使用训练有素的模型处理输入和产生结果的速度 1 1 缘起 随着人工智能应用的崛起 其在不同的硬件芯片平台上的性能也逐渐变成了比较不同硬件和芯片的重要参考 然而 最初由各个芯片厂商自行公布的跑分结果往
  • ros::spin()和ros::spinOnce()介绍讲解及区别

    首先要理解的一点是 任何一个发布和订阅 都会有其对应的发布缓存区和订阅缓存区 正如advertise和subscribe函数中都有缓存数量的参数 当有发布者发布消息后 会存放在发布缓存区 如果该topic有订阅者 则从发布缓存区读取到订阅缓
  • Redis数据类型

    业务数据的特殊性 数据类型既然是用来描述数据的存储格式的 如果你不知道哪些数据未来会进入到我们来的redis中 那么对应的数据类型的选择就会出现问题 原始业务功能设计 秒杀 他这个里边数据变化速度特别的快 访问量也特别的高 用户大量涌入以后
  • kali root默认密码_Kali Linux root 默认密码是:toor

    如果你听到一个 13 岁的黑客吹嘘他是多么的牛逼 是有可能的 因为有 Kali Linux 的存在 尽管有可能会被称为 脚本小子 但是事实上 Kali 仍旧是安全专家手头的重要工具 或工具集 Kali 是一个基于 Debian 的 Linu
  • java实现读取服务器日志文件,Java实时读取日志文件

    编码实现 写日志文件 每秒写200条记录 并且记录写的时间 import java io File import java io IOException import java io RandomAccessFile import java
  • vue配置开发环境和生产环境调用不同的域名以及跨域问题

    注意 这里vue项目与后端是前后端完全分离的 所有请求后端的地址是不一样的 安装axios npm install axios 然后 npm install save axios vue axios 用到post请求时 需要安装qs imp
  • Apache RocketMQ 5.0 消息进阶:如何支撑复杂的业务消息场景?

    一致性 首先来看 RocketMQ 的第一个特性 事务消息 事务消息是 RocketMQ 与一致性相关的特性 也是 RocketMQ 有别于其他消息队列的最具区分度的特性 以大规模电商系统为例 付款成功后会在交易系统中订单数据库将订单状态更
  • #101. 级数求和(3月31日)

    一 这题很简单我们只要注意高精度就行了 我一开始就是使用int型 傻傻算半天 int型 1 任何数 都只得整数 所以我们要用double来计算 只要从1开始一直网上循环摘要当我们的sn大于p时我们就停止循环 这题就是这样只要注意高精度就行了
  • linux链接jsoncpp库时,报一堆标准库错误的解决方法

    最近在一个工程中链接jsoncpp库 Makefile文件中添加包含路径代码 I usr local include json 编译时报错 usr include stdio h 821 错误 FILE 在此作用域中尚未声明 usr inc
  • 隐患重重遭诟病 细数固态硬盘“七宗罪”

    此内容转自网络 本人认为文章内容优秀 只作收藏 作为自己的知识库 并不用他用 原文链接地址为 http ssd zol com cn 471 4715723 all html 隐患重重遭诟病 细数固态硬盘 七宗罪 2015 02 28 19
  • vue.js -- slot插槽

    slot插槽 子组件提供给父组件使用的占位符 表示父组件可以占位符中填充内容 填充的内容会替换子组件的标签 插槽显不显示 怎样显示是由父组件来控制的 而插槽在哪里显示就由子组件来进行控制 slot作用域 slot在哪里调用 就使用哪里的数据
  • 数据管道(data pipeline)与ETL管道(ETL pipeline)的区别

    数据管道与ETL管道 这两个词的意义是相近的 差别比较微小 有时候很多人会混用 ETL管道 描述的是一组进程 实现将数据从一个系统抽取出来 经过转换 最终再加载到其他数据库或数据仓库中 数据管道 是一个比ETL管道更加通用的术语 只要是实现
  • 生成式AI:为开发者设计的革命性工具

    随着人工智能技术的飞速发展 生成式AI已成为许多领域的关键技术 生成式AI是指一类人工智能技术 能够通过学习数据集的内在规律和相关性 生成全新的 真实的 有用的数据 这种技术已经被广泛应用于图像 语音 自然语言处理等领域 成为人工智能领域的
  • 以太坊虚拟机EVM的工作原理是怎样的

    以太坊虚拟机EVM的工作原理是怎样的 如果你打算尝试在以太坊区块链上开发智能合约 或者已经在该领域工作了一段时间 可能会遇到EVM一词 EMV是太坊虚拟机的缩写 虚拟机本质上是在执行代码和执行的机器之间创建一个抽象级别 需要这一层抽象来提高