日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对于以太坊虚拟机 (EVM)及其相关知识的讲解

發(fā)布時(shí)間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对于以太坊虚拟机 (EVM)及其相关知识的讲解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以太坊虛擬機(jī)(EVM)

  • EVM是智能合約的運(yùn)行環(huán)境
  • 作為區(qū)塊驗(yàn)證協(xié)議的一部分,參與網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn)都會(huì)運(yùn)行EVM,審查節(jié)點(diǎn)會(huì)檢查驗(yàn)證正在驗(yàn)證的區(qū)塊中列出的交易,并運(yùn)行EVM中交易觸發(fā)的代碼
  • EVM是沙盒封裝的,并且是完全隔離的,即EVM中運(yùn)行的代碼是無法訪問網(wǎng)絡(luò)、文件系統(tǒng)和其他的進(jìn)程,甚至合約之間的訪問也是相互受到限制
  • 合約以字節(jié)碼格式存在于區(qū)塊鏈上
  • 合約通常以高級(jí)語言(solidity)編寫,通過EVM編譯器編譯為字節(jié)碼,最終通過客戶端部署到區(qū)塊鏈網(wǎng)絡(luò)中

EVM和賬戶

  • 以太坊中有兩類賬戶:外部賬戶和合約賬戶,他們共用EVM中同一個(gè)地址空間
  • 無論賬戶是否存儲(chǔ)代碼,兩類賬戶對(duì)于EVM來說處理方式是一樣的
  • 每個(gè)賬戶在EVM中都有一個(gè)鍵值隊(duì)形式的持久化存儲(chǔ)。其中key和value的長度都是256位,稱之為存儲(chǔ)空間(storage)

EVM和交易

  • 交易是指一個(gè)賬戶發(fā)送到另一個(gè)賬戶的消息,消息包含二進(jìn)制數(shù)據(jù)(payload)和以太幣
  • 如果目標(biāo)賬戶含有代碼,這個(gè)代碼就會(huì)在EVM中執(zhí)行,并以payload作為入?yún)?#xff0c;這就是合約的調(diào)用
  • 如果目標(biāo)賬戶是零賬戶(賬戶地址是0x000。。。),這個(gè)交易就會(huì)創(chuàng)建一個(gè)一個(gè)新合約,這個(gè)用來創(chuàng)建合約的交易的payload會(huì)被轉(zhuǎn)換為EVM字節(jié)碼并執(zhí)行,執(zhí)行的輸出作為合約代碼永久存儲(chǔ)

EVM和gas

  • 合約被交易觸發(fā)調(diào)用時(shí),指令會(huì)在全網(wǎng)的每個(gè)節(jié)點(diǎn)上執(zhí)行,這需要消耗算力成本,每一個(gè)指令的執(zhí)行都會(huì)有特定的消耗,gas是用來量化表示這個(gè)成本的消耗
  • 一經(jīng)創(chuàng)建,每一筆交易都會(huì)按照一定數(shù)量的gas預(yù)支付一筆費(fèi)用,目的是限制交易所需要的工作量和為交易支付手續(xù)費(fèi)
  • EVM執(zhí)行交易的時(shí)候,gas會(huì)按照特定的規(guī)則逐漸耗盡
  • gas price是交易發(fā)送者設(shè)置的一個(gè)數(shù)值,作為發(fā)送者預(yù)先支付的手續(xù)費(fèi)的單價(jià),如果交易完成之后,gas還有剩余,會(huì)原路返回
  • 無論執(zhí)行到什么位置,一旦gas被耗盡(比如降為負(fù)值)將會(huì)觸發(fā)out-of-gas的異常,當(dāng)前調(diào)用幀(call frame)所做的所有狀態(tài)修改就會(huì)回滾

EVM數(shù)據(jù)存儲(chǔ)

storage

  • 每一個(gè)賬戶都會(huì)有一個(gè)持久化的存儲(chǔ)空間,稱之為storage,這是一個(gè)將256位字映射到256位的key-value存儲(chǔ)區(qū),可以理解為合約的數(shù)據(jù)庫
  • 永久存儲(chǔ)在區(qū)塊鏈中,由于永久保存合約狀態(tài)變量,因此讀寫的gas開銷也是最大的

Memory(內(nèi)存)

  • 每一次消息的調(diào)用,合約會(huì)臨時(shí)獲取一塊干凈的內(nèi)存空間
  • 生命周期僅為整個(gè)方法的執(zhí)行期間,函數(shù)的調(diào)用回收,因?yàn)閮H僅保存臨時(shí)變量,所以gas的開銷較小

Stack(棧)

  • EVM不是基于寄存器的,而是基于棧的,因此所有的計(jì)算都是在一個(gè)被稱為棧(stack)的區(qū)域執(zhí)行
  • 存放部分局部值類型的變量,幾乎免費(fèi)使用的內(nèi)存,但是會(huì)有數(shù)量的限制

EVM指令集

  • 所有指令都是針對(duì)“256位的字”這個(gè)基本的數(shù)據(jù)類型來進(jìn)行操作
  • 具備常用的算數(shù)、位、邏輯和比較操作,也可以做到有條件和無條件跳轉(zhuǎn)
  • 合約可以訪問當(dāng)前區(qū)塊的相關(guān)屬性,比如區(qū)塊的高度和時(shí)間戳

消息調(diào)用(Massage calls)

  • 合約可以通過消息調(diào)用的方式來調(diào)用其它合約或者發(fā)送以太幣到非合約賬戶
  • 合約可以決定在其內(nèi)部的消息調(diào)用中,對(duì)于剩余的gas,應(yīng)該發(fā)送和保留多少
  • 如果在內(nèi)部消息調(diào)用時(shí)發(fā)生了out-of-gas異常(或者其它任何的異常),這將由一個(gè)被壓入棧頂?shù)腻e(cuò)誤值所指明;此時(shí),只有與該內(nèi)部消息調(diào)用一起發(fā)送的gas會(huì)被消耗掉

委托調(diào)用(Delegatecall)

  • 一種特殊類型的消息調(diào)用
  • 目標(biāo)地址的代碼將會(huì)在發(fā)起調(diào)用的合約的上下文中執(zhí)行,并且msg.sender和msg.value不會(huì)變
  • 可以由實(shí)現(xiàn)“庫”(library):可以反復(fù)使用的代碼庫放到一個(gè)合約的存儲(chǔ)上,通過委托調(diào)用引入相應(yīng)代碼

合約的創(chuàng)建和自毀

  • 通過一個(gè)特殊的消息調(diào)用create calls,合約可以創(chuàng)建其它合約(不是簡簡單單的調(diào)用零地址)
  • 合約代碼從區(qū)塊鏈上移除的唯一的方式就是合約在合約地址上執(zhí)行自毀操作selfdestruct;合約賬戶剩余的以太幣會(huì)發(fā)送指定的目標(biāo),然后其存儲(chǔ)和代碼都會(huì)從狀態(tài)中被移除

總結(jié)

以上是生活随笔為你收集整理的对于以太坊虚拟机 (EVM)及其相关知识的讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。