Substrate交易實現(xiàn)流程(1)

Substrate把交易分成兩種類型掉丽,一種由用戶生成澄暮,稱之為extrinsic的榛,另一種由substrate自己生成结澄,稱之為inherent data耻陕。

用戶通過調(diào)用Substrate的RPC接口與Substrate交互。Substrate系統(tǒng)提供author绘盟、chain、state和system默認(rèn)的 RPC接口悯仙,開發(fā)者也可以自定義RPC供用戶使用龄毡。

1 發(fā)起交易

用戶通過調(diào)用author模塊的author_submitExtrinsic函數(shù)或者author_submitAndWatchExtrinsic函數(shù)發(fā)起一筆交易。二者的區(qū)別是后者除了提交一筆交易還要把交易的執(zhí)行結(jié)果返回給調(diào)用方锡垄。這里以前者為例來說明交易的實現(xiàn)流程沦零。

實現(xiàn)author_submitExtrinsic接口的是submit_extrinsic方法,它接收一個16進(jìn)制編碼的交易字節(jié)流的參數(shù)货岭。

submit_extrinsic方法首先解碼交易數(shù)據(jù)路操,然后調(diào)用submit_one方法將這筆交易放進(jìn)交易池(transaction pool),submit_one則直接調(diào)用submit_at方法千贯。submit_one和submit_at的區(qū)別是前者只處理單筆交易屯仗,后者可批量處理。

由代碼可以看出搔谴,submit_at完成兩件事情魁袜,一是驗證(verify)每筆交易,二是如果驗證通過敦第,把它提交(submit)到交易池里峰弹。下面分別介紹。

2 驗證交易

verify方法對傳進(jìn)來的每筆交易調(diào)用verify_one進(jìn)行驗證:

verify_one進(jìn)一步調(diào)用ChainApi里的validate_transaction方法來驗證一筆交易芜果。

Substrate里驗證交易的邏輯是在runtime實現(xiàn)的鞠呈,所以會看到validate_transaction進(jìn)一步調(diào)用runtime里的validate_transaction api:

每個runtime實現(xiàn)驗證交易的邏輯會有不同,在substrate提供的模版runtime實現(xiàn)里右钾,validate_transaction的代碼如下:

其中Executive是runtime里的執(zhí)行調(diào)度器蚁吝,具體實現(xiàn)在executive frame里:

Executive的validate_transaction對交易數(shù)據(jù)先check再validate。check函數(shù)的實現(xiàn)在primitives/runtime/src/generic/unchecked_extrinsic.rs里:

check函數(shù)的主要功能是舀射,對于包含簽名的交易灭将,它驗證簽名是否正確。無論交易是否包含簽名后控,最終會返回一筆已經(jīng)checked的交易庙曙。

而validate函數(shù)的實現(xiàn)在primitives/runtime/src/generic/checked_extrinsic.rs里,它對checked的交易做進(jìn)一步處理:

對于已經(jīng)簽名的交易調(diào)用Extra::validate函數(shù)浩淘。這里的Extra是system frame捌朴。system frame 里實現(xiàn)validate的代碼:

因為已經(jīng)驗證過簽名吴攒,這里只檢查賬戶的nonce。檢查完畢砂蔽,返回一筆有效的交易洼怔。

對于不包含簽名的交易,首先調(diào)用Extra::validate_unsigned函數(shù)左驾,再調(diào)用U::validate_unsigned函數(shù)镣隶。這里的U是support frame。Extra::validate_unsigned主要是檢查交易所在的區(qū)塊高度是否正確诡右、交易數(shù)據(jù)長度是否超限安岂。下面是U::validate_unsigned的代碼(在frame/support/src/unsigned.rs里):

這是一段用rust宏寫的代碼,它調(diào)用了module里的validate_unsigned函數(shù)帆吻。就是說域那,對于不包含簽名的交易,簽名的驗證邏輯由模塊的實現(xiàn)者完成猜煮。下面是一個簡單的例子:

這里模塊實現(xiàn)了ValidateUnsigned Trait的validate_unsigned方法來對簽名進(jìn)行校驗次员。如果檢驗通過,則返回一筆有效的交易王带。它被上面定義的宏調(diào)用淑蔚。

至此,驗證交易完成愕撰。

-------------


***轉(zhuǎn)載請注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末束倍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盟戏,更是在濱河造成了極大的恐慌绪妹,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柿究,死亡現(xiàn)場離奇詭異邮旷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝇摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門婶肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人貌夕,你說我怎么就攤上這事律歼。” “怎么了啡专?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵险毁,是天一觀的道長。 經(jīng)常有香客問我,道長畔况,這世上最難降的妖魔是什么鲸鹦? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮跷跪,結(jié)果婚禮上馋嗜,老公的妹妹穿的比我還像新娘。我一直安慰自己吵瞻,他們只是感情好葛菇,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橡羞,像睡著了一般眯停。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尉姨,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天庵朝,我揣著相機(jī)與錄音吗冤,去河邊找鬼又厉。 笑死,一個胖子當(dāng)著我的面吹牛椎瘟,可吹牛的內(nèi)容都是我干的覆致。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼肺蔚,長吁一口氣:“原來是場噩夢啊……” “哼煌妈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宣羊,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤璧诵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仇冯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體之宿,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年苛坚,在試婚紗的時候發(fā)現(xiàn)自己被綠了比被。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡泼舱,死狀恐怖等缀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娇昙,我是刑警寧澤尺迂,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響枪狂,放射性物質(zhì)發(fā)生泄漏危喉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一州疾、第九天 我趴在偏房一處隱蔽的房頂上張望辜限。 院中可真熱鬧,春花似錦严蓖、人聲如沸薄嫡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毫深。三九已至,卻和暖如春毒姨,著一層夾襖步出監(jiān)牢的瞬間哑蔫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工弧呐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留闸迷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓俘枫,卻偏偏與公主長得像腥沽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸠蚪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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