對于以太坊虛擬機 (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.pswp.cn/news/447196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447196.shtml
英文地址,請注明出處:http://en.pswp.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序列測試,也有各種工具對比,基…