第一章 探尋區塊鏈的源頭 ——“重回拜占庭”

xiaohuanglv發表於2018-09-14

每一個時代都有自己值得驕傲的技術,無論是電晶體、鐳射、網際網路,還是載人太空梭。近10年中,金融網路領域 最具顛覆性、最閃耀的技術發明莫過於區塊鏈。無論是與數字貨幣一道橫空出世,繼續發力衍生出智慧合約,還是可預見的未來,不斷重塑整個金融世界,都使它的 奪目光芒無法掩蓋。然而究其源頭,我們不得不追溯到“拜占庭將軍問題”和“雙花問題”。後者比較簡單,即如何杜絕非實體貨幣的再次被使用,或者是雙重支付 (只要引入蓋時間戳的電子簽名就能解決)。而前者,“拜占庭將軍問題”則看起來費解且撲朔迷離,但我們又不能迴避,因為它是整個區塊鏈技術核心思想的真正 根源,也直接決定了區塊鏈技術的種種與眾不同的顛覆性特質。

在某種程度上,問題比答案更重要。很難想象:如果沒有“拜占庭將軍問題”,沒有它揭示出在人類散兵遊勇的狀 態下,永恆的“共識”困境,那麼對於這種困境的反思和探索便無法成為可能,逃離困境到達光明之地也無法成為可能。所以在我們向偉大的“答案”——區塊鏈致 以敬意之時,請不要忘記它的源頭,不要忘記拜占庭。

拜占庭將軍的難題

古老的“拜占庭將軍問題”

讓人生,讓人死,讓人痴迷,讓人瘋狂。

這就是傳說中繁華與沒落,絕望與救贖並存的東羅馬帝國首都,拜占庭。

在2013年獲得電腦科學領域最高獎項圖靈獎的31年前,1972年,萊斯利·蘭伯特(Leslie Lamport)搬到灣區。此時,他仍然是一個寂寂無聞的美國小夥。他充當Compass(馬薩諸塞州計算機合夥人公司)西海岸計劃前哨基地的先鋒,不幸 的是,這個分支機構最終未能落實。在長達5年的時間裡,他曾是Compass總部派駐加州的唯一員工。最後,他卻收到撤回東海岸的指令。於是,他決定加入 史丹佛國際研究院(SRI)。在那段歲月裡,SRI有一個專案,要在美國航空航天局建立容錯型航電計算機系統。考慮到系統的工作性質,故障是不允許發生 的。這段經歷孕育了兩篇旨在解決一種特殊故障的論文,由蘭伯特和SRI同事馬歇爾·皮斯(Marshall Pies)及羅伯特·肖斯塔克(Robert Shostak)合作完成。用計算學術語說,普通故障可能會導致資訊丟失或程式停止,但系統不會遭到破壞,因為這種普通故障屬於一出錯就會停下來的故障類 型,剩下的備份的、正常的部分照樣可以運轉,發揮作用。就像戰場上的士兵,他們一旦受傷或陣亡就停止戰鬥,但並不妨礙他人繼續作戰。

然而一旦發生“拜占庭故障”,就會非常麻煩,因為它們不會停下來,還會繼續運轉,並且給出錯誤訊息。就像戰 爭中有人成了叛徒,會繼續假傳軍情,惑亂人心。當時為了解決這個問題,常常使用的技術被稱為“三重模組冗餘”:也就是說使用三臺計算機進行萬一出錯的備份 工作,三臺獨立的計算機按照少數服從多數的原則“投票”。這樣,即使其中一臺機器提供了錯誤結果,其他兩臺仍然會提供正確答案。但是為了證明這種方法的有 效性,必須拿出證據。而在編寫證據的過程中,研究人員遇到了一個問題:“錯誤”計算機可能給其他兩臺計算機傳送互不相同的錯誤值,而後者卻不會知道。這就 需要使用第四臺計算機來應對這個故障。

蘭伯特說:“如果你使用數字簽名,就可以用三臺機器達成目的,因為如果‘壞了’的計算機向一臺計算機傳送了 帶簽名的錯誤值,並向另一臺傳送了不同的帶簽名錯誤值,另外兩臺計算機就能夠交換訊息,以檢查究竟發生了什麼情況,因為兩個不同的值都是簽名傳送的。”蘭 伯特還聽吉姆·格雷談論過另一個性質大體相同的問題,人們稱之為“中國將軍問題”。這引起了蘭伯特有關司令將軍和叛徒將軍的聯想,於是他將這個問題及其解 決方案命名為“拜占庭將軍問題”。

“我記得,與我的朋友懷特·迪菲(White Duffy)坐在伯克利的一間咖啡館裡,當時他描述了一個構建數字簽名的問題。”蘭伯特回憶說,“他說:‘如果能辦到的話,會非常有用。’我說:‘這聽起 來並不很困難。’於是在一張餐巾紙上,我為他勾畫出了第一種數字簽名演算法。雖然當時並不很實用,但目前已經變得切實可行。”只可惜那張餐巾紙已經消逝在時 間的流沙中。在後來1982年正式出版的拜占庭將軍論文的序言中,他這樣寫道:

“我一直覺得正是因為通過用一組圍坐在圓桌旁的哲學家來表述,Dijkstra(迪克斯塔)的‘哲學家 就餐問題’才變得如此讓人關注(比如在理論界,它可能比‘讀者/作者’問題都引人注目,儘管讀者/作者問題可能更具實際意義)。我認為Reaching Agreement in the Presence of Faults(達成共識的缺陷)中所描述的問題十分重要,值得電腦科學家們去關注。‘哲學家就餐問題’使我認識到,把問題以講故事的形式表達出來更能引 起人們的關注。在分散式計算領域有一個被稱作‘中國將軍問題’的問題。在這個問題中,兩個將軍必須在進攻還是撤退上達成一致,但是相互只能通過信使傳送消 息,而且這個信使可能永遠都無法到達。我借用了這裡的將軍的叫法,並把它擴充套件成一組將軍,同時這些將軍中有些是叛徒,他們需要達成一致的決定。同時我想給 這些將軍賦予一個國家,同時不能得罪任何讀者。那時候,阿爾巴尼亞還是一個完全封閉的國家,我覺得應該不會有阿爾巴尼亞人看到這篇文章,所以最初的時候這 篇論文題目實際是The Albanian Generals Problem(阿爾巴尼亞將軍問題)。但是Jack Goldberg(傑克·古登博格)後來提醒我,在這個世界上除了阿爾巴尼亞之外還有很多阿爾巴尼亞移民,所以建議我換個名字。於是就想到了這一更合適的 叫法——Byzantine generals(拜占庭將軍)。”

寫這篇論文的最主要目的是將拜占庭將軍這個叫法用在這個問題上。基本的演算法文章在1980年的論文中就已經出現了。

起源:拜占庭位於現在土耳其的伊斯坦布林,是東羅馬帝國的首都。由於當時拜占庭羅馬帝國國土遼闊,為了 防禦敵人每個軍隊都分隔很遠,將軍與將軍之間只能靠信差傳訊息。在戰爭時期,拜占庭軍隊內所有將軍和副官必須達成一致共識,決定是否有贏的機會才去攻打敵 人的陣營。但是,軍隊可能有叛徒和敵軍間諜,左右將軍們的決定,擾亂軍隊整體的秩序。在達成共識的過程中,有些資訊,往往並不代表大多數人的意見。這時 候,在已知有成員謀反的情況下,其餘忠誠的將軍在不受叛徒的影響下如何達成一致的協議,就是“拜占庭將軍問題”。

兩軍問題:軍隊與軍隊之間分隔很遠,傳遞資訊的信差可能在途中陣亡,或因軍隊距離不能在得到訊息後即時 回覆,傳送方也無法確認訊息確實丟失的情形,導致不可能達到一致性。在分散式計算上,試圖在非同步系統和不可靠的通道上達到一致性是不可能的。因此對一致性 的研究一般假設通道是可靠的,或非非同步系統上執行。[1]

“拜占庭將軍問題”在通訊領域的意義

“拜占庭將軍問題”並非如傳說中那樣,源於公元5世紀的東羅馬戰場,而是產生於1982年一位美國電腦科學家的頭腦當中。因此,我們不會使用任何1982年之前的案例來描述這個問題在古老年代的意義,因為再往前追溯,它並未真正、嚴肅地被提出並加以審視。

在原始的戰爭年代,將軍與將軍、將軍與下屬間只能採用原始的方式——“出行靠走,通訊靠吼”的口頭傳輸。這 對應蘭伯特論文提出演算法中的第一部分的口頭訊息演算法,簡稱OM(m)演算法。這種情形,真偽很難辨別,只有當叛徒的總數不超過將軍總數的1/3,成為一個特 殊的“拜占庭容錯系統”時,才能在很大的訊息驗證代價後,實現最終的一致行動。這個結果非常令人驚訝,如果將軍們只能傳送口頭訊息,除非超過2/3的將軍 是忠誠的,否則該問題無解。尤其是,如果只有三個將軍,其中一個是叛變者,那麼此時無解。但這樣的錯誤,這樣的有意、無意的“叛徒”卻可能經常出現。無論 是我們把“叛變的將軍”替換成以下哪種,該問題都成立。

• 一個出故障的,向其他計算機不停發出不同錯誤資訊的伺服器;

• 一份為獲取暴利而做出來的金融票據;

• 一份失效的醫療糾紛合同;

• 一份含混不清的保單;

• 一個可以發出訊息,做出行動的錯誤資訊節點。

而這裡,每一個錯誤節點可以做任意事情:不響應;傳送錯誤資訊;對不同節點傳送不同決定;不同錯誤節點聯合起來攻擊其他節點等。沒準會出現比這更嚴重、更荒謬的錯誤。

如果說“叛變的拜占庭將軍”是我們社會中各種型別的資訊節點的隱喻,那麼“拜占庭將軍問題”所描述的情景,這樣一個進攻/撤退命令極難驗證真偽的中世紀戰場,則無疑是我們當今越發缺乏中心化的、難以判別資訊與產生信任的社會的極度悲觀的隱喻。

用演算法解決難題——區塊鏈技術的雛形

構造出一個完美的、可以解決問題的“拜占庭容錯系統”是一個不小的挑戰。而且構造出來以後,其是否真的有效,能否經得起時間的考驗與各方的質疑,這些都關乎著這個系統未來的命運與其創造群體的聲譽。

2008年冬季,美國MIT(麻省理工學院)的密碼學及密碼學政策戰略的郵件討論組中,一位澳大利亞的企業 家James A Donald(詹姆斯·A. 唐納德)就對一位聲稱構造出了一個點對點的、不需要第三方權威認證的e-cash(電子現金)支付系統提出了質疑。而他的理由就是:對方設計的P2P系統 不能夠解決“拜占庭將軍問題”。

在郵件中他挑剔地說道:“我們的確真的非常非常需要這個系統,但我所擔憂的並不是信任的問題,而是如何獲取 一個全域性共享的圖景,藉由此點而獲取一致性的問題。每個人都知道X,這並不足夠。我們需要讓每個人都知道‘每個人都知道X’。而每個人都知道‘每個人都知 道X’就是‘拜占庭將軍問題’中,分散式的資料處理最難解決的問題。尤其是當X是非常龐大的資料時……”言下之意,他並不清楚或不確信這個去中心化的系 統,如何解決拜占庭將軍的難題。

僅僅在一天之後,他就收到了原作者的回覆,一封簡潔、優雅的郵件解釋了在這個系統中,破解“拜占庭將軍問題”的演算法。[2]

“工作量證明鏈”(proof-of-work chain)正是我解決“拜占庭將軍問題”的方案。我將在那個語境中對它進行重新表述。

一群拜占庭將軍,人手一臺電腦想用字串模式匹配的方法,暴力破解國王的Wi-Fi密碼,當然他們已經 事先獲取了組成密碼的字串的長度。一旦他們開始模擬網路傳送資料包,他們必須在一個限定的時間內完成破解工作,並清除伺服器和電腦上的記錄,否則他們就 會被發現,那就麻煩了。只有當絕大多數將軍在同一時間發起攻擊和破解,這樣才能有足夠的CPU(中央處理器)和計算能力在短時間內完成破解工作。

他們並不特別在乎什麼時候開始攻擊,只要他們全部同意就好。一開始的時候,大家決定這樣搞:任何人覺得 時機到了都可以宣佈一個攻擊時刻。而且,不論是什麼時候,只要是第一個被聽到的攻擊時刻,就將被確定為官方的攻擊時刻。這樣的話問題又來了,因為網路傳達 有延遲和干擾,如果有兩個將軍差不多同一時間公佈了兩個不同的攻擊時刻,那麼有的人會最先聽到其中一個將軍釋出的攻擊時刻,而又有些人則會最先聽到另外一 個將軍釋出的攻擊時刻。

他們使用一個“工作量證明鏈”來解決這個問題。當每個將軍接收到任何表達形式的第一個攻擊時刻時,他都 會設定他的計算機來求解一個極其困難的“工作量證明”問題,對這個問題的解答是一個雜湊(Hash)雜湊,裡面也將包含著這次的攻擊時刻。由於這個“工作 量證明”問題,非常難解,一般而言,就算所有人收到這個問題後同時求解,也至少需要10分鐘才能產生解答。一旦一個將軍解出了“工作量證明”,他將會把這 個算出來的“工作量證明”向整個網路進行傳播,每一個接收到的人,將在他們當前正在做的“工作量證明”計算的雜湊中附加上剛剛被求解出來的那個工作量證 明。如果任何人正在計算他收到的其他的一個不同的攻擊時刻,他們將會轉向新的更新後的“工作量證明”計算當中,因為他現在的“工作量證明鏈”更長了。

兩個小時後,將有一個攻擊時刻被雜湊在一個有12個“工作量證明”的鏈中。每個將軍只要通過驗證(這條 工作鏈的)計算難度,就能估算出平均每小時有多少CPU算力耗費在這上面,也就會知道:這一定是在分配的時間段內,絕大多數將軍的計算機共同協作才能生成 的結果。如果“工作量證明鏈”中展示出來的算力足夠強大,可以破解國王的Wi-Fi密碼,那麼他們就可以在一致同意的時間內安全地展開攻擊。

同步、分散式資料庫和一個一致的、全域性性的視野的問題如何解決?“工作量證明鏈”就是答案。

我們可以看到這封郵件解決了下面幾個問題:

(1)引入一個困難的、需要10分鐘求解的工作量計算,限制了網路中每個時刻中被提出的進攻時刻數目。

(2)將所有求解出的“工作量證明”都逐一加入,形成一個越來越長的鏈條,一個記錄著所有“參與著攻擊時刻雜湊計算的將軍、計算的‘工作量證明’、關於‘工作量證明’的計算的總體名錄”。

(3)基於這條長鏈得出安全的進攻時刻的答案。

最後,請各位讀者注意這封解釋郵件頭上的內容:

日期:2008年11月14日06:56:55(GMT+8)

郵件作者的簽名:Satoshi Makamoto


來源:我是碼農,轉載請保留出處和連結!

本文連結:http://www.54manong.com/?id=520

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

相關文章