1. 交易同步過程

1. 在cleos界面輸入?cleos transfer ${from_account} ${to_account} ${quantity}
2. 調用chain_plugin 的push_transaction,發(fā)送transaction_async消息?
3. 觸發(fā)了producer_plugin的on_incoming_transaction_async,調用controller的 push_transaction,并執(zhí)行trx。
4. controller發(fā)送消息accepted_transaction,觸發(fā)了bnet_plugin和net_plugin(已廢棄)的on_accepted_transaction?
5. ?bnet_plugin和net_plugin(已廢棄)將消息廣播發(fā)送到其他節(jié)點
6. 其他節(jié)點收到消息后,進入on處理流程,發(fā)送transction消息,producer_plugin收到消息后,調用on_incoming_transaction_async,調用controller的 push_transaction,并執(zhí)行trx。
2. 區(qū)塊成產(chǎn)過程
producer 收到廣播的交易之后,將交易保存下來放在pending_state中,producer_plugin在startup的時候就啟動了區(qū)塊生產(chǎn)schedule_production_loop,先做區(qū)塊準備工作,即start_block,主要完成區(qū)塊BFT的簽名,之后進入maybe_produce_block,進入生產(chǎn)過程,即produce_block,這是區(qū)塊生產(chǎn)的核心部分,包括計算merkle root,提交到DB中等,在最后重新調用schedule_production_loop,這樣就形成了循環(huán),具體流程見下圖:

1. ?檢查自己是否是生產(chǎn)者,一個生產(chǎn)者500ms出一次塊,共出12次之后切換生產(chǎn)者。
2. 對上次確認的區(qū)塊到本次的區(qū)塊做BFT簽名,涉及函數(shù)set_confirmed和maybe_promote_pending
3. 等待一個出塊周期500ms
4. 計算action的merkle root
5. 計算transaction的merkle root
6. 對區(qū)塊簽名
7. 提交區(qū)塊到DB
8. 遞歸調用schedule_production_loop
3. 區(qū)塊同步過程

1. ?參考區(qū)塊生產(chǎn)過程,producer_plugin循環(huán)生產(chǎn)區(qū)塊,先start_block處理BFT簽名并確定不可逆的區(qū)塊數(shù),之后produce_block調用controller
2. ?Controller使用finalize_block計算merkle root,使用commit_block提交到fork database中,fork db會依據(jù)1中計算的不可逆區(qū)塊數(shù),將不可逆的區(qū)塊刪除,并發(fā)送irreversible消息
3. ?Controller收到消息后,調用on_irreversible處理發(fā)送irreversible_block消息
4. ?bnet_plugin 收到消息后,調用on_irreversible_block處理。
5. ?Controller發(fā)送accepted_block_header和accepted_block消息
6. ?producer_plugin收到消息后, 調用on_block,calc_dpos_last_irreversible計算不可逆塊。
7. ?bnet_plugin/net_plugin 收到之后廣播到其他節(jié)點
8. ?其他節(jié)點的bnet_plugin/net_plugin收到P2P消息后,通過發(fā)送block消息/調用accept_block函數(shù)發(fā)送block_async消息
9. ?Producer_plugin收到block/block_async消息后調用controller的push_block函數(shù)
10. ?Controller調用apply_block判斷如果新收到的block比原有的鏈長,則切換到新鏈上
11. ?Controller調用finalize_block計算merkle root,使用commit_block提交到DB
下面貼張網(wǎng)上找到的log圖,說明消息的時序:
