Improve Blockchain Performance using Graph Data Structure and Parallel Mining
原文: https://arxiv.org/abs/1808.10810
摘要
區塊鏈又迎來了另一個突破之年,然而區塊鏈技術所面臨的挑戰仍需被解決。本文分析了 BitCoin 系統的特點和 BitCoin-NG 系統,提出一種將鏈結構改為圖結構的方式來提高區塊鏈系統效率的方法,命名為 GraphChain。在 GraphChain 圖鏈中,每一個區塊都代表了一個交易,也表示了交易后的余額。總所周知,在區塊鏈系統中所有的交易在某個時刻都只能由一個礦工打包完成,這將浪費大量的資源。所以提高區塊鏈資源利用率的更好方式就是通過選舉和并行挖礦方式來代替原來的挖礦方式。我們運用 python 來模擬圖鏈結構和并行挖礦,提出了一中既能提高容量又能提高性能的新數據模型。
關鍵詞
blockchain, performance, graph chain, parallel mining
區塊鏈,性能,圖鏈,并行挖礦
簡介
分布式數字貨幣 BitCoin 的后端技術是區塊鏈技術。與傳統系統相比,區塊鏈具有去中心化、不可變的特點。在綜述文獻《Bitcoin and Beyond》中,區塊鏈技術創造性地結合了幾十年來的研究成果,解決了通過互聯網傳遞價值的基礎問題。
現在區塊鏈已經在互聯網上被傳播廣泛,變得眾所周知。隨著使用場景的拓寬,原先設計的一些局限性和不足慢慢顯現出來,其中的一個很重要的問題就是容量和性能的可擴展性。區塊鏈網絡堵塞最早的著名例子是在2017年一款基于區塊鏈的名為 CryptoKitties 的游戲。由于太多的人試圖通過以太坊網絡購買 CryptoKitties,不久以太坊就超過了它的最大處理能力,導致所有交易都被延遲。
到目前為止,比特幣和以太坊已經遇到了每秒交易量 (TPS) 性能的瓶頸。他們都在尋找改進的解決方案。新的協議需要提出,以解決之前區塊鏈的缺點。商業應用依賴于高性能的區塊鏈。大多數公共鏈都需要具有處理來自世界各地的大量用戶請求的能力。因此,性能顯得非常重要。
迄今為止,并沒有多少文獻報道了這一領域的研究成果,學術界也很少嘗試提高區塊鏈的性能。相比之下,許多區塊鏈產品聲稱自己有很高的性能,但大多數僅僅通過調整區塊鏈參數來追求更高的性能。到目前,僅有一些項目提出了獨特有效的方法,如 Bitcoin-NG、Bitshares、EOS、IoTA以及早期的 DagCoin。
這里值得一提的是,在論文《Bitcoin-NG: A Scalable Blockchain Protocol》中,通過礦工選舉對區塊鏈的性能進行了改進。然而,只允許一個礦工被選舉出來寫入新區塊,操作不得不排隊,容量和性能提升仍然面臨很大的挑戰。
在 Bitcoin-NG 的基礎上,我們提出了另一種方法來提高區塊鏈的性能。為了提高性能,我們需要改變數據結構。鏈數據結構和 PoW 共識機制像一個單用戶操作系統,只允許一個礦工寫數據到區塊鏈。在我們的實驗中,并行挖礦可以明顯提高 TPS。同時,多礦工可以增加網絡的穩定性,以防止沒有礦工在線的情況下交易無法確認形成的網絡堵塞。
將數據結構從鏈到圖的轉換可以讓多個礦工進行并行挖礦。在這個實驗中,基于圖數據結構被命名為 GraphChain 圖鏈。圖鏈和并行挖礦將區塊鏈提升為一個多用戶操作系統,允許多個礦工同時貢獻他們的計算資源。這也有利于縮短交易確認時間。
本文詳細介紹了一個區塊鏈系統的新協議。關鍵點在于提出了新的解決方案,一種能落地的高性能區塊鏈構建的方法。新的數據結構 GraphChain 在這個靈活的框架中發揮了關鍵作用,并行挖礦機制提高了系統的整體性能?;诖宋磥砜赡墚a生出一些新的使用場景,比如一個微支付系統、區塊鏈大數據系統或新一代銀行系統。
模型和目標
一個區塊鏈系統由 N 個全節點組成。全節點具有所有完整的交易信息,節點通過可靠的點對點網絡連接。與此同時,有 M 個礦工在等待交易請求,并準備將交易數據打包到區塊鏈中。
在經典的區塊鏈中,通過從 0 開始不斷增加 nonce 的數字,所有礦工都在競爭去算一個滿足條件哈希值。這個條件有一定難度,很多人需要一起算。當問題被解決后,新的區塊被創建。最近的交易被打包進了新區塊。如下所述,在上述模型上發現了幾個問題:
由于太多的競爭者并且最終只會產生一個贏家,大部分用于計算的能源都被浪費了。只允許一個贏家意味著這個礦工扮演了一個中心鎖,限制了整個區塊鏈系統的性能。
交易需要等待下一個新的塊生成被才能被打包進去,并獲得最終確認。這意味著所有交易都需要等待一定時間才能被確認,交易不可能能實時完成。
在原有的區塊鏈系統上做一些改進,比如調整區塊鏈的某些參數,是能夠提高一點點區塊鏈性能,例如增加塊大小。然而,引用綜述的觀點,改變塊的大小或調整區塊的間隔時間并不能無限的提高區塊鏈的性能和容量。其他方面的瓶頸,如“全節點大小限制”或“太頻繁的區塊分叉”都是不得不面對的問題。因此,需要全新的設計來解決這些限制。我們系統地重新設計了數據結構、挖礦機制和存儲分區在內的體系結構,提高了系統的性能和容量。具體實驗過程如下:
將當前鏈型數據結構轉換為基于圖的數據結構?;A數據結構的變化使得后續的改進成為可能。
將單個礦工改為多個礦工進行并行挖礦。這提高了區塊鏈的性能,可以縮短交易處理時間。這項工作的主要貢獻是提高了區塊鏈的性能,交易處理時間縮短。
數據分片。雖然通過并行挖礦增加了TPS,但是數據分片讓區塊鏈在不同的節點上分別存儲交易。因為每個節點可能存儲整個交易歷史的不同部分,所以包含所有歷史交易數據的全節點將不再存在。
實驗過程表明,將數據結構改為圖鏈的目的是為了打破了傳統區塊鏈系統的中心鎖,通過并行挖礦,增加 TPS,減少交易打包時間,使區塊鏈具有伸縮性。
鏈和圖數據結構
眾所周知,區塊鏈數據結構在比特幣等產品中得到了廣泛的應用。IoTA 和 DagCoin 則使用有向無環圖(DAG)。
圖鏈數據結構的最初想法受到 DAG 啟發。改變數據結構的主要原因是為了找到一種用并行操作取代順序操作的方法。數據結構圖鏈如圖1所示,圖鏈是一個定制的數據結構,它不是 DAG。每一個塊通常有兩個輸入和兩個輸出,塊表示交易后的帳戶狀態。另一個重要的點的輸入是有方向的。如果它是一個發送帳戶,它應該連接到上面的輸入點。因此,接收賬戶應該連接到下面的輸入點。
圖鏈與常規的鏈結構不同的在于,圖鏈不需要將交易打包到一條鏈上。使用圖鏈可以由不同的挖礦人員并行添加交易。
并行挖礦
新的機制是在世界范圍內的 M 個礦工中選擇 m 個領導人。在論文 Bitcoin-NG 中,引入了領導人 leader 的概念。礦工們過去常常通過解決哈希問題并生成一個新的區塊來獲得獎勵。在并行挖礦中,礦工通過解決難題來被選舉成為領導者。領導者將在未來一段時間內負責打包交易生成區塊。
與傳統的區塊鏈(如Bitcoin)不同的是,新的機制要求贏得選舉變成領導人的礦工在未來一段時間保持在線狀態工作。然而意外事件總是難免的,比如斷電問題,或者網絡連接問題,總是有肯能會發生。如果領導者處于離線狀態,沒有人可以代替他在線處理交易,就會阻塞整個區塊鏈系統(交易需要很長時間才能被確認)。在這種情況下,冗余是唯一選擇。需要不止一位領導人的在線,才能提高系統的穩定性。領導們作為一個團隊工作。為此制定了一套規則。以下是具體細節和要素:
礦工和領導者
在并行挖礦的基礎上,當一名礦工被選為領導者時,他在一定時間內履行他的職責。在一個滑動的時間窗口中,m(礦工的數量)個礦工被選舉為領導者。參照 BitCoin 系統,研究人員將選舉間隔時間設置為10分鐘,服務周期設置為1小時。結果是6位領導在一個滑動的時間窗口期間在線履行職責。領導者們在值班時監聽 P2P 網絡,等待新的交易請求。一旦新的交易開始傳播,領導者們就會把交易打包進圖鏈。由于領導者之間的通信延遲,同一個交易有可能被不同的領導者多次打包到圖鏈中。有m(領導的數量)個領導者是并行工作的,鏈的分支數量最多為m條。
用戶
用戶帳戶通常以零余額開始。帳戶余額因交易而改變。在一個交易中至少涉及兩個帳戶。賬戶區塊是一個非交易塊,通常只有一個輸出(圖1)。交易塊表示兩個帳戶的余額狀態。
創建和銷毀資產
頒發或撤銷資產的塊需要來自某個私鑰或多個密鑰的特殊簽名。任何資產大于零的非交易塊都應該在機制設計中仔細驗證。
交易
任何交易都應該發生在至少兩個賬戶之間。發送人的余額必須大于零。如圖1所示,每個交易塊通常有兩個輸入和兩個輸出。交易塊代表兩個賬戶的往來余額,一個是發送方賬戶,另一個是接收方賬戶。
可擴展性
比特幣及其相關系統的可擴展性有限。原因包括塊大小、總數據量、塊傳播速度和礦機容量。在比特幣[1]的設計中,選擇一個礦工來打包過去10分鐘的交易。這條規則的作用就像一把中央鎖,阻止了其他礦工的參與。
并行挖礦允許互相獨立的交易同時發生。讓我們來看看現實生活中的兩種場景:1.父母給孩子一些零花錢。2.大家排隊付錢給商家。第一類每個家庭中進行的交易的進行。他們是獨立的,很多父母可以同時轉賬。第二類交易是按順序進行的,接受每一筆交易的商業活動都會改變自己的余額。這兩種類型的交易都很常見,有時它們是混合的。并行挖礦允許更多的領導者參與挖礦任務,從而加快交易的處理速度。
領導者的選舉
在圖鏈和 BitCoin-NG 的設計當中,領導者扮演了比特幣[1]的礦工的角色。在比特幣領域,發現新區塊的礦工有權將過去10分鐘的交易打包到新區塊。在圖鏈系統中,領導者被選出來在一定時間內打包交易。但問題是:一旦挖礦結束,比特幣礦工就完成了他的任務,一旦選舉結束,圖鏈和 BitCoin-NG 的領導人就需要繼續工作。由于異常,任何領導者可能隨時脫機,除非增加冗余,否則無法保證可用性。圖鏈或 BitCoin-NG 中, 如果網上沒有領袖, 整個系統將會堵塞, 這就是為什么網上應該有不止一個領導人。領導們在競爭中合作。領導者的數量取決于系統性能的需求。
領導人的選舉方式與比特幣礦工挖出新的區塊的方式類似。該方法是基于共識機制的。作為一個想要成為領導者的礦工,世界范圍的競爭是必須的。不同之處在于,比特幣獎勵贏家礦工,圖鏈授予贏家礦工資格。成為領導者的礦工將與其他領導者一起工作一段時間,將用戶交易打包到圖鏈中。
添加交易記錄
原始的共識機制算法設置了一個困難的目標。誰先計算這個謎題,誰就會廣播這個結果并創建下一個塊。在這種情況下,在無限的競爭對手中,只有一個能贏。
在并行挖礦場景中,有限的領導者試圖解決更簡單的難題。如果一個領導者重試了幾次,仍然找不到達到目標的結果,這個領導者就會放棄。因為這個謎題非常簡單,所以我們假設至少有一個領導者能夠得到這個謎題的答案并創建下一個交易塊。
結果是,不同的領導者可能會為一個交易創建多個塊。創造者花費較少重試的塊將是幸運的新區塊。對共識機制算法的簡單修改稱為幸運證明(PoL)。
領導者將交易附加到圖鏈數據結構。由于領導者的數量有限,幸運證明(PoL)算法發揮了高效的作用。任何領導者都可以從任何未打包的交易中選擇將其附加到圖鏈中,不同的訂單都可以。
為了提高效率,可以使用算法,不同的領導者按照不同的順序排列交易,以確保所有的交易至少被追加到數據結構中一次。這是一種經過計算驗證的冗余。
數據分片
鏈數據結構很難被“切分”,因為區塊鏈不能按帳戶分割。
現有的解決方案建議通過快照保持一定的時間區塊鏈。帳戶余額列表還需要保持獨立。刪除部分區塊鏈數據會導致數據驗證困難。
此外,這里的“分片”這個術語與以太坊的“分片”不同,后者在GitHub項目頁面 https://github.com/ethereum/sharding/blob/develop/docs/doc.md 中有描述。以太坊的分片是通過雙層設計來增加容量。在圖鏈中,可以通過用戶垂直拆分來實現分片。
由于高 TPS 對生產環境的要求,數據的整體大小將會快速增加。假設有2000個 TPS,每天大約產生 24G 的數據。越來越少的個人電腦能達到作為完全克隆節點的條件。
圖鏈上的數據分片按帳戶劃分數據。通常,用戶帳戶內部表示為散列??梢院唵蔚卦O計一個節點規則,以保留所有與哈希以“a”或“b”開頭的帳戶相關的交易信息。通過這種配置,龐大的數據可以由多個冗余節點單獨保存。
測量
為了證明提出的性能改進方案,需要對單個領導者和多個領導者的性能進行度量。
第一個實驗(圖2)假設有4000筆交易等待打包,并以不同數量的領導者來衡量業績。等待中的4000個交易實際上是一個大的干擾案例。實際上,新交易應該盡快處理。
在這個實驗中,領導者可以自由選擇任何要寫入到圖鏈的交易。如果網絡延遲,領導者可能會嘗試打包已經由其他領導者完成的交易。根據最長鏈規則,對于長度相同的兩條鏈,采用幸運證明(PoL)算法來決定走哪一條。
它還發現,當更多的交易被添加到圖鏈中時,整體性能會下降。原因是當鏈長度增加時,數據庫需要查找鏈來驗證交易是否已經存在于塊中。這個問題通過添加緩存來解決。應用該技術后,我們可以在圖2中觀察到相當平均的性能。
第二個實驗(圖3)測量了區塊鏈網絡的穩定性。如果所有的領導者都是離線的,那么網絡就陷入了阻塞,因為沒有交易可以處理。研究人員使用 Simple Gilbert 模型方法對網絡狀態進行建模。假設所有的領導者都有概率 p 掉線和 1-p 機會回到線上,這里測試了單個領導和多個領導對于整個網絡狀態的穩定性。
實驗設置
實驗源代碼在GitHub上列出: https://github.com/ProofOfLuck/graph
MySQL數據庫用于存儲數據結構、領導者和交易數據。它假設點對點網絡傳輸是可靠的。實驗沒有實現那部分。在比特幣中,數據存儲在不同的全節點中,并被復制(相互復制)。這部分已經被證明是可行的。在圖鏈中,這部分是是模仿比特幣。因此,將數據存儲在集中式MySQL數據庫中不會影響性能度量。
交易直接插入到數據庫表中。下面是每個腳本文件的兩個主要步驟和詳細信息:
模擬選舉
礦工們首先通過選舉成為領袖。在實際選舉中,困難和競爭是必需的。在這個模擬代碼中,礦工將通過解決簡單的謎題(帶有固定目標的迭代哈希)而成為領導者。
模擬挖礦
領導者觀察數據庫的 transactions 表,看是否出現新的交易。一旦出現新交易,圖鏈中的空閑領導者將查詢是否其他領導者已經將交易打包成塊。否則,由現任領導者立即開始包裝。檢查下面的代碼(GitHub存儲庫中的實驗性源代碼https://github.com/ProofOfLuck/graph):
election.py 通過解決簡單的基于散列的謎題,選擇了礦工成為領導者。leader.py 扮演領導者的角色,將交易打包成塊。 leader_auto.py將選舉與領導人職能相結合,在領導人任期屆滿時繼續發揮領導作用,連任。
send.py 為用戶發送余額給另一個用戶的腳本。
send_auto.py 模擬一組用戶之間的自動交易。
wallet_new.py 生成一個私鑰。私鑰是標識,可以用于礦機用戶或普通用戶。為了簡單起見,身份的公鑰將用作錢包地址。
第一個實驗(圖2)是為了證明區塊鏈可以實現多大的性能。在圖2中,在相同交易量的挖礦任務中模擬了不同數量的礦工。據觀察,隨著工作在圖鏈上的礦工數量的增加,系統處理了更多的交易。在一臺計算機上完成了模擬。仿真代碼被調整為故意減慢速度,以防止過度使用CPU。
第二個實驗(圖3)是模擬礦工每個人都有機會脫機并重新聯機。仿真中使用了簡單的Gilbert模型[6]。從結果可以看出,5名礦工在一起工作(p設置為0.1, q設置為0.5),幾乎沒有停機時間。
評估
本文提出了提高區塊鏈性能的新方案。主要的方法是將鏈數據結構改為圖鏈,并使用新的挖礦機制來支持并行挖礦。
從實驗中可以觀察到,礦工的工作越多,可以處理的交易就越多。雖然增長不是線性增加的,但是在現有的區塊鏈中增加miner可以提高性能。與分布式數據庫系統類似,當一臺超級計算機上運行的中央數據庫無法滿足數據存儲和處理能力的需求時,人們就會使用數千臺小型PC機去另一個方向構建一個大數據系統。
還觀察到,隨著礦工人數的增加,所有節點同時脫機的可能性將接近于零。并行挖礦有利于構建可行性高的區塊鏈系統。
圖鏈和并行挖礦的應用方向有幾個:
微交易?,F在比特幣和以太坊的估值都很高,如果將其兌換成合法貨幣,即使是很小的交易費用也會很昂貴。在支持微交易的分散式貨幣系統中,允許多礦工的圖鏈能很有用,因為在圖鏈的設計中,每個塊只包含一個交易。如果有足夠的礦工可用,則不需要等待時間來確認交易。
區塊鏈數據。現在隱私問題是一個大問題,個人數據已經成為大公司的私人資產。在未來,某些領域會有區塊鏈,例如健康數據。如果將大量數據插入到區塊鏈中,那么存儲它的成本就會很高。圖鏈將數據單元分割為最小的交易級別,數據跨不同的節點鏈接。因此,通過這種數據結構可以實現分塊數據。
銀行區塊鏈系統。銀行業正在尋找數字貨幣的解決方案?,F有的區塊鏈由于性能和可伸縮性問題無法滿足需求。在這種情況下,新技術將徹底改變行業。傳統的銀行系統接受企業的存款和貸款。為了獲得安全的存款,巨大的成本被投入到IT系統中作為鋼筆和紙的選舉版本。監管政策已經制定,但它們仍需要人類來遵循。區塊鏈是一項華麗的發明,因為人類不再需要調節部分。監管成本可能低得令人難以置信。一個可擴展的高性能區塊鏈將在銀行業扮演重要角色。
圖鏈和并行挖礦是對當前區塊鏈系統的有益改進。如果正確實現,性能和容量問題將被修復。
相關工作
Bitcoin-NG: Bitcoin-NG 對原始比特幣的性能改進。它引入了微區塊,在鏈上的兩個原始塊之間起著更輕區塊作用。與 Bitcoin-NG 相比,我們引入了并行挖礦,提高了系統的可用性,還引入了圖鏈數據結構,使礦工能夠一起工作,特別是在交易不相互關聯的情況下,能起到更好的性能提升。
BitShares/EOS: BitShares 和 EOS 從 PoS 證明中開發了授權的股權證明(DPoS)。DPoS的共識機制試圖減少決策者的數量,以提高整個系統的效率。DPoS 采用了與領導人選舉類似的想法: 減少礦商參與交易處理。它為下一個區塊的產生節省了決策(更少的礦工競爭采礦)的時間。圖鏈是純基于 PoW 共識機制的,沒有使用 PoS 或 DPoS 共識。
IoTA/DagCoin: IoTA 和早期 DagCoin 引入了 DAG 數據結構,相信這是區塊鏈未來的發展方向。有向無環圖(DAG)的思想被許多系統所借鑒。最著名和成功的例子之一是IoTA。在 IoTA 的設計中,沒有礦工。任何需要在以后的交易中確認的交易。與 IoTA/DagCoin 相比,我們當前的工作的做法更像是一個比特幣系統,保留了最初的 PoW 共識機制,并將挖礦作為必要的組成部分。雖然圖鏈收到 DAG 的思想的啟發,但是圖鏈并不是 DAG。
感謝
非常感謝 Brahma OS 團隊的指導,以及提供的幫助和支持。