对于以太坊虚拟机 (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;合约账户剩余的以太币会发送指定的目标,然后其存储和代码都会从状态中被移除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于以太坊的Solidity语言介绍

Solidity是什么 Solidity是一门面向合约的、为实现智能合约而创建的高级编程语言,主要目的是为了在以太坊虚拟机(EVM)上运行Solidity是静态语言,支持继承、库和复杂的用户定义等特性内含的类型除了常见的编程语言中的标准类型&am…

live555 接收rtsp视频流流程分析

live555 接收rtsp视频流流程分析 RTSP交互流程 C表示RTSP客户端,S表示RTSP服务端 ① C->S: OPTIONrequest //询问S有哪些方法可用 S->C: OPTION response //S回应信息中包括提供的所有可用方法 ② C->S: DESCRIBErequest //要求得到S…

使用Remix编写Solidity语言的小例子

设置数值/取数值/加法运算 讲解 uint默认使用256位数的整型view表示这个函数仅仅对于数据仅仅是读取,没有修改操作returns(uint ),如果单纯指定uint,返回的是函数体内的return值,如果包含uint sum,uint SAD_a,那么返…

RTP协议栈简介

流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术,本文介绍如何在L…

深入理解Solidity

Solidity源文件布局 pragma(版本杂注) 用于指定源文件的版本,表明编译器的版本,例如 pragma solidity ^0.4.0^用于指代版本号需要大于0.4.0但是不可以超过大的层级,必须小于0.5.0也可以使用大于等于小于来指定版本 i…

H264 流媒体 编码汇总

实时传输协议(RTP)和实时控制协议(RTCP) RTP是一种提供端对端传输服务的实时传输协议,用来支持在单目标广播和多目标广播网络服务中传输实时数据,而实时数据的传输则由RTCP协议来监视和控制。 RTP定义在RFC…

使用多线程的方式调用chineseocr_API

ChineseOCR在线API 网页链接 界面 提供多种接口调用方式,比如在线调用、Javascript api调用、curl api调用和python api调用四种方式,本次使用javascript api调用的方式进行OCR识别代码 import glob import base64 import os import requests import …

开源好代码 音视频

VirtualDub 一、简介 图1VirtualDub主界面 VirtualDub是一款开源的音视频捕获、处理软件。VirtualDub也可称为一款多媒体编辑软件,因为它包含了多媒体输入、编辑、处理、输出等各个环节,但是作者并未将它定位为一款多媒体编辑软件(参见官网&a…

MAC对于Excel表格换行操作

按住option之后,点击Enter就可以完成换行操作

深入理解Solidity 二

Solidity数据位置 所有复杂的数据类型,即数组、结构和映射类型,都会有一个额外属性“数据位置”,用来指定数据的存储位置,即数据是存储在memory还是存储在storage里面根据上下文环境,IDE会自动指定数据的默认存储位置…

VOIP简介

一、什么是VOIP VOIP全称为(VoiceOver Internet Protocol),是一种利用Internet网络进行语音通信的技术,更通俗一点说,就是IP电话。就是以IP分组交换网为传输平台,对模拟的语音信号进行编码压缩&#xff0c…

深入理解Solidity 三

Solidity函数声明和类型 函数的值类型有两类:内部(internal)类型和外部(external)类型内部函数只可以在当前合约内部被调用(即在当前代码块内,包括内部库函数和继承函数)&#xff0c…

HTTP状态代码及其定义

状态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。在大多数情况下,除了Content-Type之外的所有应答头都是可选的。但Content-Type是必需的,它描述的是后面文档的MIME类型。虽然大多数应答都包含一个文档,但也有一些不包含&#…

安装solc模块4.25版本

使用国产阿里云的cnpm 如果不知道cnpm 参考链接 安装solc模块4.25版本 npm i solc0.4.25 --save -g查看安装是否成功 可以配置软连接使用solc,我的没有配置 solcjs --version

conda关键命令

创建环境 创建名字为python3的虚拟环境,并且指定conda的python版本为3.6--name也可以缩写为-namepython3.6 是指定python的版本号,如果不指定就默认为装anaconda时python版本python3是创建的新的虚拟环境的名字,创建完,虚拟环境安装在anacon…

GDB 调试程序 详解 使用实例

用GDB调试程序 GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化…

在pycharm中使用conda虚拟环境(conda虚拟环境是已经创建好的),解决python安装包文件很费劲的问题

查看conda的虚拟环境 使用PyCharm连接conda创建的虚拟环境,需要一个前提就是虚拟环境必须存在,使用conda env list命令查看虚拟环境列表打开PyCharm软件 打开pycharm,选择File->setting->Project:****->Project Interperter&#…

YUV测试序列下载地址

1、http://www.tkn.tu-berlin.de/research/vid/(此网站已经移走,正在寻找。) CIF: Akiyo、Bridge (far) 、Bridge (close) 、Bus 、Container 、Coastguard 、Flower 、Football 、Foreman 、Hall 、Highway 、Mobile & Calen…

flask 安装flask_resultful

命令如下 conda install -c https://conda.anaconda.org/conda-forge flask-restful

完成一个H.265/HEVC码流分析工具

经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具。时间包括平时的周末、晚上,以及调休的集中时间。当然,中秋回家过节不写代码。截至今天,经过多种H.265序列测试,也有各种工具对比,基…