区块链大学区块链研习社Substrate

Substrate交易实现流程(3)

2020-04-02  本文已影响0人  goldenfiredo

6 执行交易

执行交易是将交易写入区块并更新区块链状态的过程,例如一笔转账(transfer)交易,账户A向账户B转账1 DOT,这笔交易执行后,账户A余额减少1 DOT, 账户B余额增加1 DOT。

Substrate使用的是Babe共识,Babe共识在出块前要选定出块人proposer,由出块人将交易池中的交易打包入块。具体实现先看propose_with代码(client/basic-authorship/src/basic_authorship.rs,由propose方法调用,propose方法被on_slot调用,见client/consensus/slots/src/lib.rs):

propose_with首先调用new_block_at函数创建BlockBuilder结构来初始化一个块,在此过程中会调用initialize_block_with_context方法,它的实现是在Runtime里,即Executive模块的initialize_block方法(它调用了自定义模块的on_initialize)。

区块初始化以后,开始调用push方法:

这里apply_extrinsic_with_context的实现同样在Runtime里,即Executive模块的apply_extrinsic。apply_extrinsic则调用apply_extrinsic_with_len方法:

这里先调用check再次检查签名是否正确(在验证交易时已经检查过一次),然后调用apply:

这里的dispatch实际上就是Extrinsic中的Call,对于一笔转账交易,它可能是Balance是模块的transfer方法,也可能是自定义模块的处理转账的函数。dispatch方法被执行后,这笔交易才真正得到执行,区块链的状态才被更新。至此,一笔交易执行完毕。

---------

***转载请注明出处

上一篇下一篇

猜你喜欢

热点阅读