系統(tǒng)的運(yùn)行模型說(shuō)明如何通過(guò)字節(jié)碼的指令和簡(jiǎn)單的環(huán)境數(shù)據(jù)來(lái)修改系統(tǒng)的狀態(tài),我們知道以太坊是一個(gè)大型的狀態(tài)機(jī)犀忱,運(yùn)行模式就是通過(guò)虛擬狀態(tài)機(jī)的模式來(lái)說(shuō)明這個(gè)狀態(tài)遷移的過(guò)程,這個(gè)虛擬狀態(tài)機(jī)也被稱作以太坊虛擬機(jī)(EVM)。這個(gè)虛擬機(jī)是偽圖靈完備的虛擬機(jī)女责,因?yàn)橐蕴粏为?dú)設(shè)置了停機(jī)機(jī)制耳鸯,如果gas消耗完湿蛔,虛擬機(jī)就會(huì)停止運(yùn)行。
虛擬機(jī)簡(jiǎn)介
EVM是個(gè)棧式的架構(gòu)县爬,其一個(gè)字的大小事256比特位煌集,之所以選擇這樣的大小,是為了適應(yīng)Keccak-256 hash算法和橢圓曲線函數(shù)計(jì)算捌省。其內(nèi)存是一個(gè)以字為尋址單位的字節(jié)序數(shù)組苫纤,棧可以最多容納1024個(gè)字纲缓。除了內(nèi)存的設(shè)計(jì)卷拘,虛擬機(jī)設(shè)計(jì)了存儲(chǔ),他與內(nèi)存類(lèi)似祝高,只是他是一個(gè)以字為尋址方式的字的數(shù)組栗弟,而不是字節(jié)數(shù)組,同時(shí)內(nèi)存的數(shù)據(jù)是可以擦除的工闺,存儲(chǔ)的數(shù)據(jù)是不可擦除的乍赫。所有的內(nèi)存數(shù)據(jù)和存儲(chǔ)數(shù)組在初始化為0瓣蛀。
虛擬機(jī)與馮諾依曼架構(gòu)的計(jì)算機(jī)不同,他沒(méi)有將可執(zhí)行程序放在磁盤(pán)或者內(nèi)存雷厂,而是將可執(zhí)行代碼放在了虛擬的ROM中惋增,并且只有部分質(zhì)量可以修改這段代碼。
虛擬機(jī)可以因?yàn)槎喾N異常原因停止運(yùn)行改鲫,包括棧擊穿異常诈皿,gas異常耗盡,指令異常像棘,當(dāng)這些異常發(fā)生之后稽亏,狀態(tài)機(jī)機(jī)會(huì)遷移到異常停機(jī)狀態(tài),并且將錯(cuò)誤上報(bào)給執(zhí)行代碼的代理缕题,比如交易或者消息調(diào)用等截歉,并且分別進(jìn)行下一步處理。在前面的章節(jié)中我們已經(jīng)定義了交易和消息調(diào)用在虛擬機(jī)代碼指令發(fā)生異常的情況下烟零,狀態(tài)遷移函數(shù)是如何處理的怎披。
費(fèi)用概覽
虛擬機(jī)的運(yùn)行費(fèi)用是通過(guò)gas的方式來(lái)標(biāo)定的,在執(zhí)行一個(gè)操作之前有3種前置費(fèi)用瓶摆,第一種是計(jì)算操作本身需要消耗的gas凉逛,這個(gè)在前面的幾節(jié)中講解過(guò),第二種是消息調(diào)用和智能合約的創(chuàng)建指令需要消耗gas群井,第三種是因?yàn)閮?nèi)存的消耗需要支付的費(fèi)用状飞。
內(nèi)存的消耗與整個(gè)程序消耗的內(nèi)存除以32字節(jié)的倍數(shù)成正比,如果一個(gè)內(nèi)存大小對(duì)32字節(jié)不能乘除則去上界作為衡量費(fèi)用的標(biāo)準(zhǔn)书斜。
存儲(chǔ)的費(fèi)用計(jì)算有點(diǎn)特殊诬辈,如果一個(gè)指令是旨在清除他在存儲(chǔ)單元上的存儲(chǔ)空間,不光這樣的指令不收取費(fèi)用荐吉,相反會(huì)獲得一定的費(fèi)用獎(jiǎng)勵(lì)焙糟。所有虛擬機(jī)消耗gas的公式在后面的章節(jié)中會(huì)詳細(xì)的講解.
運(yùn)行的環(huán)境變量
我們知道除了全局狀態(tài)和執(zhí)行需要消耗的gas之外,任何程序運(yùn)行都需要與宿主機(jī)的設(shè)備環(huán)境變量交互才可以在具體的機(jī)器上執(zhí)行样屠,這里的機(jī)器是個(gè)虛擬機(jī)穿撮,其環(huán)境變量相對(duì)簡(jiǎn)單:
公式1是對(duì)環(huán)境變量的定義,公式2表示虛擬機(jī)需要執(zhí)行的代碼的所有者賬戶對(duì)應(yīng)的地址痪欲,公式3表示發(fā)起此次事務(wù)的發(fā)送者的地址悦穿,公式4表示代碼運(yùn)行是需要的數(shù)據(jù),公式5表示gas的價(jià)格业踢,公式6表示出發(fā)次代碼執(zhí)行的賬戶的地址栗柒,對(duì)于交易就是轉(zhuǎn)賬人地址,公式7代碼執(zhí)行涉及的價(jià)值轉(zhuǎn)移額度知举,如果是一筆轉(zhuǎn)賬交易瞬沦,那么這個(gè)值表示轉(zhuǎn)賬額度太伊,公式8表示虛擬機(jī)需要執(zhí)行的代碼的字節(jié)序,公式9表示當(dāng)前區(qū)塊的區(qū)塊頭逛钻,公式10表示當(dāng)前虛擬機(jī)執(zhí)行棧深度公式11表示是否允許修改全局狀態(tài)機(jī)的狀態(tài)僚焦。
在整個(gè)運(yùn)行模型的定義中,我們定義一種狀態(tài)遷移的函數(shù)绣的,這個(gè)函數(shù)我們前一節(jié)剛剛講完,他的作用就是修改狀態(tài)欲账,記錄最新的gas值并產(chǎn)生輸出結(jié)果屡江,公式13表示累計(jì)的子狀態(tài)的定義,這個(gè)在前面的章節(jié)中已經(jīng)給出過(guò)詳細(xì)的解釋赛不。