蔡維德:區塊鏈技術幾個重要的坑(上)

近些年,區塊鏈技術飛速發展,引領了互聯網領域一次新的技術浪潮,這種新型技術被認為是繼蒸汽機、電力、互聯網之後,下一代顛覆性的核心技術;併成為最近兩年的熱門投資方向,如著名投資人索羅斯在2017年年底的時候,把Facebook的股票全部賣掉,投資了一家用區塊鏈發行股票公司Overstock。全球各大互聯網公司也大力在區塊鏈領域佈局,積極推進區塊鏈技術的落地,如IBM的供應鏈物流,金融結算服務區塊鏈創業公司井噴般出現,國內區塊鏈企業已達456家。

在區塊鏈技術變得火熱的同時,許多新技術出現,區塊鏈技術混淆越來愈平常,公鏈和私鏈技術混淆使用,如一些著名公鏈竟然使用私鏈的技術來解決速度和擴展性的問題。很不幸的是,在區塊鏈技術快速發展的時候,一些著名的鏈的基礎協議居然還是和幾年前一樣, 這表明以前發現的問題到今天還是存在沒有解決,新出來的技術並未解決以前的問題,例如以下將要講述的第一個坑。

在2018年,讓人驚訝的是,甚至幾個世界出名的公鏈也被人察覺居然部分機制還是一箇中心在控制。這和長期標榜“去中心化”的區塊鏈思想直接衝突,表示完全“去中心化”的系統難實現,而且在今天法律制度下(例如美國證券交易監督委員會出的新法規)很難實現。但是哪些中心化機制可以被接受,哪些不能被接受,應該有所討論。這是第二個坑。

加拿大央行, 歐洲央行, 和日本央行三個世界重要央行在2017年和2018年出的3篇報告,現在區塊鏈容錯機制不能達到金融機構的需求已經是共識。區塊鏈不是自己有容錯機制嗎?有,但現在的容錯機制離實際需求差距很遠。這是第三個坑。

這些坑還存在今天著名區塊鏈系統裡,這給區塊鏈投資人造成了困擾。有人認為,著名公司研發的區塊鏈系統應該比較好,但事實上不是這樣。2017年加拿大央行報告[18]指出一些著名的區塊鏈系統離實際銀行的需求還相差很大,一些融資上億美元的區塊鏈公司在2016年和2017年開始宣佈研發大型區塊鏈合作項目,但是後來也沒能研發出來。一位美國高科技公司CTO 在2018年拜訪天德公司的時候就表示有資金和有名聲的美國高科技公司不一定可以研發出好的區塊鏈系統。這些問題也沒有因為現在新技術發展而解決。

當然區塊鏈不只有這三個坑,其他坑以後再討論。這三個都是老坑,幾年前已經發現的問題,但直到今天,這些坑還是存在一些區塊鏈系統裡面,甚至有的坑今年才引起大家重視。

這些坑都是中國的機會,因為這些著名的鏈要改是非常難的。但問題是中國真有團隊願意好好打造一個好區塊鏈嗎?還是大家只要炒幣賺錢?還是隻要山寨那些明知有問題的鏈?

第一大坑:拜占庭將軍協議或是“劉關張”共識協議

區塊鏈是一種分佈式記賬系統。在分佈式系統中,最為關鍵的問題就是一致性問題。一致性問題指的是:對於給定的一組服務器節點,指定一系列操作,在某個協議保障下,使得各服務器節點對處理結果達成一致,其中用到的協議也被稱作為共識算法。根據節點信任程度和容錯能力,我們將共識協議分為兩類:

· 拜占庭將軍協議(節點非互信)

· “劉關張”共識協議(節點互信)

拜占庭(BFT)將軍協議則是考慮存在一定數量惡意節點的情況下,當惡意節點出現任意行為時,也能有效的保證數據的一致性。BFT系列算法,是一種確定性容錯算法,共識效率高,確認時間短,容錯能力稍差,允許1/3以下的惡意節點。而區塊鏈的應用場景就是互不信任的各方通過區塊鏈技術來做生意、開公司、上法庭,解決互不信任的各方的信任問題。圖1 演示PBFT的協議,PBFT 是一個實用拜占庭將軍協議,如圖1所示,該算法經過預準備(Pre-prepare)、準備(Prepare)和確認(Commit)三個階段達成一致性。

蔡維德:區塊鏈技術幾個重要的坑(上)

圖1 PBFT(BFT協議的一種)

“劉關張”協議就是節點之間互信的協議,劉備、關羽、張飛三人桃園結義,互相信任對方,他們互不欺騙對方,三兄弟齊心協力。如果將他們對應於傳統的分佈式系統各個節點,也就是說各節點只可能出現宕機或是斷開連接的情況,不會向其他節點發送虛假消息,理想情況下,互信協議中不會出現惡意的惡意節點(向不同的節點發送不同序號的消息)。

蔡維德:區塊鏈技術幾個重要的坑(上)

圖2“劉關張”協議

拜占庭將軍協議和“劉關張”共識協議的最大差別在於: “劉關張”協議有兩輪投票,拜占庭有三輪投票。其中,拜占庭協議的前兩輪投票階段和“劉關張”協議相似。但是在拜占庭協議的第三輪投票中,參與節點需要向其他節點發送他們在第二輪階段收到的消息。所以,如果沒有第三個階段,拜占庭將軍協議就會變成“劉關張”協議。國內一些工程師原本是為了“優化”拜占庭將軍協議,結果卻是將拜占庭將軍協議第三輪去掉變成了“劉關張”協議。

本來認為“劉關張”協議只會在中國出現,但是發現“劉關張”協議也已經技術輸出國外,國外一些出名的區塊鏈居然也使用“劉關張”協議。他們也和中國公司一樣,自稱使用拜占庭將軍協議, 其實是用“劉關張”協議。

“劉關張”協議又可以分兩種:分佈式“劉關張”和中心化“劉關張”。

分佈式“劉關張”協議

這種協議用在傳統的分佈式數據庫系統,能保持多個數據副本之間的一致性,如兩階段提交協議、Paxos、Raft等, 這些都是傳統數據庫的一致性協議。互信協議允許宕機的節點數為1/2,但是一旦黑客攻擊了其中的主節點,成為惡意節點,就可能會造成系統內的數據副本混亂,系統癱瘓。

圖2、3表示兩段式分佈式“劉關張”協議, 一個是確認情景,一個是回滾情景。

蔡維德:區塊鏈技術幾個重要的坑(上)

圖2 “劉關張”協議——確認情景

蔡維德:區塊鏈技術幾個重要的坑(上)

圖3“劉關張”協議——回滾情景

如果將數據庫的互信協議應用到區塊鏈技術當中,將不能夠查驗以及抵擋惡意節點,這樣的區塊鏈只能夠應用在節點之間互相信任的環境下運行。因此,這樣的區塊鏈被許多學者認為是一個弱化的區塊鏈。

在中國工信部信通院發佈的“可信區塊鏈”白皮書標準裡面,“有效防止節點欺詐”是“可信區塊鏈”的一個最低要求,沒有達到這個功能就不能稱為“可信區塊鏈”。所以,凡使用“劉關張”協議的區塊鏈都不是可信區塊鏈。

而且工信部認為不光需要滿足上面的需求,“絕對一致的共識機”還要滿足以下需求:

“A. 任意節點錯誤響應,包括執行成功對外返回‘失敗’、執行失敗或者不執行的時候對外返回‘成功’。

B. 任意節點向網絡中其他節點發送不同的消息請求,例如:系統中有4個節點,請求消息序列為a, b, c, d, e,其中任意一個節點不按照a, b, c, d, e的序列發送給其他節點,把a只發給其中的一個節點,把b,c,d,e發給另外兩個節點。

C. 任意節點通過修改本地數據,構造本節點校驗合法的請求,例如,本節點餘額為100單位,修改本地餘額為200單位,然後發起200單位的轉賬。

對於上述情況,共識機制需要保證在小於理論節點數欺詐的情況下,節點間數據能夠恢復正確且一致,並且和對外響應結果正確且一致。”

如果使用這種弱化的區塊鏈將不能用於有強監管需求的應用裡面,例如金融、公檢法、政務。例如,最近亞洲的一個重要國家的首相夫人參與舞弊事件,而政府官員為了保護首相夫人居然篡改文件。然而一年後這舞弊事情包括政府官員違法篡改文件仍然被發現,引起政治風波。這件事情表明政務上的區塊鏈必須使用拜占庭將軍協議,而不是“劉關張”協議。因為被信任的政府官員也可能參與舞弊, 只有拜占庭協議可以查驗說謊的節點, 而且可以防止從外部和內部篡改。

蔡維德:區塊鏈技術幾個重要的坑(上)

圖4分佈式“劉關張”協議

中心化“劉關張”協議

中心化的“劉關張”協議使用“原子廣播”(atomic broadcast)來做共識。原子廣播原來目的在於保證每個參與節點收到同樣信息,因為每個節點收到同樣信息等於保證每個節點有共識。一個原子廣播通用軟件是Kafka,而Kafka 是用另一軟件Zookeeper 完成的。

但是原子廣播真的安全嗎?是分佈式共識,還是中心化共識協議?

如圖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,根據可信度,區塊鏈可以分為以下三種。

機制

協議名稱

分類

拜占庭協議

PBFT

可信區塊鏈

分佈式劉關張協議

兩階段提交協議、Paxos、Raft 、Paxos

弱化的區塊鏈

中心化劉關張協議

原子廣播(Kafka 和Zookeeper)

偽區塊鏈

第二大坑:中心化的區塊鏈控制

有些區塊鏈為了取得更快的交易速度,採用了中心化的控制,這種區塊鏈稱為“偽區塊鏈”。這種偽區塊鏈披著區塊鏈的外衣,卻是中心化的系統。在一箇中心化的系統中,控制整個區塊鏈的中心節點就是這個系統最為薄弱的環節。如果中心節點故意說謊或者被人攻破,則整個區塊鏈癱瘓。不論是公鏈或是私鏈,都可能是中心化的鏈。

例如一家市值排名很高的加密貨幣,多年自稱是分佈式區塊鏈,但在2018年研究人員發現每個節點都是由另外一家公司所控制,是中心化的集權系統,所有交易都是由中心節點來控制。消息出來後,引起業界爭論。

一些區塊鏈項目,被人爆料節點是由官方“靜態”部署的,並不具備動態選舉的特性。這是不是一種中心化的共識機制?

沒有人會認為以太訪是中心化的系統,但在其歷史上,也出現過中心化的行為,在The Dao 事件上,以太坊採用中心化的決策回覆原來的狀態, 而不是採取“去中心”的決定。可以清楚看到,一些“去中心化的區塊鏈”,在特殊關鍵時刻,很可能還是採取中心化的行為來解決問題。因為完全“去中心化”是很難的。

部分公鏈的支持者會以妖魔化來形容私鏈(聯盟鏈等),認為聯盟鏈就是中心化的系統。這是商業言語,不是學術言語。在計算機領域,多個並行的執行線程,就是分佈式系統,而且中心化的系統也不是妖魔,也不用躲避。中心化銀行系統用瞭如此多年,長期服務國家、社會、家庭、個人,根本沒有必要被妖魔化。

傳統中心化的系統中有許多好處,安全性由的安全防護系統來完成,防火牆隔離了內部系統,保護系統免受各種類型的網絡攻擊。現在的許多大型應用都是用中心化的系統。

但是區塊鏈系統不能採取這種中心化方式,因為中心化的區塊鏈和區塊鏈初衷是完全不符合的。如果每一次建塊或是每一筆交易都是中心化的行為,那這個鏈就不是區塊鏈,而是偽鏈。 以太坊只有在特殊情形下才使用中心化的手段,建塊的時候並沒有採取中心化的手段。Hyperledger系統每個交易信息都經過Zookeeper處理,所以是一個偽鏈。

實際上,區塊鏈系統應該由“獨立的”節點來運行,獨立節點就是指每個節點的狀態變化不受其他節點的控制,根據共識協議的規定,以及從其他節點接收的有效消息,獨立的進行狀態轉移。區塊鏈系統除了要分佈式處理,每個節點還要獨立式處理,所以這是一個很難的一個設計。

我們完全不需要妖魔化中心化的系統。在特殊情形下,區塊鏈也可以有中心化的行為, 例如The Dao事件,如果當時當事人沒有中心化的處理,相關單位馬上就會有幾億美元官司(以至於相關單位很可能因為官司而關閉)。他們當時做的決定是正確的。但是在一般情形下,區塊鏈必須是分佈式的,節點還是必須是獨立式處理交易和共識。

第三大坑:區塊鏈功能機制必須需要有其容錯機制

什麼是容錯機制?一個容錯機制乃是保護一個“功能機制”。基於一個功能機制(A),工程師設計一個容錯機制B,通常B 是A+容錯協議。

區塊鏈基本共識是用投票,而共識算法PBFT本質上是容錯機制,即允許系統內存在一定錯誤(惡意節點)的情況下,還能保證系統投票結果能夠保持一致性。問題是在區塊鏈的設計裡面,投票不是功能,拜占庭協議才是功能。當一個容錯機制成為功能機制的時候, 那就需要一個自己的容錯機制。如下表:

功能機制A

基於一個功能機制A的容錯機制B (A +容錯協議)

功能機制B

基於一個功能機制B的容錯機制C (B +容錯協議)

投票(A)是一個功能機制,一個投票的容錯機制(B)就是拜占庭協議。但是在區塊鏈裡面,投票不是功能機制,拜占庭協議才是區塊鏈功能機制(B), 所以區塊鏈需要一個基於拜占庭協議的容錯機制(C)。這關係可以從下表顯示。

功能機制A(投票)

基於一個投票機制的容錯機制B (拜占庭協議)

功能機制B(拜占庭協議)

基於一個拜占庭協議機制B的容錯機制C(容錯的拜占庭協議)

任何子系統都可以出錯, 任何一步都可以出錯

但是基於拜占庭協議的容錯機制是什麼?就是“拜占庭協議+容錯協議”是什麼?在國外一下學術文章裡面有一些這樣的研究,但是這些設計離實際應用還非常遠,因為在實際系統裡面,任何子系統都可以出錯,而且在系統恢復的時候仍然可能出錯,造成恢復機制非常複雜。但是學術文章裡面的容錯機制通常只有少數子系統可以出錯, 例如投票領導出錯(RBFT等協議), 但是實際系統複雜的多。

任何區塊鏈子系統都可以出錯代表什麼意義?表示通訊子系統可能出錯,計算子系統可能出錯,投票的時候可以出錯,每一步區塊鏈投票都可以出錯,數據庫可以出錯,並行算法可以出錯,加解密可以出錯。區塊鏈每個功能、每個協議、每一步、每個節點都可以出錯。而且出錯不一定是“停止錯誤”,而且可能是“拜占庭錯誤”,就是有人故意搗蛋,送不同數據給不同節點。所以一個容錯的區塊鏈系統是非常複雜的!

如果沒有容錯的拜占庭協議,任何會帶來什麼影響?一個簡單的錯誤使得拜占庭協議停止工作,或是導致錯誤的信息寫進區塊鏈數據庫裡面。前者會造成區塊鏈停止不能前行(區塊鏈性能因此差),後者造成區塊鏈不能維持數據的一致性(區塊鏈功能喪失, 後果更嚴重)。

根據第二個坑,區塊鏈不應該有中心的控制節點,而每一個節點都可以查驗其他節點,並且獨立作業。這代表區塊鏈容錯機制必須是分佈式處理,將使一個區塊鏈容錯機制設計變得非常困難。如果是中心化的容錯機制,例如由中心控制的恢復系統,這會比分佈式的恢復系統容易很多。

如圖 7,容錯和功能的關係可以從下圖來看,從功能上看,投票機制最簡單,拜占庭協議相對簡單,容錯的拜占庭協議比較複雜,分佈式容錯的拜占庭協議最複雜。從容錯性上看,投票機制最差,拜占庭協議相對差,容錯的拜占庭協議比較好,分佈式容錯的拜占庭協議最好。

蔡維德:區塊鏈技術幾個重要的坑(上)

圖7容錯機制和功能機制關係圖

如果有人懷疑這論點,可以看加拿大央行2017年的區塊鏈實驗報告,報告明確指出其所測試系統的容錯機制不夠加拿大央行報告的第8頁多次指出:驗證節點的容錯機制不夠,加拿大央行在這個系統裡面必須是一個驗證節點,但是央行需要有完整的信息,央行系統需要進行備份,也會是大數據版的系統。

加拿大央行、歐洲央行和日本央行三大央行報告之後,區塊鏈發展重點不在速度,而是可靠性,容錯性和安全性,這是區塊鏈時代的一個里程碑,也代表區塊鏈技術走上成熟期。


分享到:


相關文章: