以太坊虚拟机EVM

2024-01-04 22:38
文章标签 虚拟机 evm 以太

本文主要是介绍以太坊虚拟机EVM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

以太坊虚拟机EVM是智能合约的运行环境
作为区块验证协议的一部分,参与网络的每个节点都会运行EVM。他们会检查正在验证的块中列出的交易,并运行由EVM中交易触发的带代码
EVM不仅是沙盒封装的,而且是完全隔离的,也就是说在EVM中运行的代码时无法访问网络、文件系统和其他进程的,甚至智能合约之间的访问也是受限的。
合约以字节码的格式存在于区块链上。
合约通常以高级语言(solidity)编写,通过EVM编译器编译为字节码,最终通过客户端上载部署到区块链网络中。

EVM和账户

以太坊有两类账户:外部账户和合约账户,它们共用EVM中同一个地址空间
无论账户是否存储代码,这两类账户对EVM来说处理方式一样。
每个账户在EVM中有一个键值对形式的持久化存储。其中key和value的长度都是256位,称之为存储空间。

EVM和交易

交易可以看作从一个账户到另一个账户的消息,它可以包含二进制数据和以太币
如果目标账户含有代码,此代码会在EVM中执行,并以payload作为入参,这就是合约的调用
如果目标账户时零账户,此交易就将创建一个新合约,这个用来创建合约的交易的payload会被转换为EVM字节码并执行,执行的输出作为合约代码永久存储。

EVM和gas

合约被交易触发调用时,指令会在全网的每个节点上执行:这需要消耗算力成本;每一个指令的执行都有特定的消耗,gas就用来量化表示这个成本消耗
一经创建,每笔交易都按照一定数量的gas预付一笔费用,目的时限制执行交易所需要的工作量和为交易支付手续费。
EVM执行交易时,gas将按特定的规则逐渐耗尽
gas price时交易发送者设置的一个值,作为发送者预付手续费的单价,如果交易执行后还有剩余,gas会原路返回
无论执行到什么位置,一旦gas被耗尽,将会触发一个out-of-gas异常,当前调用帧所做的所有状态修改都将被回滚。

EVM数据存储

storage:每个账户都有一块持久化的存储空间,称为storage,这是一个将256位字映射到256位字的key-value存储区,可以理解为合约的数据库
永久存储在区块链中,由于会永久保存合约状态变量,所以读写的gas开销也最大。
Memory:每一次消息调用,合约会临时获取一块干净的内存空间,生命周期仅为整个方法执行期间,函数调用后回收,因为仅保存临时变量,故读写gas开销较小
Stack:EVM不是基于寄存器的,而是基于栈的,因此所有的计算都在一个称为栈的区域执行
存放部分局部值类型变量,几乎免费使用的内存,但有数量限制。

EVM指令集

所有的指令都是针对“256位的字(word)”这个基本的数据类型来进行操作
具备常用的算术、位、逻辑和比较操作,也可以做到有条件和无条件跳转
合约可以访问当前区块的相关属性,比如它的块高度和时间戳。

消息调用

合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户
合约可以决定在其内部的消息调用中,对于剩余的gas,应发送和保留多少
如果在内部消息调用时发生了out-of-gas异常,这将由一个被压入栈顶的错误值所指明:此时只有与该内部消息调用一起发送的gas会被消耗掉。

委托调用(delegatecall)

一种特殊类型的消息调用
目标地址的代码将在发起调用的合约的上下文中执行,并且msg.sender和msg.value不变
可以由此实现“库”:可复用的代码库可以放在一个合约的存储上,通过委托调用引入相应代码

合约的创建和自毁

通过一个特殊的消息调用create calls,合约可以创建其它合约
合约代码从区块链上移除的唯一方式是合约在合约地址上执行自毁操作selfdestruct:合约账户上剩余的以太币就会发送给指定的目标,然后其存储和代码从状态中被移除。

这篇关于以太坊虚拟机EVM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570823

相关文章

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

虚拟机ubuntu配置opencv和opencv_contrib

前期准备  1.下载opencv和opencv_contrib源码 opencv-4.6.0:https://opencv.org/releases/ opencv_contrib-4.6.0:https://github.com/opencv/opencv_contrib 在ubuntu直接下载或者在window上下好传到虚拟机里都可以 自己找个地方把他们解压,个人习惯在home下新建一

OpenStack创建虚拟机过程

OpenStack创建虚拟机过程 一、在分析OpenStack创建虚拟机的过程之前,先来梳理一下需要用用到哪些组件。 二、每一步都需要去keystone去进行验证,下图有详细的流程。 登录界面或命令行通过RESTful API向keystone获取认证信息。keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。界面或命令行通过RESTful API

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成,软件打开效果一、VMware安装Windows11虚拟机1️⃣:准备镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:安装虚拟机5️⃣:解决连不上网问题 安装完成!!! Win11安装完成,软件打开效果 一、VMware安装Windows11虚拟机 首先确保自己的mac开启了网络共享。不然虚拟机连不上👀的 1️⃣:准备镜像

SSH连接虚拟机中的Ubuntu 12.0.4

摘要:主要是解决不能使用ssh远程Ubuntu的问题、使用的远程工具是putty、也可以使用xshell、ubunut12.0.4是装在虚拟机中的、不过这个应该没有什么影响。 一:问题的出现 前两天使用VMware装了一个ubuntu12.0.4之后、因为常常使用命令行、又喜欢在虚拟机与实体机中切来切去、感觉很不方便、就想在xp中远程ubuntu、遇到了点小意外、经过一会调试解决成功、把

用了虚拟机后,本机摄像头打不开了(联想电脑thinkpad)

虚拟机有摄像头,我断开了连接,现在本机的摄像头打开就是一个锁 我先把虚拟机的摄像头关了 然后把本机的vm usb关闭了 Win+R),输入services.msc,找到VMware USB Arbitration Service,确保其状态为“关闭 然后打开桌面助手 开启 参考: 联想知识库

Java虚拟机垃圾回收的几个关键问题

20151008 GC的几个关键问题,触发条件,触发的机制 主线是数据的移动,从什么位置到什么位置,移动的条件是什么? 1 垃圾收集在什么时候触发? GC都是在带满了的时候触发的,每次触发都是把不会用的不可达的对象空间回收了,留下还在用的对象。 1) MinorGC的触发是伊甸园空间满的时候 2) FullGC的触发是在老年代满的时候 2 垃圾回收的时候做哪些工作? 1) 一个新的对象new出

最强虚拟机,内置强大插件,绝!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 天给大家安利两款移动端的虚拟机软件,均支持超级权限、Xposed框架和谷歌服务,而其中一款可谓称得上最强虚拟机,不仅含有虚拟机的基本功能,还能多开分身、模拟器以及强大的插件社区,能实现的功能超乎你的想象,一起来看看吧! X8沙箱(安卓) 软件介绍 X8沙箱(手机版的安卓模拟器、虚拟机、多开分身、游戏双开多开挂机)是一款极简、

【虚拟机/服务器】XAMPP错误: Apache shutdown unexpectedly解决办法

XAMPP安装好之后启动,但有些用户在启动apache的时候会出现: 11:41:38 [Apache] Status change detected: running11:41:38 [Apache] Status change detected: stopped11:41:38 [Apache] Error: Apache shutdown unexpectedly.11:41:38