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