認真來說,傳統的BFT共識機制是一種效率不高的算法,由于每筆交易都要通過所有節點驗證,驗證結果需要被廣播到網絡,換句話說,一筆交易要先被廣播到網絡一次,然后每個節點都要再廣播一次,這就導致了一筆交易有O(N^2)的消息復雜度。計算機背景的同學都知道,O(N^2)是一個很低效的方案,直接導致BFT在大于1000個節點之后同步能力明顯下降。對于比特幣的POW,因為任何礦工節點發現符合當前難度的塊之后,把交易打包進塊里,向全網(N)廣播,然后網絡上的所有的全節點驗證這個交易的哈希,即可證偽,所以實際上是一種一對多且不需要回復的共識機制,也即O(N)的復雜度。目前共識算法研究的前沿是如何實現O(1)算法,叫做橫向擴展(scale-out),也即一筆交易不廣播到全網,或者說,有的交易有的節點并不知道,這樣就可以解決區塊鏈的可擴展性問題。目前出現在大家視野里的O(1)共識算法有off-chain(鏈下通道),sharding(分片),DAG(有向無環圖),multi-chain(多鏈)等等,每種算法都有其特點和長處,本文將解讀這類橫向擴展的解決方案。
鏈下通道
off-chain這個概念來自比特幣社區,2013年12月提出,后來形成了我們熟悉的鏈下鏈的一套體系,也即側鏈。off-chain的誕生是由于比特幣本身或者某一區塊鏈本身的機制存在一些問題。但是直接在比特協議或者比特幣鏈條上進行修改的話,又容易出錯。而且比特幣區塊在一直不斷運行,萬一出錯了涉及的資金量太大了。這個是不被允許的。這種情況下,誕生了側鏈。本質上來說,側鏈機制,就是一種使貨幣在兩條區塊鏈間移動的機制,它允許資產在比特幣區塊鏈和其它鏈之間互轉。降低核心的區塊鏈上發生交易的次數。側鏈實質上不是特指某個區塊鏈,而是指遵守側鏈協議的所有區塊鏈,該名詞是相對與比特幣(或某宿主鏈)主鏈來說的。
針對比特幣的側鏈項目名叫閃電網絡,它的運行機制也比較簡單:你是A,要給B發起一筆交易。首先你要創建一個On-Chain交易,在這個交易中,你需要開通了一個A和B之間的支付通道(State channel),而且,你必須要做相應的抵押。比如,A打算給B轉100BTC,那么A必須要先抵押最少100BTC,然后才可以轉100BTC給B。A抵押后,就可以開始給B轉賬了。A可以隨心所欲的今天給B發1BTC,明天再給B發2BTC,都不打緊的,反正是Off-Chain交易,沒有交易費。閃電網絡在于給A和B之間提供這種支付通道,即Off-Chain(鏈外)交易通道。
那么,如果A或B想把BTC余額提出來,并停止和對方的轉賬交易,怎么辦?此時就需要關閉A和B之間的支付通道,并利用閃電網絡的一系列協議進行清算了。
假設此前A抵押了100BTC,其中總共給B轉了10BTC,那么A的余額為90BTC,B的余額為10BTC。在此過程中,A是無法篡改交易記錄的,所以最后A可以轉出的數額為90BTC,B可以轉出的數額為10BTC。
簡單總結一下閃電網絡的工作方式:
a.建立支付通道;
b.需要抵押。
建立支付通道,就是普通的鏈上交易,和正常的鏈上轉賬交易一樣;抵押則需要兩者之間的最終清算金額少于抵押金額,否則,一方完全可以關閉支付通道后跑路。嗯,大體看上去是沒問題的,反正不虧就好。
所以閃電網絡的適用情況
a.資金頻繁往來;
b.雙方之間的交易金額小于抵押金額。
例如大交易所之間使用閃電網絡就特別合適,資金你來我往的,速度快先不說,光交易費就可以省出一大筆。如果是沒什么聯系的兩個人,要交易的話,就必然會橫跨數個不穩定state channel或者要經過一個大的中繼者,這個中繼者可以是具有公信力的,也可能突然跑路,所以既然這樣為什么大家不繼續愉快地使用支付寶呢?state channel還有一個問題,剛才說到的保證金,如果持續從一方發送資金到另一方,保證金就會越來越少,最后被迫關閉,這也是一種不穩定因素。
還有一個問題,A在關閉支付通道時,B不在線的話,B可以用A之前的簽名數據申請抵押金,以補償自己的損失??墒侨绻鸅不在線,協議就只能要求A在申請關閉支付通道后,允許B先轉出余額,然后A再轉。這個過程是設置了超時機制的,在這個機制下,假設B突然發生不幸,就無法先轉出余額,那么這也意味著A永遠都無法轉出自己的那部分余額了。
最后,總結一下目前off-chain存在的問題:
a.中繼過于中心化問題;
b.在線狀態不穩定問題;
c.抵押資產問題。
分片
分片又稱Sharding,它首先出現在數據庫領域。起初,所有的數據都放在一臺服務器上。雖然不同的用戶訪問的是不同的數據,但是只有一臺服務器提供服務,隨著用戶訪問的不斷增加,即使這臺服務器是超人,在客官的不斷所求下,也會累趴下。那么人們想到最容易的改進辦法就是:將不同數據放在不同的服務器上,此時,訪問不同的數據就會由不同的服務器提供服務,從而突破單節點數據服務器I/O能力限制,系統處理能力得到線性增長。這就是計算機領域里分片的原初概念,是對數據進行分類,將不同類的數據放在不同的服務器,提供并行處理能力,這類分片的學術名稱叫做“垂直分片”。
既然有垂直,那可能也有“水平分片”??梢赃M一步想象,隨著訪問同一類數據的請求越來越多,單臺服務器依然會成為瓶頸,那么可以進一步將數據分為多個部分,分布到多臺服務器,這就是水平分片。簡而言之,分而治之就是分片的核心思想。
以太坊的分片,簡單來說就是將區塊鏈網絡劃分成若干能夠處理交易的較小組件式網絡,以實現每秒處理數千筆交易的支付系統。設置一個區塊鏈,在這個區塊鏈系統中有一百個各自不同的宇宙,每一個宇宙都是一個獨立的賬戶空間。使用者可以在某個宇宙中擁有一個賬戶,該用戶發起的交易也只會對交易相關的宇宙產生影響。是不是似曾相識?聽上去是不是和側鏈很像?是的,如果說側鏈是通過“外部嫁接”到主鏈,那分片就是將主鏈進行“內部分割”,顯然后者的實現難度要比前者復雜的多!也因此很多人都認為V神把事情復雜了……其具體為何要如此實現V神自有他的道理,不在本文討論,但基本可以確定的是,即使是分片,也會為效率犧牲一定程度的“去中心化”。順帶一提,EOS也有分片,叫Region。
基于分片技術的區塊鏈的實現對公共區塊鏈有著不同的好處。首先,區塊鏈上處理交易的速度變成了每秒上千筆甚至更多,這改變了人們對加密貨幣作為支付方式效率的看法。改善交易吞吐量將會給去中心化的系統帶來使越來越多的用戶和應用程序,而這將反過來促進區塊鏈的進一步采用,也使挖礦變得更有利可圖,同時也能吸引更多加入到公共網絡上的節點,從而形成一個良性循環。
此外,分片技術可以幫助降低交易費用,因為驗證單筆交易的處理量減少了;節點可以在依然盈利運營的同時收取較小的費用。在現實世界中,我們將低費用與高交易處理能力結合起來,會使公共鏈將變得越來越有吸引力。這些積極的趨勢所持續的時間越長,我們就會越能看到更多的主流的加密技術和區塊鏈應用程序的出現。
分片的最重要的挑戰是創建碎片。開發者需要開發一種機制來確定哪些節點可以按照安全的方式保留在哪些碎片中,這樣就能避免那些控制大量特定碎片的人所發起的攻擊。打敗攻擊者的最佳方法(至少在大多數情況下)就是建立隨機性。通過利用隨機性,網絡可以隨機抽取節點形成碎片。這樣一種隨機抽樣的方式可以防止惡意節點過度填充單個碎片。
但是,我們如何建立隨機性呢?最容易獲得公共隨機性的來源是區塊,例如,交易的Merkle tree root。在區塊中所提供的隨機性是可被公開驗證的,并且可以通過隨機提取器中提取統一的隨機比特。
然而,簡單地使用隨機機制將節點分配給碎片仍是不夠的。我們還必須要確保網絡的一個碎片中不同成員意見的一致性。這可以通過像工作量證明這樣的共識協議來實現。分片技術是區塊鏈的一個令人興奮的技術,它讓我們看到了希望,它可以在程度非常小的影響去中心化和透明度的情況下解決擴容問題。然而,毫無疑問的是,分片技術,尤其是狀態分片,在設計層面和實現層面都是非常困難的。這也是以太坊一直想走卻沒有完全走通這條路的原因。