3 提交(submit)/导入(import)交易
交易经过验证是valid以后,它将被提交到交易池里。submit方法在client/transaction-pool/graph/src/validated_pool.rs里实现,它调用submit_one方法提交每一笔交易,submit_one再调用import方法完成导入操作,如果导入成功,这笔交易的hash将被放入import_notification_sinks通知队列:
Substrate交易池的交易分为2类:Future和Ready。前者包含那些某些tags尚未提供的交易,后者包含满足了所有条件可以打包进区块的交易。对于已经Ready的交易,import调用import_to_ready方法:
import_to_ready继续调用ReadyTransaction的import方法把交易放入交易池:
import的实现在client/transaction-pool/graph/src/ready.rs里。
4 转发交易
Substrate的底层service监听extrinsic通知,当有Ready的交易写入import_notification_sinks时,网络服务的propagate_extrinsic函数就会被调用(client/service/src/builder.rs):
propagate_extrinsic发出PropagateExtrinsic消息:
网络服务收到这条消息后,会调用protocol里的propagate_extrinsic方法(client/network/src/protocol.rs):
do_propagate_extrinsics()方法把交易数据包发送给其它节点,on_broadcasted则是向节点发送通知。
至此,交易转发完毕,所有节点都将接收到这笔交易。
5 接收交易
每个节点在协议层protocol里收到交易数据的消息类型为GenericProtoOut::CustomMessage,然后调用on_custom_message方法处理数据:
on_custom_message首先解码数据包,如果消息类型是Transaction则调用on_extrinsics方法,它通过调用import将接收到的交易放到本节点的交易池里:
----------------
***转载请注明出处
网友评论