以太坊狀態(tài)轉(zhuǎn)換流程分析

以太坊的本質(zhì)就是一個(gè)基于交易的狀態(tài)機(jī)为狸,從創(chuàng)世狀態(tài)開(kāi)始,每次執(zhí)行block的交易后遗契,狀態(tài)被修改成最新的的最終狀態(tài)辐棒,在任何時(shí)刻這個(gè)最終狀態(tài)都代表著以太坊當(dāng)前的最新?tīng)顟B(tài)。

狀態(tài)轉(zhuǎn)換示意如下圖:

image
  • 狀態(tài)數(shù)據(jù)實(shí)際上也是保存在block上的狀態(tài)樹(shù)中的牍蜂。
  • 創(chuàng)世狀態(tài)里面記錄了創(chuàng)世文件初始化的賬戶(hù)數(shù)據(jù)及其他狀態(tài)數(shù)據(jù)漾根,每次生成一個(gè)block,執(zhí)行其中的交易鲫竞,修改狀態(tài)數(shù)據(jù)辐怕,并以增量修改的方式記錄在最新的block的狀態(tài)樹(shù)中。
  • 被最終確認(rèn)后的block(包括狀態(tài))保證永久無(wú)法被篡改(符合拜占庭容錯(cuò)的條件下)从绘。
  • 上圖中最新的以太坊狀態(tài)是執(zhí)行blockN+1中的所有交易后的世界狀態(tài)寄疏。
  • 此時(shí)如果本地礦工從交易池中挖到最新的候選block, 或者其他礦工挖到最新的block并在本礦工挖到之前通過(guò)該候選block過(guò)來(lái)顶考,在驗(yàn)證block中的所有打包交易有效性之后赁还,執(zhí)行該后選block中所有交易。
  • 執(zhí)行交易的過(guò)程就是虛擬機(jī)EVM執(zhí)行交易中的合約代碼的過(guò)程驹沿,全部執(zhí)行完成后艘策,將被修改的狀態(tài)記錄到候選block的狀態(tài)樹(shù)上,然后將該候選block進(jìn)行上鏈渊季,包括解決分叉朋蔫,持久化block數(shù)據(jù),更新才能的數(shù)據(jù)等却汉。

和狀態(tài)轉(zhuǎn)換相關(guān)的最重要的2個(gè)接口是:

  • apply_block(state,block): block級(jí)的狀態(tài)轉(zhuǎn)換
  • apply_transaction(state,tx): 一個(gè)交易執(zhí)行的狀態(tài)轉(zhuǎn)換

apply_block(state,block)

image
  1. 首先做好state的備份驯妄,方便后面轉(zhuǎn)換過(guò)程中出現(xiàn)失敗時(shí)進(jìn)行回滾;
  2. 為了更加通用化處理合砂,抽象出共識(shí)策略的接口青扔,用戶(hù)可以自定義共識(shí)策略,目前支持PoW,PoA共識(shí)策略微猖;
  3. 共識(shí)策略的初始化的工作是谈息。。凛剥。
  4. 驗(yàn)證block頭數(shù)據(jù)的有效性侠仇;
  5. 驗(yàn)證共識(shí)相關(guān)的數(shù)據(jù)的有效性, 例如PoA共識(shí)中extra字段有相應(yīng)的格式要求犁珠;
  6. 對(duì)叔塊的一些驗(yàn)證逻炊,因?yàn)槿牍膳对揵lock最終被確認(rèn)的話(huà), 叔塊也是可以獲得相應(yīng)的獎(jiǎng)勵(lì)犁享;
  7. 交易樹(shù)是一個(gè)merkle樹(shù)余素,交易最終生成一個(gè)nerkle根hash,如果和block中記錄的hash‘值不一致炊昆,說(shuō)明交易數(shù)據(jù)被篡改溺森,該block是非法的;
  8. 執(zhí)行block中的所有交易窑眯,也就是狀態(tài)轉(zhuǎn)換, 詳見(jiàn)下面小節(jié)医窿;
  9. 狀態(tài)轉(zhuǎn)換完成后磅甩,對(duì)曠工和叔塊的曠工進(jìn)行獎(jiǎng)勵(lì);計(jì)算方法是:
  10. 驗(yàn)證交易的執(zhí)行結(jié)果姥卢,bloom位圖保存合約執(zhí)行中產(chǎn)生的事件卷要,收據(jù)樹(shù)保存交易執(zhí)行結(jié)果hash;
  11. block本身的數(shù)據(jù)也保存到state中独榴;
  12. 至此完成整個(gè)block的狀態(tài)轉(zhuǎn)換工作僧叉;

apply_transaction(state,tx)

image
  1. 執(zhí)行每個(gè)block中的交易時(shí)修改的狀態(tài)是一個(gè)增量修改,因此state中的logs(交易產(chǎn)生的事件)和suicides(執(zhí)行“自殺”代碼的事件記錄)棺榔,refunds(eth退款)字段只記錄本block執(zhí)行后的結(jié)果瓶堕;
  2. 驗(yàn)證交易的有效性,交易的sender(從前民中恢復(fù)出賬戶(hù)地址和from參數(shù)比較)症歇,交易的編號(hào)(每一筆sender發(fā)出的交易有一個(gè)唯一的數(shù)字郎笆,是連續(xù)自增的整數(shù)),交易的gas(sender是否有足夠的資金支付本次交易的gas費(fèi)用)忘晤;
  3. 如果是一個(gè)創(chuàng)建合約的交易宛蚓,還要扣除而外的gas費(fèi)用;
  4. 后面是交易中合約的執(zhí)行以及gas費(fèi)用的計(jì)算和扣除的工作设塔;

apply_msg(ext,msg)

其中apply_msg是執(zhí)行該交易的過(guò)程:

這里特殊合約的執(zhí)行和一般合約代碼的執(zhí)行都是在虛擬機(jī)中完成的凄吏,詳見(jiàn)<虛擬機(jī)的實(shí)現(xiàn)分析>一文。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市痕钢,隨后出現(xiàn)的幾起案子图柏,更是在濱河造成了極大的恐慌,老刑警劉巖盖喷,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爆办,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡课梳,警方通過(guò)查閱死者的電腦和手機(jī)距辆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)暮刃,“玉大人跨算,你說(shuō)我怎么就攤上這事⊥职茫” “怎么了诸蚕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)氧猬。 經(jīng)常有香客問(wèn)我背犯,道長(zhǎng),這世上最難降的妖魔是什么盅抚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任漠魏,我火速辦了婚禮,結(jié)果婚禮上妄均,老公的妹妹穿的比我還像新娘柱锹。我一直安慰自己,他們只是感情好丰包,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布禁熏。 她就那樣靜靜地躺著,像睡著了一般邑彪。 火紅的嫁衣襯著肌膚如雪瞧毙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天寄症,我揣著相機(jī)與錄音升筏,去河邊找鬼。 笑死瘸爽,一個(gè)胖子當(dāng)著我的面吹牛您访,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剪决,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灵汪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檀训!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起享言,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤峻凫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后览露,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荧琼,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年差牛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了命锄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偏化,死狀恐怖脐恩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侦讨,我是刑警寧澤驶冒,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站韵卤,受9級(jí)特大地震影響骗污,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沈条,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一身堡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拍鲤,春花似錦、人聲如沸汞扎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澈魄。三九已至景鼠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痹扇,已是汗流浹背铛漓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲫构,地道東北人浓恶。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像结笨,于是被迫代替她去往敵國(guó)和親包晰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湿镀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 以太坊(Ethereum ):下一代智能合約和去中心化應(yīng)用平臺(tái) 翻譯:巨蟹 、少平 譯者注:中文讀者可以到以太坊愛(ài)...
    車(chē)圣閱讀 3,731評(píng)論 1 7
  • 以太坊白皮書(shū)地址:https://github.com/ethereum/wiki/wiki/White-Pape...
    rectinajh閱讀 17,801評(píng)論 0 46
  • 【中文版】以太坊白皮書(shū) 翻譯:少平伐憾、 Seven當(dāng)中本聰在 2009 年 1 月啟動(dòng)比特幣區(qū)塊鏈時(shí)勉痴,他同時(shí)向世界引...
    __Seven__閱讀 4,162評(píng)論 0 10
  • 簡(jiǎn)介 不管你們知不知道以太坊(Ethereum blockchain)是什么,但是你們大概都聽(tīng)說(shuō)過(guò)以太坊树肃。最近在新...
    Lilymoana閱讀 3,889評(píng)論 1 22
  • 今天想約下同在花都的同學(xué)蒸矛,她今年生了女兒,都還沒(méi)去看過(guò)她胸嘴,大家工作后在一起少之又少雏掠,連平時(shí)的聯(lián)絡(luò)也很少,都忙著各自...
    子茹閱讀 211評(píng)論 0 0