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

在前面兩期中,主要對區(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ā)布于人人都是產品經理。未經許可,禁止轉載
題圖來自作者
提出一個疑惑!如果這樣的話那么A能不能夠在最長鏈上豈不是取決于他廣播的節(jié)點C接到消息的間隔以及C的計算能力了?這樣不公平啊
終于有一篇通俗易懂的講清楚區(qū)塊鏈原理的文章了 ??
牛皮
學習了,可以轉發(fā)朋友圈嗎
可以的,注明出處就行
好的,謝謝
深圳