EOS 區(qū)塊生產(chǎn)過程

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圖,說明消息的時序:


?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,678評論 19 139
  • EOS采用DPoS算法和塊內(nèi)分片技術,實現(xiàn)了百萬級別TPS的超高性能,可以媲美中心化服務器的處理能力,同時保持去中...
    vdes閱讀 2,306評論 0 5
  • 我家養(yǎng)了三只小貓,貓媽媽是從朋友那兒領養(yǎng)過來的叫樂高。沒多久便和附近的公貓私定終生,生下了兩小只。小貓咪要出生的時...
    cyrensw閱讀 655評論 5 3
  • 我們是否有過這樣的體驗?工作千頭萬緒,待處理事項一大堆心急火燎,會議中需要表達觀點思路卻還沒理順;回到家面對滿屋狼...
    睦媽是也閱讀 724評論 0 2
  • 從溫暖、發(fā)達的深圳回來,今天急匆匆上班了,一 大堆的事等著我去處理,莫名有點煩躁。 剛到辦公室,...
    幸運草_e5c3閱讀 314評論 0 0

友情鏈接更多精彩內(nèi)容