區塊鏈時代的拜占庭容錯:Tendermint (七)

原文題目:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》git

原文做者:Ethan Buchmangithub

本文爲節選算法

 

軟件實現

Tendermint採用Go語言實現,代碼在https://github.com/tendermint/tendermint。Go是一個類C的語言,帶有強大的標準庫,能夠很輕易的啓動大量輕量級併發,而且提供了簡單並安全的開發環境。數組

該代碼使用了許多軟件包,這些軟件包足夠模塊化,能夠做爲本身的庫進行隔離。這些軟件包大部分由Jae Kwon編寫,包含錯誤修復,測試以及做者提供的臨時功能。如下小節將介紹這些軟件包中最重要的軟件包。緩存

 

二進制序列化

Tendermint使用針對簡單性和肯定性而優化的二進制序列化算法。它支持全部整數類型(包括用一個字節長度前綴編碼的varints),字符串,字節數組和時間(unix時間,精度爲毫秒)。它還支持任何類型的數組和結構體(編碼爲有序值列表,忽略鍵)。它受到Go類型系統的啓發,特別是它對接口類型的使用,它能夠做爲許多具體類型之一實現。能夠註冊接口,而且每一個具體實如今其編碼中給出前導類型字節。請在https://github.com/tendermint/go-wire中查看更多細節。安全

 

加密

諸如Tendermint之類的共識算法使用三種主要加密原語:數字簽名,散列函數和通過身份驗證的加密。雖然存在這些原語的許多實現,但選擇用於企業軟件的加密庫並不是易事,特別是考慮到世界上最經常使用的安全庫OpenSSL的嚴重不安全性。網絡

形成加密系統不安全的緣由是政府機構(如美國國家安全局)可能會故意破壞其安全屬性,後者與NIST合做,設計並標準化了當今使用的許多最流行的加密算法。鑑於這些機構明顯不合法,例如,愛德華·斯諾登所顯示的,以及試圖破壞公共密碼標準的歷史,密碼學界的許多人更喜歡使用在開放式設計的,學術環境下的算法。相似地,Tenminmint僅使用這樣的算法。數據結構

Tendermint採用RIPEMD160做爲其hash算法,此算法會產生一個20字節的輸出。它被用於交易的Merkle樹,驗證人的簽名,計算區塊hash。Go語言在其擴展庫中提供了算法的實現。RIPEMD160還被比特幣用做從公鑰導出地址的兩個散列函數之一。併發

做爲其數字簽名方案,Tendermint在ED25519橢圓曲線上使用Schnorr簽名。ED25519由Dan Bernstein公開設計,旨在實現高性能且易於實施而不會引入漏洞。Bernstein還引入了NaCl,這是一個高級庫,用於使用ED25519曲線來作認證加密。Tendermint採用Go自身擴展庫的實現。socket

 

Merkle Hash樹

Merkle樹的功能與其餘基於樹的數據結構很是類似,其附加功能是能夠生成樹中鍵的成員資格證實,該證書的大小與樹的大小成對數。這是經過成對地遞歸鏈接和散列密鑰來完成的,直到只剩下一個散列,即樹的根散列。對於樹中的任何葉子,從它到根部的一串哈希做爲其成員資格的證實。這使得Merkle樹對於p2p文件共享應用程序特別有用,其中大文件的各個部分能夠被驗證爲屬於該文件,而不須要擁有全部數據。Tendermint利用此機制來處理在網絡Gossip區塊的部分,其中根哈希包含在提議區塊。

Tendermint還提供了一個自平衡的Merkle二叉樹,以AVL樹爲模型,做爲一個名爲Merkleeyes的TMSP服務。IAVL樹可用於存儲動態大小的狀態,容許以對數時間查找,插入和刪除。

 

RPC

Tendermint提供HTTP API接口,用於查詢區塊鏈,網絡信息,共識狀態和廣播交易。一樣的API能夠經過三種方法進行訪問:利用URI編碼參數的GET請求,利用標準JSONRPC的POST請求,利用標準JSONRPC的Websocket。Websockets是高事務吞吐量的首選方法,是接收事件所必需的。

 

P2P網絡

Tendermint使用的P2P子協議在本系列第三篇「Tendermint子協議」中有更全面的描述。

 

反應器

Tendermint節點是由多個並行的反應器組成,每一個反應器管理狀態機經過網絡向對等節點的信息發送和收取,就如本系列第三篇描述的同樣,反應器根據鎖定共享數據結構來進行同步,但同步點保持在最小,所以每一個反應器大部分狀況下和別的反應器是並行的。

 

內存池

內存池反應器管理內存池,它將交易在打包入塊和提交前進行緩存。內存池使用應用程序狀態機的子集來檢查交易的有效性。交易保存在併發鏈表結構中,容許安全寫入和許多併發讀取。新的有效交易被加入到列表的末尾。每一個對等節點的例程遍歷列表,按順序將每一個交易發送給對等節點一次。列表一樣被掃描用於爲新提議收集交易,當新提議塊被提交確認後列表會按照以下規則進行更新:刪除被確認提交的交易,未確認的交易從新經過一次CheckTX方法的確認,並刪除那些無效的交易。

 

共識

共識反應器管理共識狀態機,它處理提議,投票,鎖定和塊的實際提交。狀態機使用一些持久的例程來管理,這些例程排序接收的消息並使它們可以被肯定地重放以調試其狀態。這些例程包括readloop,用於讀取接受消息的隊列,timeoutLoop用於註冊和觸發超時事件。

共識狀態機中的轉換是在收到完整的提議和區塊時,或者在給定輪次中收到超過三分之二的預選票或預先提交時進行的。在廣播中的提議,區塊數據,或者投票的交易結果被加入internalQueue隊列,並和從對等節點接受的信息一塊兒順序的被readLoop處理。這使內部消息和對等節點消息在共享狀態機的輸入上處於平等的地位,但容許更快地處理內部消息,當它們不與來自對等節點的消息位於同一隊列中。

 

區塊鏈

區塊鏈反應器以一種比共識反應器更快的技術來同步區塊鏈。也就是說,驗證者請求增長區塊高度直到全部對等節點都沒有更高高度爲止。塊在塊池中收集並經過工做例程同步到區塊鏈,該例程按期從池中獲取塊並針對當前鏈驗證它們。

一旦區塊鏈反應器完成同步,它就會切換到共識反應器。

 

總結

Tendermint實現利用了語言的併發原語,垃圾收集和類型安全,提供了一個清晰,模塊化,易於閱讀的代碼庫以及許多可重用的組件。以下一章所示,該實現得到了高性能而且對許多不一樣類型的故障具備穩健性。

 

推薦閱讀:

區塊鏈時代的拜占庭容錯:Tendermint(一)

區塊鏈時代的拜占庭容錯:Tendermint(二)

區塊鏈時代的拜占庭容錯:Tendermint(三)

區塊鏈時代的拜占庭容錯:Tendermint (四)

區塊鏈時代的拜占庭容錯:Tendermint (五)

區塊鏈時代的拜占庭容錯:Tendermint(六)

相關文章
相關標籤/搜索