區(qū)塊鏈設計核心難題:拜占庭將軍問題

7 評論 12549 瀏覽 33 收藏 9 分鐘

在前面兩期中,主要對區(qū)塊鏈的基本概念和基本設計原則進行說明,現在有了這些背景知識后,再去學習更深層的知識將會更加容易。本期我們一起研究一下拜占庭將軍問題,這是區(qū)塊鏈解決的一個核心難題,通過理解這個問題的來龍去脈,相信大家會對區(qū)塊鏈的底層知識會有一個更深入的思考。

一、先講個故事

從前有個帝國叫做拜占庭,這個國家派出5位將軍去共同圍攻一座城市,他們5支軍隊分開駐扎在這個敵城周圍,這5個將軍之間只能通過信使聯系,只有5個將軍一起進攻敵城才會勝利。

于是在他們5個人出發(fā)之前一起商量了進攻的策略,少數服從多數,當超過3個及以上的人都同意進攻,則5個人一起進攻,否則就一起撤退。

但是,如果他們5個人之前出現了一個叛徒,就可能導致最終的行動不一致。如下圖:

將軍1234都按照服從多數人的規(guī)則來執(zhí)行,圖中的將軍01和02跑了,將軍03和04去攻打了,違背了開始他們一起進退的約定。最終導致進攻失敗,打了敗仗。

其中,壞蛋將軍05就可以理解為一個作惡的節(jié)點,他向不同的節(jié)點傳遞不同的消息,讓系統內部的信息出現了不一致。

從這個故事可以看出:幾個相互協同的人,如果其中有個人作惡的話,可能不同的成員得出的最終結論不一致,從而破壞了系統的一致性。這就是拜占庭將軍問題,這個問題一直是協同合作中難以解決的問題。

二、現代版拜占庭將軍

大家都知道了區(qū)塊鏈是一套去中心化的分布式系統,既然是分布式系統就意味著要全網多臺服務器節(jié)點進行協同合作。

那拜占庭將軍問題就出來了:每個網絡節(jié)點相當于一個拜占庭將軍,這些節(jié)點最終要共同維護一套數據,這個過程中可能出現兩個問題。

1.無法保證節(jié)點誠實

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

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

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

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

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

三、神奇的比特幣網絡

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

先簡單理解一下工作量證明機制是什么(我會在后面一期中進行更詳細講解):工作量,顧名思義就是要干活,在比特幣網絡中要做的就是全網節(jié)點要共同算一道數學題,誰先算對,誰就能獲得發(fā)出一條消息的權利,并且系統還會給算對的節(jié)點額外的獎勵;然后全網節(jié)點在這條信息之后開始計算新的數學題。

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

通過工作量證明機制,每個節(jié)點不再能隨便發(fā)送信息了,只有正確算出那道數學題才能發(fā)送一條消息。

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

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

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

(1)最長鏈是什么?

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

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

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

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

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

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

(2)6次確認是什么

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

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

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

四、總結

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

為了解決比特幣網絡存在的能源浪費,促使人們去探索更多辦法去解決拜占庭將軍問題,這就出現了后來的權益證明(POS)、股權委托證明(DPOS)等等。這些機制我將會在后面的期刊中進行詳細的介紹。

版權聲明:

數字簽名:Press.one

 

作者:liheng,區(qū)塊鏈探索者、互聯網產品經理,超級個體修煉中,只創(chuàng)作對用戶有價值的內容。

本文由 @liheng 原創(chuàng)發(fā)布于人人都是產品經理。未經許可,禁止轉載

題圖來自作者

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 提出一個疑惑!如果這樣的話那么A能不能夠在最長鏈上豈不是取決于他廣播的節(jié)點C接到消息的間隔以及C的計算能力了?這樣不公平啊

    來自吉林 回復
  2. 終于有一篇通俗易懂的講清楚區(qū)塊鏈原理的文章了 ??

    來自廣東 回復
  3. 牛皮

    來自重慶 回復
  4. 學習了,可以轉發(fā)朋友圈嗎

    回復
    1. 可以的,注明出處就行

      來自浙江 回復
    2. 好的,謝謝

      來自北京 回復
  5. 深圳

    回復