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