Substrate交易实现流程(2)

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将接收到的交易放到本节点的交易池里:


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

***转载请注明出处

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容