以太坊學習-以太坊虛擬機(二)

EVM介紹

以太坊虛擬機EVM是智能合約的運行環境

作爲區塊驗證協議的一部分,參與網絡的每個節點都會運行EVM。他們會查看正在驗證的塊中列出的交易,並運行由EVM中的交易觸發的代碼

EVM不僅是沙盒,而且是完全隔離的,也就是說在EVM中運行的代碼時無法訪問網絡、文件系統和其他進程的,甚至智能合約之間的訪問也是受限的

合約以字節的格式存放在區塊鏈上;合約通常以高級語言編寫,通過EVM編譯器編譯爲字節碼,最終通過客戶端上載部署到區塊鏈網絡中

EVM和交易

交易可以看作從一個賬戶發送到另一個賬戶消息,它可以包含二進制數據和以太幣

如果目標賬戶有代碼,代碼會在EVM中執行,並以payload作爲入參

如果目標賬戶是零賬戶,此交易就將創建一個新合約,用來創建合約的交易的payload會被轉換爲EVM,執行的輸出作爲合約代碼永久存儲

EVM和gas

合約被交易觸發調用,指令會在全網每個節點上執行:這需要消耗算力成本;

一經創建,每筆交易都按照一定數量的gas預付一筆費用,目的是限制執行交易所需要的工作量和爲交易支付手續費

EVM執行交易,gas按照特定規則逐漸消耗

gas price是交易發送者設置一個值,作爲發送者預付手續費的單價。如果交易執行後還有剩餘,gas會原路返還

EVM數據存儲

Storage

        每個賬戶都有一塊持久化的存儲空間,將256位字映射到256位字的key-value存儲區,相當於合約的數據庫

        永久存儲在區塊鏈中,由於會永久保存合約狀態變量,所以讀寫gas的開銷很大

Memory

        每一次消息調用,合約會臨時獲取一塊乾淨的內存空間

        生命週期僅爲整個方法執行期間,函數調用後回收,因爲僅保存臨時變量,故讀寫gas開銷較小

Stack

        EVM不是基於寄存器的,而是基於棧的,因此所有的計算都存在Stack上

        存放部分佈局值類型變量,幾乎免費使用的內存,有數量限制

EVM指令集

        所有的指令都是針對“256位的字”這個基本的數據類型來進行操作

        具備常用的算術、位、邏輯和比較操作,也可以做到有條件和無條件跳轉

        合約可以訪問當前區塊的相關屬性,比如他的塊高度和時間戳

    委託調用

        一種特殊類型的消息調用

        目標地址的代碼將在發起調用的合約上下文中執行,並且msg.sender和msg.value不變

        可以由此實現“庫”:可複用的代碼可以放在一個合約的存儲上,通過委託調用引入相應代碼

    合約的創建和自毀

      通過一個特殊的消息調用create calls,合約可以創建其他合約

      合約代碼從區塊鏈上移除的唯一方式是合約在合約地址上的執行自毀操作;合約賬戶上剩餘的以太幣會發送給指定的目標,然後其存儲和代碼從狀態中被移除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章