近些年,區塊鏈技術飛速發展,引領了互聯網領域一次新的技術浪潮,這種新型技術被認爲是繼蒸汽機、電力、互聯網以後,下一代顛覆性的核心技術;併成爲最近兩年的熱門投資方向,如著名投資人索羅斯在2017年年末的時候,把Facebook的股票所有賣掉,投資了一家用區塊鏈發行股票公司Overstock。全球各大互聯網公司也大力在區塊鏈領域佈局,積極推動區塊鏈技術的落地,如IBM的供應鏈物流,金融結算服務區塊鏈創業公司井噴般出現,國內區塊鏈企業已達456家。算法
在區塊鏈技術變得火熱的同時,許多新技術出現,區塊鏈技術混淆越來愈日常,公鏈和私鏈技術混淆使用,如一些著名公鏈居然使用私鏈的技術來解決速度和擴展性的問題。很不幸的是,在區塊鏈技術快速發展的時候,一些著名的鏈的基礎協議竟然仍是和幾年前同樣, 這代表之前發現的問題到今天仍是存在沒有解決,新出來的技術並未解決之前的問題,例如如下將要講述的第一個坑。數據庫
在2018年,讓人驚訝的是,甚至幾個世界出名的公鏈也被人察覺竟然部分機制仍是一箇中心在控制。這和長期標榜「去中心化」的區塊鏈思想直接衝突,表示徹底「去中心化」的系統難實現,並且在今天法律制度下(例如美國證券交易監督委員會出的新法規)很難實現。可是哪些中心化機制能夠被接受,哪些不能被接受,應該有所討論。這是第二個坑。安全
加拿大央行, 歐洲央行, 和日本央行三個世界重要央行在2017年和2018年出的3篇報告,如今區塊鏈容錯機制不能達到金融機構的需求已是共識。區塊鏈不是本身有容錯機制嗎?有,但如今的容錯機制離實際需求差距很遠。這是第三個坑。服務器
這些坑還存在今天著名區塊鏈系統裏,這給區塊鏈投資人形成了困擾。有人認爲,著名公司研發的區塊鏈系統應該比較好,但事實上不是這樣。網絡
固然區塊鏈不僅有這三個坑,其餘坑之後再討論。這三個都是老坑,幾年前已經發現的問題,但直到今天,這些坑仍是存在一些區塊鏈系統裏面,甚至有的坑今年才引發你們重視。分佈式
這些坑都是中國的機會,由於這些著名的鏈要改是很是難的。但問題是中國真有團隊願意好好打造一個好區塊鏈嗎?仍是你們只要炒幣賺錢?仍是隻要山寨那些明知有問題的鏈?佈局
區塊鏈是一種分佈式記帳系統。在分佈式系統中,最爲關鍵的問題就是一致性問題。一致性問題指的是:對於給定的一組服務器節點,指定一系列操做,在某個協議保障下,使得各服務器節點對處理結果達成一致,其中用到的協議也被稱做爲共識算法。根據節點信任程度和容錯能力,咱們將共識協議分爲兩類:性能
拜占庭將軍協議(節點非互信)區塊鏈
拜占庭(BFT)將軍協議則是考慮存在必定數量惡意節點的狀況下,當惡意節點出現任意行爲時,也能有效的保證數據的一致性。BFT系列算法,是一種肯定性容錯算法,共識效率高,確認時間短,容錯能力稍差,容許1/3如下的惡意節點。而區塊鏈的應用場景就是互不信任的各方經過區塊鏈技術來作生意、開公司、上法庭,解決互不信任的各方的信任問題。圖1 演示PBFT的協議,PBFT 是一個實用拜占庭將軍協議,如圖1所示,該算法通過預準備(Pre-prepare)、準備(Prepare)和確認(Commit)三個階段達成一致性。測試
圖1 PBFT(BFT協議的一種)
「劉關張」共識協議(節點互信)
「劉關張」協議就是節點之間互信的協議,劉備、關羽、張飛三人桃園結義,互相信任對方,他們互不欺騙對方,三兄弟齊心合力。若是將他們對應於傳統的分佈式系統各個節點,也就是說各節點只可能出現宕機或是斷開鏈接的狀況,不會向其餘節點發送虛假消息,理想狀況下,互信協議中不會出現惡意的惡意節點(向不一樣的節點發送不一樣序號的消息)。
圖2「劉關張」協議
拜占庭將軍協議和「劉關張」共識協議的最大差異在於:「劉關張」協議有兩輪投票,拜占庭有三輪投票。
其中,拜占庭協議的前兩輪投票階段和「劉關張」協議類似。可是在拜占庭協議的第三輪投票中,參與節點須要向其餘節點發送他們在第二輪階段收到的消息。因此,若是沒有第三個階段,拜占庭將軍協議就會變成「劉關張」協議。國內一些工程師本來是爲了「優化」拜占庭將軍協議,結果倒是將拜占庭將軍協議第三輪去掉變成了「劉關張」協議。
原本認爲「劉關張」協議只會在中國出現,可是發現「劉關張」協議也已經技術輸出國外,國外一些出名的區塊鏈竟然也使用「劉關張」協議。他們也和中國公司同樣,自稱使用拜占庭將軍協議, 實際上是用「劉關張」協議。
「劉關張」協議又能夠分兩種:分佈式「劉關張」和中心化「劉關張」。
分佈式「劉關張」協議
這種協議用在傳統的分佈式數據庫系統,能保持多個數據副本之間的一致性,如兩階段提交協議、Paxos、Raft等, 這些都是傳統數據庫的一致性協議。互信協議容許宕機的節點數爲1/2,可是一旦黑客攻擊了其中的主節點,成爲惡意節點,就可能會形成系統內的數據副本混亂,系統癱瘓。
圖三、4表示兩段式分佈式「劉關張」協議, 一個是確認情景,一個是回滾情景。
圖3 「劉關張」協議——確認情景
圖4「劉關張」協議——回滾情景
若是將數據庫的互信協議應用到區塊鏈技術當中,將不可以查驗以及抵擋惡意節點,這樣的區塊鏈只可以應用在節點之間互相信任的環境下運行。所以,這樣的區塊鏈被許多學者認爲是一個弱化的區塊鏈。
在中國工信部信通院發佈的「可信區塊鏈」白皮書標準裏面,「有效防止節點欺詐」是「可信區塊鏈」的一個最低要求,沒有達到這個功能就不能稱爲「可信區塊鏈」。因此,凡使用「劉關張」協議的區塊鏈都不是可信區塊鏈。
並且工信部認爲不光須要知足上面的需求,「絕對一致的共識機制」還要知足如下需求:
對於下述狀況,共識機制須要保證在小於理論節點數欺詐的狀況下,節點間數據可以恢復正確且一致,而且和對外響應結果正確且一致。」
任意節點錯誤響應,包括執行成功對外返回‘失敗’、執行失敗或者不執行的時候對外返回‘成功’。
任意節點向網絡中其餘節點發送不一樣的消息請求,例如:系統中有4個節點,請求消息序列爲a, b, c, d, e,其中任意一個節點不按照a, b, c, d, e的序列發送給其餘節點,把a只發給其中的一個節點,把b,c,d,e發給另外兩個節點。
任意節點經過修改本地數據,構造本節點校驗合法的請求,例如,本節點餘額爲100單位,修改本地餘額爲200單位,而後發起200單位的轉帳。
若是使用這種弱化的區塊鏈,將不能用於有強監管需求的應用裏面。例如金融、公檢法、政務。
例如,最近亞洲的一個重要國家的首相夫人蔘與舞弊事件,而政府官員爲了保護首相夫人竟然篡改文件。然而一年後這舞弊事情包括政府官員違法篡改文件仍然被發現,引發政治風波。
這件事情代表,政務上的區塊鏈必須使用拜占庭將軍協議,而不是「劉關張」協議。由於被信任的政府官員也可能參與舞弊, 只有拜占庭協議能夠查驗說謊的節點, 並且能夠防止從外部和內部篡改。
圖5 分佈式「劉關張」協議
中心化「劉關張」協議
中心化的「劉關張」協議使用「原子廣播」(atomic broadcast)來作共識。原子廣播原來目的在於保證每一個參與節點收到一樣信息,由於每一個節點收到一樣信息等於保證每一個節點有共識。一個原子廣播通用軟件是Kafka,而Kafka 是用另外一軟件Zookeeper完成的。
...
原語一:可靠廣播(Reliable Broadcast,RBC)。本質上,可靠廣播使得消息最終到達全部的進程一次。可靠廣播(RBC)是一個廣播原語知足以下特性,對消息m,有:
有效性(validity) - 若是一個正確的進程廣播m,它最終成功傳達了m
一致性(agreement) - 若是一個正確的進程成功傳達了m,全部最終全部的進程成功傳達m
完整性(integrity) - m只傳遞一次,而且是以廣播的形式被髮送者發送出去。
...
原語二:原子廣播( Atomic Broadcast,ABC),其知足可靠廣播(RBC)和另外的一個屬性:
...
原子廣播是一個可靠的廣播,其中值(values)以相同的順序被髮送到每一個機器上。注意到這實際上覆制交易日誌的問題。通俗地講,該問題能夠被稱做共識。
...
共識原語的標準定義知足如下條件:
終止性 - 每一個正確的進程最終能作出決定——【共識特有】
完整性 - 每一個正確的進程最多隻作出決定一次
一致性 - 若是一個進程作出了v1的決定, 而且另一個進程作出了v2的決定,那麼v1=v2
有效性 - 若是一個正確的進程作出了v的決定,至少一個進程提議了v
...
直觀地,共識和原子廣播看上去十分相似,主要的差別在於,原子廣播自己做爲一個協議是連續的,然而共識指望終止。這就是說,每個能夠精簡爲另外一個。共識能夠被精簡爲原子廣播經過決定第一個原子廣播的值。原子廣播能夠精簡爲共識,經過依次運行許多共識協議的實例。然而存在一些微妙的考量,特別是在處理拜占庭故障方面。
一個完整的參數空間的關於原子廣播精簡爲共識的描述仍然是一個開放的研究話題。
可是原子廣播真的安全嗎?是分佈式共識,仍是中心化共識協議?
如圖6,Kafka使用的Zookeeper提供的數據狀態存儲和主節點選舉服務。而Zookeeper是依賴於ZAB(一種從Paxos改造的協議)爲其提供非拜占庭容錯,即ZAB是一種「劉關張」(傳統數據庫)協議, 屬於弱化的區塊鏈。因此Kafka不能處理拜占庭將軍的問題。
並且由於Zookeeper是一箇中心化的系統,Kafka 也成爲中心化的系統。這個Zookeeper中心繫統被攻破後,整個系統就會發生問題。因此,Kafka是中心化的「劉關張」協議,和分佈式區塊鏈系統不匹配。
若是有人懷疑Zookeeper不是中心化的系統,能夠查Apache [1] 和 IBM [2] 官方網站,以及著名IT 信息網站InfoQ[3],上面都是說是中心化的系統。
Hypeledger就是使用原子廣播這種的共識協議,如圖7。其中Orderer Service的核心是Kafka集羣來完成交易排序服務。對於這種協議,即便右端的節點作拜占庭共識,若是中心化的Orderer Service被攻破了,整個系統仍是會陷入癱瘓。
圖6 Kafka、Zookeeper、ZAB協議
圖7 Hyperledger中心化「劉關張」協議
不光在性能方面,中心化的「劉關張」協議和分佈式的「劉關張」協議差異很大,在具體實現上,中心化的「劉關張」協議很容易實現,而分佈式的實現起來相對困難。與Hyperledger使用圖6的中心化「劉關張」協議實現不一樣。
有些區塊鏈爲了取得更快的交易速度,採用了中心化的控制,這種區塊鏈稱爲「僞區塊鏈」。這種僞區塊鏈披着區塊鏈的外衣,倒是中心化的系統。在一箇中心化的系統中,控制整個區塊鏈的中心節點就是這個系統最爲薄弱的環節。若是中心節點故意說謊或者被人攻破,則整個區塊鏈癱瘓。不管是公鏈或是私鏈,均可能是中心化的鏈。
部分公鏈的支持者會以妖魔化來形容私鏈(聯盟鏈等),認爲聯盟鏈就是中心化的系統。這是商業言語,不是學術言語。在計算機領域,多個並行的執行線程,就是分佈式系統,並且中心化的系統也不是妖魔,也不用躲避。中心化銀行系統用瞭如此多年,長期服務國家、社會、家庭、我的,根本沒有必要被妖魔化。
傳統中心化的系統中有許多好處。安全性由的安全防禦系統來完成,防火牆隔離了內部系統,保護系統免受各類類型的網絡攻擊。如今的許多大型應用都是用中心化的系統。
可是區塊鏈系統不能採起這種中心化方式,由於中心化的區塊鏈和區塊鏈初衷是徹底不符合的。若是每一次建塊或是每一筆交易都是中心化的行爲,那這個鏈就不是區塊鏈,而是僞鏈。
實際上,區塊鏈系統應該由「獨立的」節點來運行,獨立節點就是指每一個節點的狀態變化不受其餘節點的控制,根據共識協議的規定,以及從其餘節點接收的有效消息,獨立的進行狀態轉移。區塊鏈系統除了要分佈式處理,每一個節點還要獨立式處理,因此這是一個很難的一個設計。
咱們徹底不須要妖魔化中心化的系統。在特殊情形下,區塊鏈也能夠有中心化的行爲, 例如The Dao事件,若是當時當事人沒有中心化的處理,相關單位立刻就會有幾億美圓官司。他們當時作的決定是正確的。可是在通常情形下,區塊鏈必須是分佈式的,節點仍是必須是獨立式處理交易和共識。
什麼是容錯機制?
一個容錯機制乃是保護一個「功能機制」。基於一個功能機制(A),工程師設計一個容錯機制B,一般B 是A+容錯協議。
區塊鏈基本共識是用投票,而共識算法PBFT本質上是容錯機制,即容許系統內存在必定錯誤(惡意節點)的狀況下,還能保證系統投票結果可以保持一致性。
問題是在區塊鏈的設計裏面,投票不是功能,拜占庭協議纔是功能。當一個容錯機制成爲功能機制的時候, 那就須要一個本身的容錯機制。以下表:
投票(A)是一個功能機制,一個投票的容錯機制(B)就是拜占庭協議。
可是在區塊鏈裏面,投票不是功能機制,拜占庭協議纔是區塊鏈功能機制(B), 因此區塊鏈須要一個基於拜占庭協議的容錯機制(C)。這關係能夠從下表顯示。
任何子系統均可以出錯, 任何一步均可以出錯。
可是基於拜占庭協議的容錯機制是什麼?就是「拜占庭協議+容錯協議」是什麼?
在國外一下學術文章裏面有一些這樣的研究,可是這些設計離實際應用還很是遠,由於在實際系統裏面,任何子系統均可以出錯,並且在系統恢復的時候仍然可能出錯,形成恢復機制很是複雜。可是學術文章裏面的容錯機制一般只有少數子系統能夠出錯, 例如投票領導出錯(RBFT等協議), 可是實際系統複雜的多。
任何區塊鏈子系統均可以出錯表明什麼意義?表示通信子系統可能出錯,計算子系統可能出錯,投票的時候能夠出錯,每一步區塊鏈投票均可以出錯,數據庫能夠出錯,並行算法能夠出錯,加解密能夠出錯。區塊鏈每一個功能、每一個協議、每一步、每一個節點均可以出錯。並且出錯不必定是「中止錯誤」,並且多是「拜占庭錯誤」,就是有人故意搗蛋,送不一樣數據給不一樣節點。因此一個容錯的區塊鏈系統是很是複雜的!
若是沒有容錯的拜占庭協議,任何會帶來什麼影響?一個簡單的錯誤使得拜占庭協議中止工做,或是致使錯誤的信息寫進區塊鏈數據庫裏面。前者會形成區塊鏈中止不能前行(區塊鏈性能所以差),後者形成區塊鏈不能維持數據的一致性(區塊鏈功能喪失, 後果更嚴重)。
根據第二個坑,區塊鏈不該該有中心的控制節點,而每個節點均可以查驗其餘節點,而且獨立做業。這表明區塊鏈容錯機制必須是分佈式處理,將使一個區塊鏈容錯機制設計變得很是困難。若是是中心化的容錯機制,例如由中心控制的恢復系統,這會比分佈式的恢復系統容易不少。
如圖 8,容錯和功能的關係能夠從下圖來看,
圖8,容錯機制和功能機制關係圖
若是有人懷疑這論點,能夠看加拿大央行2017年的區塊鏈實驗報告,報告明確指出其所測試系統的容錯機制不夠加拿大央行報告的第8頁屢次指出:
驗證節點的容錯機制不夠,加拿大央行在這個系統裏面必須是一個驗證節點,可是央行須要有完整的信息,央行系統須要進行備份,也會是大數據版的系統。
加拿大央行、歐洲央行和日本央行三大央行報告以後,區塊鏈發展重點不在速度,而是可靠性,容錯性和安全性,這是區塊鏈時代的一個里程碑,也表明區塊鏈技術走上成熟期。
內容來源:博客園
做者:蔡維德