天天看點

區塊鍊 Fisco bcos 智能合約(17)-區塊鍊的速度困境:“貴”在信任,“慢”得其所

區塊鍊領域最受關注的一個方面是“性能”,或者說“TPS”,比起來有種“不服就跑個分”的感覺。

跑分項包括

  • TPS(每秒處理交易數)、
  • 并發能力(同時承擔交易量)、
  • 交易響應時間

等。

然而,相比每秒能發送200萬封電子郵件、支援數百萬使用者同時登入一個社交平台的網際網路服務來說,區塊鍊的速度簡直是太!慢!了! 甚至有人調侃說“區塊鍊,不就是最慢的分布式資料庫嗎”(這句話可以展開多方面解析,本篇先讨論慢的問題)

區塊鍊技術前景無限美好,可如果沒有高性能表現作為支撐,無法運作快速的、執行複雜的智能合約邏輯,快速的完成交易事務,那些令人振奮的前景就隻能是摘不到的鏡中花,撈不着的水中月。

大熱的區塊鍊技術為什麼這麼慢?有什麼方案能解開區塊鍊性能的鐐铐,讓區塊鍊輕盈飛入各行各業?我們将通過這一系列專題,與你一道嘗試擴寬區塊鍊的優化之路????

區塊鍊 Fisco bcos 智能合約(17)-區塊鍊的速度困境:“貴”在信任,“慢”得其所

​ 1 為什麼區塊鍊很慢?​(直面區塊鍊的速度困境,了解區塊鍊的“慢得其所”)

​ 2 FISCO BCOS的性能優化​(我們是如何将區塊鍊交易處理性能提升的)

​ 3 基于DAG的交易并行執行引擎​(業界公認的并行化方案,FISCO BCOS真的具體落地了!)

​ 4 共識與同步流程優化​(抓主要沖突,從最慢的地方下手,讓共識行駛上快車道!)

​ 5 全方位的并行處理​(沖突是互相轉化的,撸完共識,還得讓該并行的都并行,不讓CPU有一絲絲懈怠)

​ 6 全面的性能分析工具​(工欲善其事必先利其器,工具不夠自己造)

​ 7 并行合約開發架構​(是時候揭曉廬山真面目了,一起暢享高鐵般的舒适與快速)

區塊鍊 Fisco bcos 智能合約(17)-區塊鍊的速度困境:“貴”在信任,“慢”得其所

​系列專題 | 區塊鍊的 “慢”和優化之路(1)​

​為什麼區塊鍊很慢?​

作者:張開翔

區塊鍊 Fisco bcos 智能合約(17)-區塊鍊的速度困境:“貴”在信任,“慢”得其所

​#舉個例子#​

數錢,比如數一個億(是不是好刺激~)

1、如果一個人數,慢,但好在專注,全力以赴,在可見的時間内可以數完。這叫單線程密集計算。

2、如果N個人一起數,每人平分,分頭同時數,最後彙總總數,所用時間基本上是第一種情況的1/N,參與的人越多,所需時間就越少,TPS就越高。這叫并行計算和MapReduce。

3、如果N個人一起數,但由于這N個人互相不信任,得彼此盯着。

首先抽簽選一個人,這個人撿出一疊錢(比如一萬塊一疊)數一遍,打上封條,簽名蓋章,然後給另外幾個人一起同時重新數一遍,數好的人都簽名蓋章,這疊錢才算點好了。

然後再抽簽換個人檢出下一疊來數,如此循環。

因為一個人數錢時别人隻是盯着,而且一個人數完且打上封條和簽名的一疊錢,其他人要重複數一遍再簽名确認,那麼可想而知,這種方式肯定是最慢的。​這就叫區塊鍊。​

但換個角度,方式1,一個人數有可能會數錯,這個人有可能生病或休假,導緻沒有人幹活,更壞的結果是,這個人可能調換假币或者私藏一部分錢,報一個錯的總數。

方式2,N個人中會有一定比例數錯,也可能其中一個人休假或者怠工,導緻最終結果出不來,更可能因為人多手雜,出現部分人偷錢、換假錢、報假數……

方式3,很慢,但是很安全,因為所有人都會盯着全過程進行驗算,是以肯定不會數錯。如果其中有人掉線,可以換人撿出新的一疊錢繼續數,工作不會中斷。所有數過的錢上面都有封條和簽名,不會被做手腳,萬一出錯了也可以找到責任人進行追責。這種情況下,資金安全是完全得到保障的,除非所有的參與者都串通一氣了。該模式下,參與的人越多,資金安全性就越高。

​是以,區塊鍊方案緻力追求的是,在缺乏互相信任的分布式網絡環境下,實作交易的安全性、公允性,達成資料的高度一緻性,防篡改、防作惡、可追溯,付出的代價之一就是性能。​

最著名的比特币網絡,平均每秒隻能處理5~7筆交易,10分鐘出1個塊,達到交易的最終确定性需要6個塊也就是1個小時,且出塊過程相當損耗算力(POW挖礦)。

号稱“全球計算機”的以太坊,每秒能處理的交易數也僅是2位數的量級,十幾秒出1個塊。以太坊目前也是采用損耗算力的共識機制POW挖礦,會逐漸遷移到POS共識機制。

這兩個網絡在粉絲們爆炸性地進行交易時,可能會陷入擁堵狀态,大量的交易發出後,一兩天甚至更長的時間才會被打包确認。

​但在資金安全就是命的場景下,有些事情是“必須”的,是以,即使慢,還是會考慮選擇區塊鍊。​

#區塊鍊為什麼慢#

分布式系統裡有一個著名的理論叫CAP理論:2000年,Eric Brewer教授提出一個猜想:一緻性、可用性和分區容錯性三者,無法在分布式系統中被同時滿足,并且最多隻能滿足其中兩個。

​CAP的大緻解釋​

  • Consistency(一緻性) :資料一緻更新,所有資料變動都是同步的
  • Availability(可用性):好的響應性能
  • Partition tolerance(分區容錯性): 可靠性

這個理論雖然有一些争議,但從工程實踐中看,和光速理論一樣,可以無限逼近極緻但是難以突破。

區塊鍊系統能把一緻性和可靠性做到極緻,但是“好的響應性能”方面一直有點被人诟病。

我們面向的“聯盟鍊”領域,因為在準入标準,系統架構、參與節點數、共識機制等方面都和公鍊不同,其性能表現遠高于公有鍊,但是目前幾個主流的區塊鍊平台,在正常PC級伺服器硬體上實測,TPS一般是在千級的樣子,交易延遲一般在1秒到10秒這個級别。(聽說TPS十幾萬級和百萬級千萬級區塊鍊已經做出來了?好吧,期待)

筆者曾在大型網際網路公司工作多年,在海量服務領域,面對C10K問題(concurrent 10000 connection,萬級并發)已經有輕車熟路的解決方案,對一般的電商業務或内容浏覽服務,普通pc級伺服器單機達到幾萬TPS,且平均延時在500毫秒以内,飛一般的體驗已經是常态,畢竟網際網路産品卡一下說不定就會導緻使用者流失。

對于快速增長的網際網路項目,通過平行擴容、彈性擴容、立體擴容的方式,幾乎能無底線、無上限地面對山呼海嘯的海量流量。

​相比而言,區塊鍊的性能比網際網路服務慢,而且難以擴容,根因還是在其“用計算換信任”的設計思路上。​

具體哪裡慢呢?

從“古典”區塊鍊的系統内部來看????

​1、為了安全防篡改防洩密可追溯,

引入了加密算法來處理交易資料,增加了CPU計算開銷,包括HASH、對稱加密、橢圓曲線或RSA等算法的非對稱加密、資料簽名和驗簽、CA憑證校驗,甚至是目前還慢到令人發指的同态加密、零知識證明等。

在資料格式上,區塊鍊的資料結構本身包含了各種簽名、HASH等交易外的校驗性資料,資料打包解包、傳輸、校驗等處理起來較為繁瑣。

對比網際網路服務,也會有資料加密和協定打包解包的步驟,但是越精簡越好,優化到了極緻,如無必要,絕不增加累贅的計算負擔。

​2、為了保證交易事務性,

交易是串行進行的,而且是徹底的串行,先對交易排序,然後用單線程執行智能合約,以避免亂序執行導緻的事務混亂、資料沖突等。

即使在一個伺服器有多核的CPU,作業系統支援多線程多程序,以及網絡中有多個節點、多台伺服器的前提下,所有交易也是有條不紊地、嚴格地按單線程在每台計算機上單核地進行運算,這個時候多核CPU其他的核可能完全是空閑的。

而網際網路服務則是能用多少伺服器的多少個核,采用全異步處理、多程序、多線程、協程、緩存、優化IOWAIT等等,一定會把硬體計算能力跑滿。

​3、為了保證網絡的整體可用性,

區塊鍊采用了P2P網絡架構以及類似Gossip的傳輸模式,所有的區塊和交易資料,都會無差别地向網絡廣播,接收到的節點繼續接力傳播,這種模式可以使資料盡可能地傳達給網絡中的所有人,即使這些人在不同的區域或子網裡。

代價是傳輸備援度高,會占用較多的帶寬,且傳播的到達時間不确定,可能很快,也可能很慢(中轉次數很多)。

對比網際網路服務,除非出錯重傳,否則網絡傳輸一定是最精簡的,用有限的帶寬來承載海量的資料,且傳輸路徑會争取最優,點對點傳輸。

​4、為了支援智能合約特性,

類似以太坊等區塊鍊解決方案,為了實作沙盒特性,保證運作環境的安全和屏蔽不一緻性因素,

其智能合約引擎要麼是解釋型的EVM,或者是采用docker封裝的計算單元,

  • 智能合約核心引擎的啟動速度,
  • 指令執行速度,都沒有達到最高水準,
  • 消耗的記憶體資源也沒有達到最優。

而用正常計算機語言如C++、JAVA、go、rust語言直接實作海量網際網路服務,在這方面常常沒有限制。

​5、為了達到可容易校驗防篡改的效果​,除了第一條提到的,區塊資料結構裡攜帶資料較多之外,針對交易輸入和輸出,會采用類似merkle樹、帕特裡夏(Patricia )樹等複雜的樹狀結構,通過層層計算得到資料證明,供後續流程快速校驗。樹的細節這裡不展開,可以通過網絡上的資料來學習其機制。

基本上,生成和維護這種樹的過程是非常非常非常非常繁瑣的,既占用CPU的計算量,又占用存儲量,

使用了樹後,整體有效資料承載量(即用戶端發起的交易資料和實際存儲下來的最終資料對比)急劇下降到百分之幾,

極端情況下,可能接受了10M的交易資料後,在區塊鍊磁盤上可能實際需要幾百兆的資料維護開銷),因為存儲量的幾何級數增加,對IO性能要求也會更高。

網際網路服務因為基本不考慮分布式互驗互信的問題,很少有使用這種樹的證明結構,了不起算下MD5和HASH做為協定校驗位。

​6、為了達到全網一緻性和公信力,

在區塊鍊中所有的區塊和交易資料,都會通過共識機制架構驅動,在網絡上廣播出去,由所有的節點運作多步複雜的驗算和表決,大多數節點認可的資料,才會落地确認。

在網絡上增加新的節點,并不會增加系統容量和提升處理速度,這一點徹底颠覆了“性能不足硬體補”的正常網際網路系統思維,其根因是區塊鍊中所有節點都在做重複的驗算以及生成自己的資料存儲,并不複用其他節點資料,且節點計算能力參差不齊,甚至會使最終确認的速度變慢。

在區塊鍊系統中增加節點,隻會增加可容錯性和網絡的公信力,而不會增強性能表現,使得在同一個鍊中,平行擴充的可能性基本缺失了。 

而網際網路服務大多是無狀态的,資料可緩存可複用,請求和傳回之間的步驟相對簡單,容易進行平行擴充,可以快速排程更多的資源參與服務,擁有無限的彈性。

​7、因為區塊資料結構和共識機制特性,

導緻交易到了區塊鍊之後,會先排序,然後加入到區塊裡,以區塊為機關,一小批一小批資料的進行共識确認,而不是收到一個交易立刻進行共識确認,比如:每個區塊包含1000個交易,每3秒共識确認一次,這個時候交易有可能需要1~3秒的時間才能被确認。

更壞的情況是,交易一直在排隊,而沒有被打包進區塊(因為隊列擁堵),導緻确認時延更長。這種交易時延一般遠大于網際網路服務500ms響應的标準。

是以區塊鍊其實并不适合直接用于追求快速響應的實時交易場景,行業通常說的“提高交易效率”是把最終清結算的時間都算在内的,比如把T+1長達一兩天的對賬或清結算時延,縮短到幾十秒或幾分鐘,成為一個“準實時”的體驗。

綜上所述,區塊鍊系統天生就背着幾座大山,包括單機内部計算開銷和存儲較大,背着串行計算的原罪,網絡結構複雜備援度高,區塊打包共識的節奏導緻時延較長,而在可擴充性上又難以直接增加硬體來平行擴容,導緻scale up和scale out兩方面,都存在明顯瓶頸。

​Scale Out(等同scale horizontally):​橫向擴充,向外擴充,如:向原有系統添加一組獨立的新機器,用更多的機器來增加服務容量

繼續閱讀