FISCO BCOS是完全開源的聯盟區塊鏈底層技術平臺,由金融區塊鏈合作聯盟(深圳)(簡稱金鍊盟)成立開源工作組通力打造。開源工作組成員包括博彥科技、華爲、深證通、神州數碼、四方精創、騰訊、微衆銀行、亦筆科技和越秀金科等金鍊盟成員機構。
共識與同步的流程優化,是FISCO BCOS性能優化邁開的第一步。僅依靠這一流程優化,就給系統TPS帶來可觀的1.75倍提升。但這不是目的,其目的在於確定了共識的主導地位,排除了同步給共識帶來的性能影響,讓之後的性能分析更好地聚焦在共識流程中。
基礎講解
在卓別林的電影《摩登時代》裏,卓別林扮演一個工人,日復一日地重複着擰螺絲的動作:提起扳手,找到零件,對準螺絲,擰緊,再提起扳手,再找到下一個零件,再對準螺絲,再擰緊......
在FISCO BCOS的設計裏,共識和同步也在幹着這樣重複的事情。
共識與同步是個啥?
共識與同步,是FISCO BCOS節點中的兩個核心流程。它們相互配合,實現了區塊鏈的核心功能:生產出一條在每個節點上都一致的區塊鏈。
在FISCO BCOS節點的實現裏,共識和同步的實體,我們稱爲共識模塊和同步模塊。
-
共識模塊:負責生產區塊,讓節點產生的區塊都是一模一樣的
-
同步模塊:負責廣播交易,讓用戶發出的交易儘可能地到達每個節點
共識與同步在幹啥?
我們來看看共識模塊和同步模塊的工作環境:
-
交易池:節點中緩存未被處理交易的容器
-
網絡模塊:接收其它節點發來的消息包,也可向其它節點發送消息包
那麼,共識模塊與同步模塊在幹啥?
共識模塊
不斷進行共識消息的處理和發送,讓所有節點上的區塊達到一致,此處以PBFT的共識爲例。
-
打包區塊:從交易池拿取出交易,打包成區塊廣播出去,或處理從網絡模塊拿到的其它節點的區塊
-
執行區塊:解碼區塊,驗證區塊,執行區塊,將區塊的執行結果籤個名廣播出去
-
收集簽名:收集其它節點執行結果的簽名,如果收集到的簽名達到一定數量,就向其它節點廣播“commit消息”
-
收集commit:收集其它節點的commit消息,當收集到的commit消息達到一定數量,說明區塊已經一致,可以落盤了
-
落盤:把區塊連接到現有區塊鏈的末端,形成區塊鏈,存儲到DB中
同步模塊
不斷進行交易的收發,讓每一筆交易儘可能地到達每個節點。
-
取交易:從交易池中取出未發送的交易
-
發交易:把未發送的交易廣播給其它節點
-
收交易:從網絡模塊收取其它節點的交易
-
驗交易:對交易進行解碼和驗籤
-
存交易:把驗籤通過的交易存到交易池中
問題與優化
卓別林和他的夥伴各司其職,井然有序,看似非常和諧。可當工廠落後的生產力跟不上旺盛的市場需求,即便是卓別林這種熟練工,加班加點也幹不完。這個時候,卓別林不得不開始思考自己和夥伴在生產關係上的問題。
在以往的設計中,共識模塊和同步模塊並沒有優先級的區分,導致它們在爭奪資源時浪費了大量的時間。同時,共識模塊和同步模塊中還有很多重複的操作,也浪費了時間。因此,應該將共識模塊和同步模塊的執行流程一併考慮,優化流程,提高效率。
在經過詳細分析和縝密驗證後,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開源社區】,如轉載請註明出處,原創不易,謝謝珍惜