06.08 區塊鏈你要了解的東西——拜占庭將軍問題

瞭解過區塊鏈的人,多少都聽說過拜占庭將軍問題,或聽說過區塊鏈的一個重要地方正是解決了拜占庭將軍問題。但真正明白這個問題的人並不多,甚至知道這個問題實質的人都很罕見。那麼究竟什麼是拜占庭將軍問題呢?

區塊鏈你要了解的東西——拜占庭將軍問題

一、什麼是拜占庭將軍問題?

先來說什麼是拜占庭將軍問題。

故事背景是:拜占庭帝國即中世紀的土耳其,擁有巨大的財富,周圍10個鄰邦垂誕已久,但拜占庭高牆聳立,固若金湯,沒有一個單獨的鄰邦能夠成功入侵。任何單個鄰邦入侵的都會失敗,同時也有可能自身被其他9個鄰邦入侵。拜占庭帝國防禦能力如此之強,至少要有十個鄰邦中的一半以上同時進攻,才有可能攻破。然而,如果其中的一個或者幾個鄰邦本身答應好一起進攻,但實際過程出現背叛,那麼入侵者可能都會被殲滅。

於是每一方都小心行事,不敢輕易相信鄰國。

因此,他們既要派出信使給其他“友軍”發送進攻時間,又要對收到的其他國寄過來的信件進行仔細甄別。(拜占庭將軍問題中並不去考慮通信兵是否會被截獲或無法傳達信息等問題,即消息傳遞的信道絕無問題。)

在這個過程中,關於拜占庭城的最新消息不斷地在鄰邦之間傳遞,但是隻有最優秀的將軍才能總結出最高效的戰術,並將所有收集到拜占庭的信息結合他的戰術及攻城計劃發佈給其他鄰邦。其他鄰邦將能輕易驗證戰術的真實性、有效性,並達成共識。這就是拜占庭將軍問題。

在拜占庭將軍問題裡,最重要的事情是如何讓所有將軍達成一致,如果中間出現了被拜占庭帝國收買的將軍導致只有半數以下的將軍攻打拜占庭,那麼基本上這些國家將會滅亡,所以建立信任是攻打拜占庭帝國最關鍵的一環!

二、拜占庭將軍問題和區塊鏈

從拜占庭將軍問題我們可以發現兩個主要的問題;

(1)無法保證每位將軍都是誠實的。

(2)無法保證內部信息的統一,如果每位將軍收到的信息可能有所不同。

再來看區塊鏈,我們知道區塊鏈是一種去中心化的分佈式系統,這個系統存在了多個節點,各個節點協同工作。

那麼這樣區塊鏈和拜占庭將軍問題就聯繫起來了:每個網絡節點相當於一個拜占庭將軍,這些節點最終要共同維護工作。那兩個問題也就變成了下面這個樣子。

(1)無法保證節點信息的正確

一個節點可能同時向不同的服務器發送不一致的消息,導致節點之間存儲的信息不一致。這個可以把它理解為單點一致性問題。

(2)無法保證系統內部信息統一

分佈式系統中存在一部分節點收到的信息和另一部分節點的收到的信息是不同的,那最終所有的節點應該以哪一條信息為標準呢?

假設分佈式網絡遵從少數服從多數的情況,那如果全網超過一半的節點同時作惡,去篡改了已經存在的某條信息,那系統也只能接受這條不正確信息,導致系統的前後不一致。

 這兩種問題可以統稱為系統一致性問題。

三、中本聰的解決之道

中本聰大神為了解決分佈式系統中的拜占庭將軍問題,在比特幣中開創性的提出了工作量證明機制(POW),一舉解決了單點一致性和系統一致性問題。

先簡單理解一下工作量證明機制是什麼:工作量,顧名思義就是要幹活,在比特幣中要做的就是全網節點要計算區塊的哈希值,誰先算對,誰就能獲得發出一條消息的權利,並且系統還會給算對的節點額外的獎勵;然後全網節點在這條信息之後開始計算新區塊的哈希。

1.如何解決的單點一致性問題

通過工作量證明機制,增加了發送信息的成本,每個節點不再能隨便發送信息了,只有正確算出區塊的哈希值才能發送一條消息。

這就降低了節點發送消息的速率,保證一段時間內,大部分節點收到的是一條一樣的消息。

2.如何解決系統一致性問題

為了解決系統的一致性問題,比特幣提出了最長鏈概念和6次確認概念。

1)最長鏈是什麼?

可以理解為:節點發送一個消息就是一個區塊,一個節點接收上個節點發出的消息之後,在這個消息的基礎之上開始進行新的數學題計算來獲取發送消息的權利,併產生新的消息區塊,這些區塊組成一條首尾相連的鏈條。

區塊鏈你要了解的東西——拜占庭將軍問題

在系統內信息傳輸的過程中,難免會出現節點A和節點B幾乎同時算出數學題的情況,這個時候它們向外發送消息,可能離節點A近的節點先聽到A的消息,離節點B近的節點先聽到B的消息。

節點都以最先收到的消息為準,分別開始在其後進行數學題計算。

區塊鏈你要了解的東西——拜占庭將軍問題

出現這種情況,在系統內就會出現兩條消息鏈條,出現了系統不一致性,如何解決呢?這裡就採取了最長鏈為標準。

全網節點約定:只在消息最多的那條數據鏈條之後進行數學計算和消息連接,節點時刻監聽全網狀態,確定自己是不是在最長鏈條上;如果不是,則立即切換到最長鏈去進行數學題計算。這就保證了系統內只有一套合法的消息鏈條。

區塊鏈你要了解的東西——拜占庭將軍問題

C在收到A的消息之後優先算出了數學題,那這個時候A和C所在的就是最長鏈,B所在的鏈條將會被捨棄,然後F,G,H節點會開始在C之後進行數學題計算。

(2)6次確認是什麼

為了防止在比特幣網絡中出現信息篡改情況的發生,需要每條消息經過6次確認沒有更改之後才認為有效。

通過6確認可以大大提高系統的不可篡改性,因為如果想更改一條已經確認的消息,需要正確算出6個數學難題,然後還需要保證自己的更改之後的消息鏈條為最長鏈。

這會消耗大量的成本,導致篡改數據的成本高到無法承受,最大程度的保證了系統不會出現確認過的消息前後不一致的問題。

四、總結

比特幣雖然通過採用工作量證明的機制解決了拜占庭問題,但是也造成了一些新的問題:因為在比特幣網絡中節點需要通過計算數學題的方式來獲取發消息的權利,這就需要CPU之間競爭誰的計算力強,會造成巨大的能源浪費——這也是比特幣網絡經常被人詬病的一個原因。

為了解決比特幣網絡存在的能源浪費,促使人們去探索更多辦法去解決拜占庭將軍問題,這就出現了後來的權益證明(POS)、股權委託證明(DPOS)等等。以後可能會講。


相關聯文章:


分享到:


相關文章: