1. 交易同步過(guò)程
1. 在cleos界面輸入?cleos transfer ${from_account} ${to_account} ${quantity}
2. 調(diào)用chain_plugin 的push_transaction,發(fā)送transaction_async消息?
3. 觸發(fā)了producer_plugin的on_incoming_transaction_async,調(diào)用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é)點(diǎn)
6. 其他節(jié)點(diǎn)收到消息后篷帅,進(jìn)入on處理流程跺讯,發(fā)送transction消息糯景,producer_plugin收到消息后嘁圈,調(diào)用on_incoming_transaction_async,調(diào)用controller的 push_transaction蟀淮,并執(zhí)行trx最住。
2. 區(qū)塊成產(chǎn)過(guò)程
producer 收到廣播的交易之后,將交易保存下來(lái)放在pending_state中怠惶,producer_plugin在startup的時(shí)候就啟動(dòng)了區(qū)塊生產(chǎn)schedule_production_loop温学,先做區(qū)塊準(zhǔn)備工作,即start_block甚疟,主要完成區(qū)塊BFT的簽名,之后進(jìn)入maybe_produce_block逃延,進(jìn)入生產(chǎn)過(guò)程览妖,即produce_block,這是區(qū)塊生產(chǎn)的核心部分揽祥,包括計(jì)算merkle root讽膏,提交到DB中等,在最后重新調(diào)用schedule_production_loop拄丰,這樣就形成了循環(huán)府树,具體流程見(jiàn)下圖:
1. ?檢查自己是否是生產(chǎn)者俐末,一個(gè)生產(chǎn)者500ms出一次塊,共出12次之后切換生產(chǎn)者奄侠。
2. 對(duì)上次確認(rèn)的區(qū)塊到本次的區(qū)塊做BFT簽名卓箫,涉及函數(shù)set_confirmed和maybe_promote_pending
3. 等待一個(gè)出塊周期500ms
4. 計(jì)算action的merkle root
5. 計(jì)算transaction的merkle root
6. 對(duì)區(qū)塊簽名
7. 提交區(qū)塊到DB
8. 遞歸調(diào)用schedule_production_loop
3. 區(qū)塊同步過(guò)程
1. ?參考區(qū)塊生產(chǎn)過(guò)程,producer_plugin循環(huán)生產(chǎn)區(qū)塊垄潮,先start_block處理BFT簽名并確定不可逆的區(qū)塊數(shù)烹卒,之后produce_block調(diào)用controller
2. ?Controller使用finalize_block計(jì)算merkle root,使用commit_block提交到fork database中弯洗,fork db會(huì)依據(jù)1中計(jì)算的不可逆區(qū)塊數(shù)旅急,將不可逆的區(qū)塊刪除,并發(fā)送irreversible消息
3. ?Controller收到消息后牡整,調(diào)用on_irreversible處理發(fā)送irreversible_block消息
4. ?bnet_plugin 收到消息后藐吮,調(diào)用on_irreversible_block處理。
5. ?Controller發(fā)送accepted_block_header和accepted_block消息
6. ?producer_plugin收到消息后逃贝, 調(diào)用on_block谣辞,calc_dpos_last_irreversible計(jì)算不可逆塊。
7. ?bnet_plugin/net_plugin 收到之后廣播到其他節(jié)點(diǎn)
8. ?其他節(jié)點(diǎn)的bnet_plugin/net_plugin收到P2P消息后秋泳,通過(guò)發(fā)送block消息/調(diào)用accept_block函數(shù)發(fā)送block_async消息
9. ?Producer_plugin收到block/block_async消息后調(diào)用controller的push_block函數(shù)
10. ?Controller調(diào)用apply_block判斷如果新收到的block比原有的鏈長(zhǎng)潦闲,則切換到新鏈上
11. ?Controller調(diào)用finalize_block計(jì)算merkle root,使用commit_block提交到DB
下面貼張網(wǎng)上找到的log圖迫皱,說(shuō)明消息的時(shí)序: