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)載請注明出處