摘要:
掀起了全球風暴。例如像比特幣和以太坊這種公有鏈,啟用了安全對等的應用程式,比如加密貨幣或者智慧合約。他們的安全性和效能得到了很好的研究。這篇論文涉及到了最近的私有鏈系統設計,具有更強(好)的安全性假設和效能要求。這些系統的標準和目標是破壞到現在為止在資料庫系統之上實現的應用程式,例如銀行,金融和交易應用。在私有鏈的多個平臺正在積極的開發和調整。然而,這裡有一個明確的系統框架,可以對不同系統互相進行分析比較。像這樣的一個框架可以用於評估區塊鏈作為另一個分散式資料處理平臺的可行性,同時幫助了開發人員發現瓶頸,相應的改善他們的平臺。
在論文裡,我們第一個講述了BLOCKBENCH,第一個分析私有鏈的評價框架。它作為一個公平的比較不同平臺的方法,能夠更加深入地瞭解不同的系統設計選擇。任何私有鏈都可以透過簡單的API函式整合到BLOCKBENCH當中,並且在真實和合成的智慧合同的基礎上進行負載。BLOCKBENCH在吞吐量,延遲,可擴充套件性的容錯方面衡量整體和元件效能。接下來,我們使用BLOCKBENCH對以太坊,Parity和Hyperledger Fabric進行綜合評估。結果表明,這些系統在傳統的資料處理負載方面遠遠不能取代當前的資料庫系統。此外,這三個系統之間的效能差距是因為不同層次的區塊鏈軟體設計。
我們已經發布了給公眾使用的BLOCKBENCH。
1、 介紹
區塊鏈技術在過去幾年裡獲得了巨大的發展,主要成功的原因是因為比特幣和加密貨幣。區塊鏈,也被稱為分散式分類賬簿,本質上是由一組不完全信任的節點來維護的附加屬性結構。區塊鏈網路中的所有節點都同意有序的區塊集合,每個區塊都包含很多個事務,所以區塊鏈也可以被視為異常事務的日誌。在資料庫環境中,區塊鏈可以被視為分散式事務管理問題的解決方案:保留節點資料的副本,並且同意交易的執行順序。然而,傳統的資料庫系統在受信任的環境中工作,並且採用眾所周知的併發控制技術來訂單交易。區塊鏈的關鍵優點它不會假設互相信任的節點,因此來實現設計占拜庭容錯。
在原來的設計中,比特幣區塊鏈把幣儲存為系統狀態,並與所有參與者共享。對於這個簡單的應用,比特幣節點實現簡單的複製模型,簡單地將硬幣從一個地址移動到另外一個地址。從此以後,區塊鏈快速增長,以支援使用者自定義和完整地狀態模型。以太坊是一個眾所周知的例子,所有分散的複製應用程式稱為智慧合約。更重要的是,業界已經開始推動專為私人設計的嵌入式平臺的開發參與者進行身份驗證的設定。這種環境中的區塊鏈系統稱為私有(或者許可),而不是在任何人都可以加入或者離開的公共環境中執行的早期系統。安全交易和結算申請,資產和財務管理,銀行和保險正在建設和評估。這些應用程式目前有企業級資料庫系統(如Oracle和MySQL)支援,但是區塊鏈可能會破壞這種現狀,因為它會降低基礎設施和人力成本。尤其是不變性和透明度有助於減少人為錯誤和因為確定資料而需要人工干預。區塊鏈可以透過刪除資料治理中的重複工作來幫助簡化業務流程。高盛估計目前資本市場節省60億美元,摩根大通預測,截止到2020年,區塊鏈將開始取代目前的冗餘基礎設施。
鑑於在資料庫技術已經占主導地位的情況下采用區塊鏈這一趨勢,要提出的一個問題是在區塊鏈在多大程度上可以處理資料工作量。另一問題是今天可以選擇許多平臺,儘管區塊鏈是一個開放的協議,但是在實現細節上還是有不同。在這項工作中,我們開發了一個名為BLOCKBENCH的框架來解決這兩個問題。BLOCKBENCH是學習和比較許可鏈效能的第一個基準。雖然許可鏈中的節點仍然不能相互信任,它們的身份被認證,這使得系統可以使用更有效的協議來行使拜占庭容錯而不是公開設定。我們不把公有鏈作為研究焦點,因為它們的表現(以及權衡安全保障)是比較好研究的。我們的框架不僅對應用程式開發人員有用,以評估區塊鏈滿足應用需求的潛力,而且還為平臺開發人員提供了遠見:幫助他們識別和改進效能瓶頸。
我們在開發BLOCKBENCH面臨三大挑戰。第一,區塊鏈系統包括許多部分,我們觀察到,幾乎每個細節都在不同平臺之間進行了各種各樣的設計選擇。在BLOCKBENCH,我們將區塊鏈結構分為三個模組層次,並將其研究集中在它們上:共識層,資料模型和執行層。第二,平臺有很多不同的選擇,但並不是全部都達到了成熟的設計,實施和已建立的使用者群。為了這些,我們首先從考慮的三個最成熟的平臺設計來設計BLOCKBENCH,亦即以太坊,Parity和Hyperledger,然後推廣到支援未來的平臺。這三個平臺都支援智慧合約並且可以被部署在私有環境裡。第三,缺乏資料庫導向的區塊鏈工作量證明。雖然在公有鏈上可以找到真正的以太坊交易和合約,目前還不清楚這樣的工作量是否足夠有代表性來評估區塊鏈的一般資料處理能力。為了解決這個挑戰,我們將區塊鏈作為一個鍵值儲存與引擎相結合,可以透過智慧契約實現事務和分析功能。然後,我們基於實際和合成資料來設計和執行事務和分析工作負載。
BLOCKBENCH是一個靈活和可擴充套件的框架,提供了一些載入機制,並附有以太坊,Parity和Hyperledger作為後端。載入機制目前是針對交易量的,旨在支援資料庫式應用程式的巨集基準和微基準塊。具體來說,當前的巨集基準測試包括一個鍵值,一個OLTP載入機制和一些真正的以太坊智慧合約的載入機制。對於每個共識,資料和執行層至少有一個微基準載入機制來孤立地測量其效能。比如,用於執行層,BLOCKBENCH提供了兩種載入機制:測試智慧合同I / O和計算速度的載入機制。新的載入機制和區塊鏈可以透過一組簡單的API輕鬆整合。BLOCKBENCH在幾個維度量化後端系統的效能,包括:吞吐量、延遲、可擴充套件性和容錯能力。它支援模擬網路攻擊的安全評估。使用BLOCKBENCH我們對兩個巨集基準和四個微基準工作負載的三個區塊鏈系統進行了深入的比較。結果表明,區塊鏈系統的效能有限,遠遠低於最先進的資料庫系統的預期(比如H-店)。在七個基準測試中,其他兩個系統的表現總是勝過Hyperledger。但是它不能超過16個節點。我們的評估表明,協商一致的協議解釋了以太坊和Hyperledger應用層的效能差距。我們還確定了以太坊和Parity的執行和資料層的處理瓶頸。最後,我們的評估也揭示了以太坊和Parity的執行和資料層的瓶頸。
綜上所述,我們的貢獻是:
我們提出了第一個用於理解和比較許可的區塊鏈系統效能的基準框架。我們已經公佈了公共使用的框架。
對以太坊,Parity和Hyperledger進行綜合評估。我們的實證結果提供了區塊鏈處理資料處理載入機制方面侷限性的具體證據,並揭示三大制度的瓶頸。該結果作為區塊鏈技術進一步發展的基準。
在下一節中,我們更詳細地討論區塊鏈系統。第3節描述BLOCKBENCH設計和實施。第4節介紹了我們對三個系統的比較效能研究。我們從第5節的結果和第6節的相關工作中討論經驗教訓,我們在第7節總結。
2、 私有鏈
典型的區塊鏈系統由不完全相互信任的多個節點組成。一些節點表現出拜占庭式行為,但大多數是誠實的。節點一起維護一組共享的全域性狀態,並執行修改狀態的事務。區塊鏈是一種維護狀態和歷史交易的特殊資料結構。系統中的所有節點都同意儲存在區塊鏈上的事務及其順序。因此,區塊鏈通常被稱為分散式分類帳。
區塊鏈交易。區塊鏈中的事務與傳統資料庫中的事務相同:在一些狀態下應用的一系列操作。因此,區塊鏈事務需要相同的ACID語義。關鍵的區別在於正在考慮的故障模式。當前事務性分散式資料庫採用傳統的併發控制技術,例如兩階段提交來確保ACID。它們可以實現高效能,因為簡單的故障模型,既而奔潰失敗。相比之下,原始的區塊鏈設計考慮到節點是拜占庭式很惡劣的環境,並且它們可以自由地加入和離開。在這種模式下,併發控制的開銷要高得多。
比特幣。比特幣(加密貨幣)狀態是網路中可用的數字硬幣。比特幣交易將硬幣從一組地址移動到另一組地址。每個節點廣播一組它要執行的事務。稱為礦工的特殊節點將事務收集到區塊鏈中,檢查其有效性,並啟動協商協議將塊附加到區塊鏈。
圖1:區塊鏈軟體堆疊在完全驗證的節點上。非驗證節點僅儲存塊頭。不同的區塊鏈平臺在區塊鏈和應用層之間提供不同的介面。
顯示了區塊鏈資料結構,其中每個塊透過加密指標連結到其前身,一路回到第一(創世紀)區塊。比特幣使用工作量證明達成共識:只有成功地解決了計算難題的礦工(找到塊標題的正確隨機數)才能追加到區塊鏈。 PoW容忍拜占庭故障,但它本質上是概率性的:可能同時附加兩個塊,在區塊鏈中建立一個岔。比特幣透過僅在考慮塊之後才確定這一點,之後是多個塊(通常為6個塊)。這種概率保證會導致安全效能和效能問題:攻擊已經被對手控制了25%的節點所證明,而比特幣事務吞吐量仍然很低(每秒7個事務)。
以太坊。由於簡單的事務語義,比特幣節點執行預構建到協議中的非常簡單的狀態機。以太坊擴充套件比特幣以支援使用者定義和圖靈完成狀態機。尤其是,以太坊區塊鏈讓使用者以智慧合同的形式定義任何複雜的計算。除了區塊鏈的共享狀態(例如密碼幣)之外,每個智慧合約都可以訪問自己的狀態。圖1展示顯示了典型以太坊中的軟體堆疊節點:完全驗證的節點包含區塊鏈的整個歷史,而非驗證節點僅儲存塊頭。與比特幣的一個主要區別是,智慧合同狀態以及正常交易都得到維護。事實上,一個智慧合同是透過一個獨特的地址來識別的,它具有自己的貨幣餘額(在乙太網絡中),並且在檢索一個交易的地址時,它執行合同的邏輯。乙太網配備執行引擎EVM來執行智慧合約。圖2顯示了一個在以太坊上執行的流行合約片段,該協議實施了一個金字塔計劃:使用者向此次合約匯款,用於向早期參與者支付利息。該合約有自己的狀態,即參與者名單,並出口一個名為enter的函式。使用者透過交易傳送他的錢來呼叫此合約,由傳送者和金額訪問的智慧合約訪問。
私有鏈。以太坊使用與比特幣相同的協議,儘管具有不同的引數。實際上,90%的公鏈系統採用工作量證明協議的變體。PoW是非確定性的和算力消耗大的,這使得它不適合於諸如銀行和金融的應用,其必須以確定性方式處理大量交易。最近的塊鏈系統,例如Hyperledger,考慮限制的設定,其中節點被認證。儘管在這種許可的環境中,PoW仍然是有用的,如在以太坊的情況下,存在節點身份已知的更有效和確定性的解決方案。在這種封閉設定中的分散式容錯共識是分散式系統中一個很好研究的主題。Zab,Raft,Paxos,PBFT是目前正在使用的流行協議。最近被許可的區塊鏈使用現有的PBFT,如同Hyperledger,或開發自己的變體,如Parity,Ripple和ErisDB。這些系統中的大多數都支援使用不同語言的不同API和執行引擎的智慧合同(參見附錄中更為全面的比較)。因此,獲得了許可的區塊鏈可以比基於PoW的區塊鏈更有效地執行復雜的應用程式,同時也是拜占庭式容錯的。這些財產和主要銀行和金融機構的商業利益已經給私人封鎖帶來了破壞當前資料管理實踐的潛力。
3、 區塊鏈設計
本節討論塊鏈的常見抽象層次和基準工作負載。
圖3:區塊鏈中的抽象層,以及BLOCKBENCH中的相應工作負載
3.1區塊鏈層
有很多區塊鏈的選擇:超過200比特幣變體,以太坊和其他許可的塊鏈。為了有意義地比較它們,我們確定了所有這些系統中(圖3)發現的四個抽象層,並設計了我們的載入機制來定位這些層。協議層包含協議,透過該協議塊被認為附加到區塊鏈。資料層包含區塊連結資料的結構、內容和操作。執行層包括支援區塊鏈操作的執行時環境的細節。最後,應用層包括區塊鏈應用的類別。在相關工作中,Croman等人提出將區塊鏈分為幾個平面:網路,共識,儲存,檢視和側面。雖然類似於我們的四個層次,平面抽象是面向加密貨幣應用程式,並沒有考慮到智慧合約的執行。我們的圖層更準確地模擬了私有區塊鏈的真正實現。我們現在輪流討論這些層。
3.1.1共識
共識層的作用是使系統中的所有節點對區塊鏈內容達成一致。也就是說,如果一個節點附加(或提交)一個塊,其他節點也將相同的塊附加到其塊的副本中。在崩潰故障模型中達成共識的協議在分散式資料庫中發揮關鍵作用,其中節點同意全域性事務順序。另一方面,區塊鏈系統採用一系列拜占庭容錯協議。在同一個極端,像比特幣一樣,以太坊使用工作中的工作難易程度來逐步調整,以達到每14s(目前)一個塊的速度(比特幣的差距達到每10秒一個塊的速度)。本質上,PoW在每一輪選擇可以附加塊的隨機節點,其中被選擇的概率由節點的總計算能力確定。這個簡單的方案適用於Sybil攻擊-開放,分散的環境中的對手攻擊,敵對方可以獲得多個身份。然而,它消耗了大量的能量和計算能力,因為節點花費他們的CPU週期來解決謎題,而不是做其他有用的工作。更糟糕的是,它不能保證安全:兩個節點都可以選擇附加到區塊鏈,並且兩個塊都可以被接受。這導致fork在區塊鏈中大多數基於PoW的系統新增附加規則,例如,只有最長鏈上的塊被認為是接受的。以太坊,特別地,採用稱為GHOST的PoW變體,其接受重分支中的塊。在任何情況下,一個塊只能以某種高概率被確認為區塊鏈的一部分。
在另一個極端,Hyperledger使用經典的PBFT協議,其通訊約束:O(N2)其中N是節點數。PBFT可以容忍少於N/3個故障,並且在三個階段中工作,節點間相互廣播訊息。首先,預先準備階段選擇一個提交值的領導者。然後,準備階段廣播要驗證的值。最後,提交階段等待多於兩個節點的確認,然後才宣佈該值被提交。PBFT已經被證明在部分非同步模型中實現活躍性和安全性,因此,與PoW不同,一旦附加了塊,就立即被確認。它可以容忍比PoW更多的故障(這顯示容易受到25%的攻擊)。然而,PBFT假定節點身份是已知的,因此它只能在被許可的設定中工作。此外,由於其通訊開銷,協議不太可能擴充套件到以太坊的網路大小。
在此之間,有各種混合設計結合了PoW的可擴充套件性和PBFT的安全效能。例如,Bitcoin-NG透過使用PoW進行領導選舉來解除事務驗證的共識,然後可以一次新增多個塊。類似地,Byzcoin和Elastico利用PoW來確定執行PBFT的隨機,較小的共識組。另一個例子是ErisDB採用的Tendermint協議,該協議結合了證據(PoS)和PBFT。不像PoW,PoS稱為授權證明(或PoA)。在該協議中,一組許可權是預先確定的,並且每個許可權被分配一個固定時隙,在該時隙內它可以生成塊。PoA強調了當局的信任,因此只適用於私人部署。
3.1.2資料模型
在比特幣中,交易是一等公民:它們是表示網路中數字硬幣的系統狀態。私鏈從這個模型出發,重點關注賬戶。一個直接簡單的好處——特別是對於涉及加密貨幣的應用程式。例如,在比特幣中將貨幣從一個使用者轉移到另一個使用者涉及搜尋屬於發件人的交易,然後將其中的一些標記為已用,而在以太坊中可以透過在一個交易中更新兩個帳戶輕鬆完成。以太坊的帳戶餘額作為其狀態,並在收到交易後更新。稱為智慧合約的特殊型別的帳戶包含可執行程式碼和私有狀態(圖1)。當收到交易時,除了更新其餘額之外,合約的程式碼將使用交易中指定的引數進行呼叫。程式碼可以讀取其他非合同賬戶的狀態,並且可以在執行期間傳送新的事務。奇偶性採用與以太坊相同的資料模型。在Hyperledger稱為chaincode和乙太網合同相同。chaincode只能訪問其私有儲存,並且隔離彼此。
一個塊包含事務列表,以及執行的智慧合約列表以及其最新狀態。每個塊由其內容的加密雜湊識別,並且與先前的塊的身份相關聯。在Parity,整個塊內容被儲存在記憶體中。以太坊和Hyperledger,內容被組織成兩層資料結構。這些狀態儲存在基於磁碟的鍵值儲存(以太坊中的LevelDB和Hyperledger中的RocksDB)並且組織在一個雜湊樹中,其根部包含在區塊頭中。以太坊將狀態快取在記憶體中,而Hyperledger將其資料管理完全外包給儲存引擎。受區塊的事務影響的狀態只記錄在根雜湊中。事務列表的雜湊樹是一個經典的Merkle樹,因為列表不大。另一方面,狀態樹使用不同的Merkle樹變體。以太坊和Parity採用Patricia-Merkle樹,支援高效的更新和搜尋操作。Hyperledger實現Bucket-Merkle樹,它使用雜湊函式將狀態分組到一個從其構建Merkle樹的桶列表中。塊標題和關鍵值儲存一起保持所有區塊鏈的歷史事務和狀態。為了驗證和執行事務,區塊鏈節點僅需要幾個最近的塊(或者僅僅是基於PBFT的系統的最新塊)。然而,節點還透過一些類似RPC的機制與沒有整個區塊鏈的輕量級客戶端進行互動。這樣的外部介面可以在區塊鏈上建立第三方應用程式。當前系統支援最小的查詢集,包括根據其ID獲取塊和事務。以太坊和Parity透過JSON-RPC公開更全面的API,支援特定塊處的帳戶狀態查詢和其他塊統計資訊。
3.1.3執行層
在執行時環境中執行合約(或鏈碼),要求是執行必須是快速的,因為在一個塊中有多個合同和事務,並且它們都必須由節點進行驗證。另一個原因是執行必須是確定性的,理想情況下在所有節點上都是相同的。確定性執行避免事務輸入和輸出中的不一致性,導致塊被中止。在PoW和PBFT中,中止交易浪費了計算資源。
以太坊開發自己的機器語言(位元組碼)和用於執行程式碼的虛擬機器(稱為EVM),這也被Parity採用。EVM針對特定於以太坊的操作進行了最佳化。例如,每一個執行的程式碼指令都要花費一定量的gas,並且總成本必須被正確跟蹤並收取到交易的發件人。此外,程式碼必須跟蹤中間狀態,並且如果執行用盡氣體則將其反轉。Hyperledger相比之下,它不會在設計中考慮這些語義,所以它只是支援在Docker影象內執行編譯的機器程式碼。具體來說,鏈碼被部署為透過預定義介面與Hyperledger後端互動的Docker影象。Hyperledger的環境的一個優點是它支援多種高階程式語言,如Go和Java,而不是以太坊自己的語言。在開發環境方面,Hyperledger僅暴露了簡單的關鍵值操作,即putState和getStare。這是受限制的,因為任何合同狀態必須對映到關鍵值元組中。這是受限制的,因為任何合同狀態必須對映到關鍵值元組中。這是受限制的,因為任何合同狀態必須對映到關鍵值元組中。
3.1.4 應用層
許多應用正被熱情地提議結合區塊鏈技術,利用區塊鏈突出的關鍵屬性。首先,區塊中的資料對於參與者是不可變和透明的,這意味著一旦新增了記錄,就不可能更改。其次,它對不誠實和惡意的參與者是有彈性的。即使在許可的環境中,參與者也可以相互不信任。然而,最流行的應用程式仍然是加密貨幣。以太坊有自己的貨幣(以太幣),並且大部分在其上執行的智慧合約都是貨幣相關的。DAO是以太坊最積極的應用,為群眾資助,交流,投資或任何其他分散活動創造了社羣。DAO基金來自於參與者貢獻的資金,並使參與者的投票權與其貢獻成比例。Parity的主要應用是管理乙太網的錢包應用程式。由於主要是銀行正在考慮採用加密貨幣,一些金融技術公司正在採用加密貨幣來調解金融交易,例如在可靠的交易市場。其他的例子包括應用貨幣和智慧合約來進行更透明和更具成本效益的資產管理。
一些應用基於區塊鏈不可篡和透明的特性,可以使目前的應用更好地完善在工作流程中無法避免的瓶頸。另一個例子是共享經濟應用:如AirBnB,它可以使用區塊鏈來評估在分散在各地的運營商的聲譽和信譽,因為任何使用者的歷史活動是可用的和不可改變的。所以這個延伸到物聯網設定,在器件需要建立相互信任的網際網路。
未完待續