時間:2023-08-15|瀏覽:297
那么,以太坊虛擬機是什么?請耐心聽我一一道來。
第一:以太坊賬戶 以太坊中有兩類賬戶,一類是外部賬戶,一類是合約賬戶。它們之間的區(qū)別在于控制權(quán)的不同。外部賬戶由公鑰-私鑰對控制,而合約賬戶內(nèi)部的代碼控制。不過,它們共用一個地址空間。外部賬戶的地址由公鑰決定,合約賬戶的地址在創(chuàng)建合約時確定(根據(jù)合約創(chuàng)建者的地址和發(fā)出的交易數(shù)量計算得到,也稱為"nonce")。合約賬戶中存儲了代碼,而外部賬戶沒有。除此之外,兩類賬戶幾乎沒有其他區(qū)別。
第二:以太坊交易 一筆交易是從一個賬戶發(fā)送到另一個賬戶的消息(可以是同一個賬戶或者零賬戶)。交易可以攜帶二進制數(shù)據(jù)(payload)和以太幣。如果目標賬戶包含代碼,該代碼將被執(zhí)行,payload即為輸入數(shù)據(jù)。如果目標賬戶的地址是0,那么交易將創(chuàng)建一個新的合約。新合約的地址不是0,記住這一點很重要,因為接下來我們會為此進行工作。新合約的地址根據(jù)合約創(chuàng)建者的地址和發(fā)出的交易數(shù)量(也稱為nonce)計算得到。創(chuàng)建合約交易的payload將執(zhí)行的結(jié)果將永久存儲下來。這意味著,創(chuàng)建合約時,你無需將真正的合約代碼發(fā)送給合約,只需發(fā)送一個能夠返回真正代碼的代碼即可。
第三:Gas Gas可以理解為傳統(tǒng)金融業(yè)務中的手續(xù)費。在以太坊網(wǎng)絡中,每筆交易都會收取一定數(shù)量的gas,gas的作用是限制執(zhí)行交易的工作量,并為執(zhí)行支付費用。在EVM執(zhí)行交易時,gas將按照特定規(guī)則逐漸消耗。交易的創(chuàng)建者設置gasprice(以太幣計),發(fā)送賬戶需要預付交易費用=gasprice×gasamount。如果執(zhí)行結(jié)束后還有剩余的gas,這些gas將退還給發(fā)送賬戶。但一旦gas被耗盡(比如變?yōu)樨撝担瑢⒂|發(fā)一個out-of-gas異常,當前調(diào)用幀所做的所有狀態(tài)修改都將被回滾。
第四:存儲、主存和棧 每個賬戶都有一個持久化的存儲區(qū)域,叫做存儲。存儲以鍵值對的形式存在,鍵和值都是256位長。在合約中,不能直接遍歷賬戶的存儲。相對于其他操作,存儲的讀取操作相對較慢,修改操作更是如此。一個合約只能對自己的存儲進行讀寫。第二個內(nèi)存區(qū)域叫做主存。每次消息調(diào)用時,都會有一個新的、被清除過的主存。主存可以逐字節(jié)進行尋址,但讀寫操作以32字節(jié)(256位)為單位。操作主存的開銷隨著其規(guī)模增長而增加(平方級別)。
通過以上介紹,可以得出一個重要信息,那就是EVM是基于棧而不是寄存器的虛擬機。所有的計算都在一個叫做棧的區(qū)域執(zhí)行。棧最多可以有1024個元素,每個元素有256位。對棧的訪問僅限于棧頂,可以將棧頂?shù)?6個元素之一復制到棧頂,或者將棧頂元素和下面的16個元素之一交換。其他操作只能取棧頂?shù)膬蓚€元素并將結(jié)果壓入棧頂。當然,可以將棧上的元素存儲到存儲或主存中,但無法直接訪問棧中指定深度的元素,必須先移除指定深度之上的所有元素才能訪問。
用通俗的話來解釋以太坊虛擬機,舉個例子,想象一下你要裝修房子,但裝修不是一次性把所有的家具擺放在一起,這樣會顯得雜亂無章、不美觀。為了避免這種情況,我們會提前制定裝修計劃,或者使用SketchUp軟件模擬一個三維空間來繪制規(guī)劃圖紙。
以太坊虛擬機就扮演著這樣的角色,它生成現(xiàn)有操作系統(tǒng)的虛擬鏡像,具有和真實操作系統(tǒng)完全一樣的功能。這為區(qū)塊鏈應用的開發(fā)提供了一種虛擬的測試環(huán)境,因此在區(qū)塊鏈的技術支持方面非常重要。
在這個框架下,ORION集成了EVM模塊,并使用Substrate的contract pallet來支持Solidity智能合約的開發(fā)和運行。這不僅有利于快速開發(fā)和調(diào)用鏈上智能合約,也為與以太坊的跨鏈互操作提供了兼容性。
獵戶座在虛擬機和區(qū)塊鏈的其他部分之間提供了一個環(huán)境無關的接口。通過統(tǒng)一的獵戶座API,區(qū)塊鏈軟件的各個組件可以使用一種通用語言進行通信,而無需學習新技巧。使用獵戶座,其他軟件組件無需針對特殊情況、異常或奇怪的代碼進行編程,獵戶座提供了一個穩(wěn)定、安全且前瞻性的平臺來集成不同的虛擬機,而無需了解任何虛擬機的代碼。
在獵戶座中,可以執(zhí)行智能合約代碼,合約的狀態(tài)或內(nèi)存存儲在智能合約地址中。可以將這種存儲看作是位于智能合約地址上的無限長度的數(shù)據(jù)結(jié)構(gòu)數(shù)組。存儲機制確保存儲位置不沖突,并遵循一組規(guī)則。使用這些規(guī)則,可以解碼任何合約的狀態(tài)。要解碼存儲在映射中的數(shù)據(jù),需要了解所使用的密鑰。