012:EVM框架|《ETH原理與智能合約開發(fā)》筆記

待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》窘面,馬良老師講授。此簡書文集記錄我的學(xué)習(xí)筆記末早。

課程共8節(jié)課寨昙。其中,前四課講ETH原理午绳,后四課講智能合約。
第四課分為三部分:

  1. Ethash算法
  2. EVM框架
  3. Bloom Filter / Recipt

這篇文章是第四課第二部分的學(xué)習(xí)筆記:EVM框架。


這節(jié)課介紹的是以太坊虛擬機(jī)的設(shè)計框架杜跷。智能合約是以太坊的靈魂,而虛擬機(jī)是執(zhí)行合約的環(huán)境矫夷。

1葛闷、EVM的設(shè)計理念

以太坊虛擬機(jī)有一定的復(fù)雜性,其復(fù)雜性在于:需要考慮以太坊特殊的數(shù)據(jù)結(jié)構(gòu)双藕、區(qū)塊鏈的特點淑趾、Gas的計價策略,特定的密碼學(xué)操作蔓彩,等等治笨。

其設(shè)計理念如下:

  • Stack/memory 模型。它是一個基于棧的虛擬機(jī)赤嚼。
  • 32 Bytes的Word旷赖。棧中的每一個元素非常大,占32個字節(jié)更卒。因為過程中用到的很多數(shù)據(jù)都是32字節(jié)等孵。
  • 調(diào)用深度上限為1024。
  • 棧的大小無限制
  • 臨時/永久存儲的區(qū)別蹂空。
  • 完全可確定俯萌。每一步都是確定的,可以回滾上枕。

2咐熙、EVM的實現(xiàn)框架

EVM的實現(xiàn)框架

虛擬機(jī)基本的執(zhí)行流程:

  1. 取指令

指令在哪兒?在以太坊虛擬機(jī)中辨萍,有一個叫做執(zhí)行環(huán)境的數(shù)據(jù)結(jié)構(gòu)棋恼,它就包括了合約的指令。而這些指令(圖右的 code )的 Hash 在全局狀態(tài)前綴樹中。在創(chuàng)建虛擬機(jī)實例后爪飘,這些代碼就拷貝到了執(zhí)行環(huán)境义起。這些指令是字節(jié)碼,如圖左上角师崎。

  1. 取操作數(shù)

根據(jù)合約編寫的內(nèi)容取操作數(shù)入棧默终。這些操作數(shù)可以是很多不同的內(nèi)容(圖左下角部分),如輸入數(shù)據(jù)的值(Input Data Value)犁罩,代碼的擁有者(Code Owner)齐蔽,區(qū)塊的頭部(Block Header),等昼汗。另外肴熏,執(zhí)行環(huán)境除了提供需要的數(shù)據(jù),還記錄了一些數(shù)據(jù)的狀態(tài)顷窒,如調(diào)用的深度(Message-Call Depth)蛙吏,日志(Log Series),返還Gas(Refund Balance)鞋吉,等鸦做。

  1. 檢查GAS策略

有的是根據(jù)操作的次數(shù),有的是根據(jù)輸入數(shù)據(jù)的長度谓着。

在虛擬機(jī)中泼诱,有一塊數(shù)據(jù)結(jié)構(gòu)是虛擬機(jī)狀態(tài),這里記錄了你還有多少GAS赊锚,臨時存儲的內(nèi)容治筒,記錄了多少Word(一個word是32字節(jié)), 最后是棧的內(nèi)容舷蒲。檢查內(nèi)容有耸袜,錢是不是夠,內(nèi)存是不是需要擴(kuò)張牲平,如果都滿足要求就會執(zhí)行合約堤框,出錯了就會回滾。

  1. 執(zhí)行指令

執(zhí)行后纵柿,一般會更新storage 的變量(如圖箭頭)

  1. 增加PC

移動指針蜈抓,執(zhí)行下一條。

3昂儒、EVM的常見指令

  • 算術(shù)指令: ADD SUB MUL DIV MOD
  • 比較指令: LT GT EQ AND OR
  • SHA3: SHA3

實際是Keccek沟使,雖然名字寫的是SHA3。

  • 執(zhí)行環(huán)境信息: ADDRESS ORIGIN CALLER

合約地址渊跋,發(fā)起者腊嗡,調(diào)用者

  • 區(qū)塊信息: COINBASE DIFFICULTY NUMBER

挖礦受益人撤缴,區(qū)塊難度,區(qū)塊號

  • 棧/存儲: POP PUSH DUP SWAP MLOAD/MSAVE SLOAD/SSTORE JUMP
  • 系統(tǒng)操作: CREATE CALL CALLCODE RETURN SELFDESTRUCT INVALID

以上這些指令一般不會直接用到叽唱,平時用到的是腳本語言,再編譯出來微宝。但以下指令需要特別理解一下棺亭。

  • CALLCODE/DELEGATECALL:用來使得合約以函數(shù)的形式調(diào)用其它合約的代碼。且棧和存儲空間利用當(dāng)前合約的資源蟋软,僅僅使用被調(diào)用合約的代碼镶摘。這樣便于合約代碼設(shè)計標(biāo)準(zhǔn)庫。

CALLCODE 的msg.sender 未能和庫調(diào)用邏輯一致岳守。 A-> B(callcode) ->C(lib)
DELEGATECALL的msg.sender 則和庫調(diào)用邏輯一致凄敢。 A-> B(delegatecall) ->C(lib)

所以,盡量使用 DELEGATECALL 指令湿痢。

  • SELFDESTRUCT:允許一個合約在必要的情境下刪除自己涝缝。實際上并不是立即執(zhí)行,而是在交易的最后被執(zhí)行譬重。這樣的話可以大大降低回滾已刪除合約這項功能在虛擬機(jī)中實現(xiàn)的復(fù)雜度拒逮。

  • SHA256,ECRECOVER和RIPEMD160不是作為操作碼而是包含在偽合約中臀规。

4滩援、GAS 計價策略

指令計價類型

指令計價類型分為三種:單一計價類、按照數(shù)據(jù)長度計價塔嬉、返還類型玩徊。

比較昂貴的有圖右邊所示的幾種;其總體的邏輯是谨究,增加存儲負(fù)擔(dān)就貴恩袱,減輕了就便宜。

所以记盒,我們要盡量避免昂貴的操作憎蛤。

5、臨時/永久存儲的生命周期

合約存儲的生命周期

以一個合約執(zhí)行過程說明一下纪吮。

  1. A調(diào)用B
  2. B執(zhí)行過程中俩檬,設(shè)置永久存儲的S值為5,臨時M值為9碾盟;
  3. B調(diào)用C
  4. C調(diào)用B棚辽,這時的B是一個新的實例,不是第2步中的B冰肴;
  5. 這時下面這個B中的S=5(永久)屈藐,M=0(臨時的榔组,不用上面的值);
  6. 在執(zhí)行B的過程中联逻,S變成了17搓扯,M變成了13;
  7. 返回到C包归,返回到B锨推,這時的S值為17,M還是之前的9公壤。

結(jié)論换可,永久存儲的可以跨越交易,跨越區(qū)塊厦幅;而臨時存儲的只限于一個實例沾鳄。


本節(jié)主要介紹了以太坊虛擬機(jī)的設(shè)計框架,不足之處确憨,請批評指正译荞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市休弃,隨后出現(xiàn)的幾起案子磁椒,更是在濱河造成了極大的恐慌,老刑警劉巖玫芦,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浆熔,死亡現(xiàn)場離奇詭異,居然都是意外死亡桥帆,警方通過查閱死者的電腦和手機(jī)医增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來老虫,“玉大人叶骨,你說我怎么就攤上這事∑沓祝” “怎么了忽刽?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夺欲。 經(jīng)常有香客問我跪帝,道長,這世上最難降的妖魔是什么些阅? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任伞剑,我火速辦了婚禮,結(jié)果婚禮上市埋,老公的妹妹穿的比我還像新娘黎泣。我一直安慰自己恕刘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布抒倚。 她就那樣靜靜地躺著褐着,像睡著了一般。 火紅的嫁衣襯著肌膚如雪托呕。 梳的紋絲不亂的頭發(fā)上献起,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機(jī)與錄音镣陕,去河邊找鬼。 笑死姻政,一個胖子當(dāng)著我的面吹牛呆抑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汁展,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼鹊碍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了食绿?” 一聲冷哼從身側(cè)響起侈咕,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎器紧,沒想到半個月后耀销,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡铲汪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年熊尉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌腰。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰住,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出齿梁,到底是詐尸還是另有隱情催植,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布勺择,位于F島的核電站创南,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏省核。R本人自食惡果不足惜扰藕,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芳撒。 院中可真熱鬧邓深,春花似錦未桥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萌壳,卻和暖如春亦镶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱瓮。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工缤骨, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尺借。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓绊起,卻偏偏與公主長得像,于是被迫代替她去往敵國和親燎斩。 傳聞我的和親對象是個殘疾皇子虱歪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容