对于以太坊虚拟机 (EVM)及其相关知识的讲解
以太坊虚拟机(EVM)
- EVM是智能合约的运行环境
- 作为区块验证协议的一部分,参与网络的每个节点都会运行EVM,审查节点会检查验证正在验证的区块中列出的交易,并运行EVM中交易触发的代码
- EVM是沙盒封装的,并且是完全隔离的,即EVM中运行的代码是无法访问网络、文件系统和其他的进程,甚至合约之间的访问也是相互受到限制
- 合约以字节码格式存在于区块链上
- 合约通常以高级语言(solidity)编写,通过EVM编译器编译为字节码,最终通过客户端部署到区块链网络中
EVM和账户
- 以太坊中有两类账户:外部账户和合约账户,他们共用EVM中同一个地址空间
- 无论账户是否存储代码,两类账户对于EVM来说处理方式是一样的
- 每个账户在EVM中都有一个键值队形式的持久化存储。其中key和value的长度都是256位,称之为存储空间(storage)
EVM和交易
- 交易是指一个账户发送到另一个账户的消息,消息包含二进制数据(payload)和以太币
- 如果目标账户含有代码,这个代码就会在EVM中执行,并以payload作为入参,这就是合约的调用
- 如果目标账户是零账户(账户地址是0x000。。。),这个交易就会创建一个一个新合约,这个用来创建合约的交易的payload会被转换为EVM字节码并执行,执行的输出作为合约代码永久存储
EVM和gas
- 合约被交易触发调用时,指令会在全网的每个节点上执行,这需要消耗算力成本,每一个指令的执行都会有特定的消耗,gas是用来量化表示这个成本的消耗
- 一经创建,每一笔交易都会按照一定数量的gas预支付一笔费用,目的是限制交易所需要的工作量和为交易支付手续费
- EVM执行交易的时候,gas会按照特定的规则逐渐耗尽
- gas price是交易发送者设置的一个数值,作为发送者预先支付的手续费的单价,如果交易完成之后,gas还有剩余,会原路返回
- 无论执行到什么位置,一旦gas被耗尽(比如降为负值)将会触发out-of-gas的异常,当前调用帧(call frame)所做的所有状态修改就会回滚
EVM数据存储
storage
- 每一个账户都会有一个持久化的存储空间,称之为storage,这是一个将256位字映射到256位的key-value存储区,可以理解为合约的数据库
- 永久存储在区块链中,由于永久保存合约状态变量,因此读写的gas开销也是最大的
Memory(内存)
- 每一次消息的调用,合约会临时获取一块干净的内存空间
- 生命周期仅为整个方法的执行期间,函数的调用回收,因为仅仅保存临时变量,所以gas的开销较小
Stack(栈)
- EVM不是基于寄存器的,而是基于栈的,因此所有的计算都是在一个被称为栈(stack)的区域执行
- 存放部分局部值类型的变量,几乎免费使用的内存,但是会有数量的限制
EVM指令集
- 所有指令都是针对“256位的字”这个基本的数据类型来进行操作
- 具备常用的算数、位、逻辑和比较操作,也可以做到有条件和无条件跳转
- 合约可以访问当前区块的相关属性,比如区块的高度和时间戳
消息调用(Massage calls)
- 合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户
- 合约可以决定在其内部的消息调用中,对于剩余的gas,应该发送和保留多少
- 如果在内部消息调用时发生了out-of-gas异常(或者其它任何的异常),这将由一个被压入栈顶的错误值所指明;此时,只有与该内部消息调用一起发送的gas会被消耗掉
委托调用(Delegatecall)
- 一种特殊类型的消息调用
- 目标地址的代码将会在发起调用的合约的上下文中执行,并且msg.sender和msg.value不会变
- 可以由实现“库”(library):可以反复使用的代码库放到一个合约的存储上,通过委托调用引入相应代码
合约的创建和自毁
- 通过一个特殊的消息调用create calls,合约可以创建其它合约(不是简简单单的调用零地址)
- 合约代码从区块链上移除的唯一的方式就是合约在合约地址上执行自毁操作selfdestruct;合约账户剩余的以太币会发送指定的目标,然后其存储和代码都会从状态中被移除
对于以太坊虚拟机 (EVM)及其相关知识的讲解相关推荐
- 以太坊虚拟机EVM的缺陷与不足
首先对作者做个简单的自我介绍,Jordan Earls是Qtum量子链的联合创始人之一,目前担任Qtum量子链全球首席工程师.Qtum目前采用了以太坊虚拟机(Ethereum Virtual Mach ...
- 以太坊虚拟机EVM究竟是个啥
基本概念 EVM(ETHereum Virtual Machine)是「以太坊虚拟机」的缩写.如果你有一些软件开发的背景,一定听过java虚拟机.通俗的解释java虚拟机的就是: 我们写的java代码 ...
- 深入了解以太坊虚拟机
本文由币乎社区(bihu.com)内容支持计划赞助. 译者说,深入了解以太坊虚拟机是一个系列的文章,一共5篇! 本文是第1篇,主要介绍的是以太坊虚拟机汇编代码基础.后续的4篇译文链接在本文的结尾处. ...
- 深度剖析以太坊虚拟机(EVM)的未来:Ewasm
以太坊是具有内置图灵完备编程语言的区块链.任何人都可以使用以太坊智能合约来创建去中心化应用程序."以太坊虚拟机(EVM)是以太坊处理智能合约部署和执行的一部分"(Antonopou ...
- 从比特币脚本引擎到以太坊虚拟机
这个系列是目标受众是区块链开发者和有其他开发经验的CS专业学生 面对媒体对区块链相关技术的解读和吹捧,许多人一时不知所措.投资人.大公司都在FOMO(fear of missing out)的心理驱动 ...
- 写给开发者——从比特币脚本引擎到以太坊虚拟机
这个系列的目标受众是区块链开发者和CS专业同学 面对媒体对区块链相关技术的解读和吹捧,许多人一时不知所措.投资人.大公司都在FOMO(fear of missing out)的心理驱动下,争相宣布al ...
- solidity智能合约[37]-以太坊虚拟机数据存储
EVM 当调用solidity函数时,都会在以太坊虚拟机当中来执行.因此了解以太坊虚拟机的细节,了解其数据的存储机制变得尤为重要. 以太坊虚拟机中的空间分为3大部分.分别为storage.stack与 ...
- 以太坊源码深入分析(9)-- 以太坊通过EVM执行交易过程分析
上一节分析了同步一个新的区块准备插入本地BlockChain之前需要重放并执行新区块的所有交易,并产生交易收据和日志.以太坊是如何执行这些交易呢?这就要请出大名鼎鼎的以太坊虚拟机. 以太坊虚拟机在执行 ...
- 以太坊+IPFS+WEB 电商平台开发讲解
以太坊+IPFS+WEB 电商平台开发讲解 作者: AlexTan CSDN: http://blog.csdn.net/alextan_ Github: https://github.com/Ale ...
最新文章
- Python3学习笔记(一):基础语法
- [Contest20171109]函数(lipshitz)
- TabHost的使用(一)
- Struts 2常见应用
- python 获取系统相关编码的函数
- java 下载图片 弹出框_javaweb多图片打包下载,弹出提示框问题_html/css_WEB-ITnose
- LeetCode 295. Find Median from Data Stream
- 利用Update Manager将ESXi 5.1 Update2升级为ESXi 6.5 Update1
- 剑指Offer丑数问题
- Spring AOP(三)之AfterThrowing增强处理
- javascript写的一个练习打字的小程序
- mysql学历统计表,MySQL统计表优化
- java中函数的调用,java中如何调用函数
- vmware的ubuntu虚拟机屏幕太小解决办法
- namedtuple
- 带传动产生松边和紧边的原因
- SN_Writer写IMEI号
- 使用uploadify进行上传
- CNC脱机源代码 USB雕刻机CNC 3联动 步进电机控制器CNC脱机源代码
- github.io连接被重置的解决办法
热门文章
- pycharm使用_后端开发使用pycharm的技巧
- linux find显示文件的基本信息,命令find搜索文件,命令stat查看文件的详细信息
- 【转】Ubuntu 16.04 Nvidia驱动安装(run方式)
- 【转】Git Shell 基本命令(官网脱水版)
- 【转】WPF从我炫系列3---内容控件的用法
- 【转】[完全免费] 在线UML Sequence Diagram 时序图工具 - 教程第3部分
- 【转】Magento2 数据库操作
- .NET 实现并行的几种方式(三)
- ASP.NET MVC 入门1、简介
- 【转】ORM系列之Entity FrameWork详解