《新摩登時代》:卓別林演繹共識與同步流程優化

FISCO BCOS是完全開源的聯盟區塊鏈底層技術平臺,由金融區塊鏈合作聯盟(深圳)(簡稱金鍊盟)成立開源工作組通力打造。開源工作組成員包括博彥科技、華爲、深證通、神州數碼、四方精創、騰訊、微衆銀行、亦筆科技和越秀金科等金鍊盟成員機構。

代碼倉庫:https://github.com/FISCO-BCOS

 

共識與同步的流程優化,是FISCO BCOS性能優化邁開的第一步。僅依靠這一流程優化,就給系統TPS帶來可觀的1.75倍提升。但這不是目的,其目的在於確定了共識的主導地位,排除了同步給共識帶來的性能影響,讓之後的性能分析更好地聚焦在共識流程中。

 

基礎講解

在卓別林的電影《摩登時代》裏,卓別林扮演一個工人,日復一日地重複着擰螺絲的動作:提起扳手,找到零件,對準螺絲,擰緊,再提起扳手,再找到下一個零件,再對準螺絲,再擰緊......

在FISCO BCOS的設計裏,共識和同步也在幹着這樣重複的事情。

 

共識與同步是個啥?

共識與同步,是FISCO BCOS節點中的兩個核心流程。它們相互配合,實現了區塊鏈的核心功能:生產出一條在每個節點上都一致的區塊鏈。

在FISCO BCOS節點的實現裏,共識和同步的實體,我們稱爲共識模塊和同步模塊。

  • 共識模塊:負責生產區塊,讓節點產生的區塊都是一模一樣的

  • 同步模塊:負責廣播交易,讓用戶發出的交易儘可能地到達每個節點

 

共識與同步在幹啥?

我們來看看共識模塊和同步模塊的工作環境:

  • 交易池:節點中緩存未被處理交易的容器

  • 網絡模塊:接收其它節點發來的消息包,也可向其它節點發送消息包

那麼,共識模塊與同步模塊在幹啥?

 

共識模塊

不斷進行共識消息的處理和發送,讓所有節點上的區塊達到一致,此處以PBFT的共識爲例。

  1. 打包區塊:從交易池拿取出交易,打包成區塊廣播出去,或處理從網絡模塊拿到的其它節點的區塊

  2. 執行區塊:解碼區塊,驗證區塊,執行區塊,將區塊的執行結果籤個名廣播出去

  3. 收集簽名:收集其它節點執行結果的簽名,如果收集到的簽名達到一定數量,就向其它節點廣播“commit消息”

  4. 收集commit:收集其它節點的commit消息,當收集到的commit消息達到一定數量,說明區塊已經一致,可以落盤了

  5. 落盤:把區塊連接到現有區塊鏈的末端,形成區塊鏈,存儲到DB中

同步模塊

不斷進行交易的收發,讓每一筆交易儘可能地到達每個節點。

  1. 取交易:從交易池中取出未發送的交易

  2. 發交易:把未發送的交易廣播給其它節點

  3. 收交易:從網絡模塊收取其它節點的交易

  4. 驗交易:對交易進行解碼和驗籤

  5. 存交易:把驗籤通過的交易存到交易池中

問題與優化

卓別林和他的夥伴各司其職,井然有序,看似非常和諧。可當工廠落後的生產力跟不上旺盛的市場需求,即便是卓別林這種熟練工,加班加點也幹不完。這個時候,卓別林不得不開始思考自己和夥伴在生產關係上的問題。

在以往的設計中,共識模塊和同步模塊並沒有優先級的區分,導致它們在爭奪資源時浪費了大量的時間。同時,共識模塊和同步模塊中還有很多重複的操作,也浪費了時間。因此,應該將共識模塊和同步模塊的執行流程一併考慮,優化流程,提高效率。

在經過詳細分析和縝密驗證後,FISCO BCOS將共識模塊和同步模塊流程進行了優化。優化基於以下思想:

共識模塊負責主導整個區塊鏈出塊的節奏,應讓共識模塊先行。而同步模塊,理應扮演好配合的角色,輔佐共識模塊更快出塊。

 

基於上述思想,我們來看看其中幾個問題的優化方法。

問題1:

工作阻塞

共識模塊與同步模塊都是從網絡模塊中獲取消息包,再根據相應消息包進行下一步操作。但是,由於網絡回調線程數量的限制,同步模塊在處理消息包時,佔用了網絡的回調線程,導致共識模塊無法及時處理其它節點發來的共識消息,共識流程被阻塞。

如何解決?

——將同步消息的處理操作從網絡回調線程中剝離

基於共識模塊先行的思想,應讓共識模塊更及時地收到共識消息,不能讓同步模塊佔用網絡回調線程太久。因此,同步模塊在拿到消息時,不是直接在回調線程中對交易進行解碼和驗籤,而是將同步消息包緩存起來,用另外一個線程“私下”慢慢處理。這樣一來,同步消息的處理不會長時間佔用網絡回調線程,能讓共識消息響應得更快。

問題2:

編解碼冗餘

同步模塊收到同步消息中的交易,是經過編碼的,同步模塊需將其解碼成節點代碼中的數據結構,再存入交易池中。共識模塊打包區塊時,把交易從交易池中取出,將交易進行編碼,打包成區塊,再將區塊發送出去。在這個過程中,交易先被解碼,又被編碼,操作存在冗餘。

如何解決?

——交易編碼緩存

共識優先級高於同步,應儘量減少共識模塊中不必要的操作。因此,在同步模塊存交易時,一併將交易的編碼存入交易池。共識模塊取交易時,直接從交易池中拿出編碼好的交易,免去了編碼操作。

問題3:

重複驗籤

同步模塊在收到交易後,需對交易的簽名進行驗證(簡稱“驗籤”),共識模塊在收到區塊後,也需要對區塊中的交易進行驗籤。同步模塊和共識模塊所驗籤的交易,有很大概率是重複的。驗籤是一個非常耗時的操作,每進行一次額外的驗籤,都會消耗大量的時間。

如何解決?

——驗籤去重

無論是同步模塊還是共識模塊,在驗籤前,都去交易池裏查詢該筆交易是否存在。如果存在,就省略驗籤操作。如此一來,一筆交易只驗籤一次,減少了不必要的驗籤開銷。

解決方案可否更優?

——儘量讓同步驗籤,減少共識模塊驗籤的次數

仍然是共識模塊優先的思想,儘量減少共識模塊驗籤的操作。因此,同步模塊必須比共識模塊跑得快,在共識模塊處理一筆交易前,同步模塊先拿到交易,優先對交易驗籤。

FISCO BCOS在此處對同步模塊採取的策略是:對交易進行全量的廣播

在一個打包節點拿到交易時,其它節點的同步模塊也收到了相應的交易。在其它節點收到打包節點發過去的區塊時,區塊中所包含的交易早已被同步模塊驗籤後寫入交易池中。同時,爲了讓同步模塊在相同操作的處理速度上不低於共識模塊,同步模塊的交易編解碼,也採用了和共識模塊一樣的“並行編解碼”和“交易編碼緩存”。

 

結果如何?

共識與同步的流程優化,一定程度上也提高了交易處理的TPS。經測試,交易處理的TPS提高至原來的1.75倍!更重要的是,通過流程優化,確定了共識的主導地位,排除了同步給共識帶來的性能影響,讓之後的性能分析更好地聚焦在共識流程中!

消除了阻塞,消除了編碼冗餘,消除了重複驗籤,卓別林和他的夥伴工作得更輕鬆,更順暢了!

 


 

我們鼓勵機構成員、開發者等社區夥伴參與開源共建事業,有你在一起,會更了不起。多樣參與方式:

1 進入微信社羣,隨時隨地與圈內最活躍、最頂尖的團隊暢聊技術話題(進羣請添加小助手微信,微信ID:fiscobcosfan);

2 訂閱我們的公衆號:“FISCO BCOS開源社區”,我們爲你準備了開發資料庫、最新FISCO BCOS動態、活動、大賽等信息;

3 來Meetup與開發團隊面對面交流,FISCO BCOS正在全國舉辦巡迴Meetup,深圳、北京、上海、成都……歡迎您公衆號在菜單欄【找活動】中找到附近的Meetup,前往結識技術大咖,暢聊硬核技術;

4 參與代碼貢獻,您可以在Github提交Issue進行問題交流,歡迎向FISCO BCOS提交Pull Request,包括但不限於文檔修改、修復發現的bug、提交新的功能特性。

代碼貢獻指引:

https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/docs/CONTRIBUTING_CN.md

 

本文首發於公衆號【FISCO BCOS開源社區】,如轉載請註明出處,原創不易,謝謝珍惜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章