6 執(zhí)行交易
執(zhí)行交易是將交易寫入?yún)^(qū)塊并更新區(qū)塊鏈狀態(tài)的過程掏觉,例如一筆轉(zhuǎn)賬(transfer)交易座柱,賬戶A向賬戶B轉(zhuǎn)賬1 DOT,這筆交易執(zhí)行后迹鹅,賬戶A余額減少1 DOT, 賬戶B余額增加1 DOT贞言。
Substrate使用的是Babe共識斜棚,Babe共識在出塊前要選定出塊人proposer,由出塊人將交易池中的交易打包入塊该窗。具體實(shí)現(xiàn)先看propose_with代碼(client/basic-authorship/src/basic_authorship.rs弟蚀,由propose方法調(diào)用,propose方法被on_slot調(diào)用酗失,見client/consensus/slots/src/lib.rs):
propose_with首先調(diào)用new_block_at函數(shù)創(chuàng)建BlockBuilder結(jié)構(gòu)來初始化一個(gè)塊义钉,在此過程中會調(diào)用initialize_block_with_context方法,它的實(shí)現(xiàn)是在Runtime里规肴,即Executive模塊的initialize_block方法(它調(diào)用了自定義模塊的on_initialize)捶闸。
區(qū)塊初始化以后,開始調(diào)用push方法:
這里apply_extrinsic_with_context的實(shí)現(xiàn)同樣在Runtime里拖刃,即Executive模塊的apply_extrinsic删壮。apply_extrinsic則調(diào)用apply_extrinsic_with_len方法:
這里先調(diào)用check再次檢查簽名是否正確(在驗(yàn)證交易時(shí)已經(jīng)檢查過一次),然后調(diào)用apply:
這里的dispatch實(shí)際上就是Extrinsic中的Call兑牡,對于一筆轉(zhuǎn)賬交易央碟,它可能是Balance是模塊的transfer方法,也可能是自定義模塊的處理轉(zhuǎn)賬的函數(shù)发绢。dispatch方法被執(zhí)行后硬耍,這筆交易才真正得到執(zhí)行,區(qū)塊鏈的狀態(tài)才被更新边酒。至此经柴,一筆交易執(zhí)行完畢。
---------
***轉(zhuǎn)載請注明出處