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

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

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

一、先講個故事

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

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

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

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

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

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

二、現(xiàn)代版拜占庭將軍

大家都知道了區(qū)塊鏈?zhǔn)且惶兹ブ行幕姆植际较到y(tǒng),既然是分布式系統(tǒng)就意味著要全網(wǎng)多臺服務(wù)器節(jié)點進(jìn)行協(xié)同合作。

那拜占庭將軍問題就出來了:每個網(wǎng)絡(luò)節(jié)點相當(dāng)于一個拜占庭將軍,這些節(jié)點最終要共同維護(hù)一套數(shù)據(jù),這個過程中可能出現(xiàn)兩個問題。

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

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

2.無法保證系統(tǒng)內(nèi)部信息統(tǒng)一

分布式系統(tǒng)中存在一部分節(jié)點收到的信息和另一部分節(jié)點的收到的信息是不同的,那最終所有的節(jié)點應(yīng)該以哪一條信息為標(biāo)準(zhǔn)呢?

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

這兩種問題可以統(tǒng)稱為系統(tǒng)一致性問題。

三、神奇的比特幣網(wǎng)絡(luò)

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

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

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

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

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

2.如何解決系統(tǒng)一致性問題

為了解決系統(tǒng)的一致性問題,比特幣網(wǎng)絡(luò)提出了最長鏈概念和6次確認(rèn)概念。

(1)最長鏈?zhǔn)鞘裁矗?/strong>

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

在系統(tǒng)內(nèi)信息傳輸?shù)倪^程中,難免會出現(xiàn)節(jié)點A和節(jié)點B幾乎同時算出數(shù)學(xué)題的情況,這個時候它們向外發(fā)送消息,可能離節(jié)點A近的節(jié)點先聽到A的消息,離節(jié)點B近的節(jié)點先聽到B的消息。

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

出現(xiàn)這種情況,在系統(tǒng)內(nèi)就會出現(xiàn)兩條消息鏈條,出現(xiàn)了系統(tǒng)不一致性,如何解決呢?這里就采取了最長鏈為標(biāo)準(zhǔn)。

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

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

(2)6次確認(rèn)是什么

為了防止在比特幣網(wǎng)絡(luò)中出現(xiàn)信息篡改情況的發(fā)生,需要每條消息經(jīng)過6次確認(rèn)沒有更改之后才認(rèn)為有效。

通過6確認(rèn)可以大大提高系統(tǒng)的不可篡改性,因為如果想更改一條已經(jīng)確認(rèn)的消息,需要正確算出6個數(shù)學(xué)難題,然后還需要保證自己的更改之后的消息鏈條為最長鏈。

這會消耗大量的成本,導(dǎo)致篡改數(shù)據(jù)的成本高到無法承受,最大程度的保證了系統(tǒng)不會出現(xiàn)確認(rèn)過的消息前后不一致的問題。

四、總結(jié)

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

為了解決比特幣網(wǎng)絡(luò)存在的能源浪費,促使人們?nèi)ヌ剿鞲噢k法去解決拜占庭將軍問題,這就出現(xiàn)了后來的權(quán)益證明(POS)、股權(quán)委托證明(DPOS)等等。這些機(jī)制我將會在后面的期刊中進(jìn)行詳細(xì)的介紹。

版權(quán)聲明:

數(shù)字簽名:Press.one

 

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

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

題圖來自作者

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

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

    來自廣東 回復(fù)
  3. 牛皮

    來自重慶 回復(fù)
  4. 學(xué)習(xí)了,可以轉(zhuǎn)發(fā)朋友圈嗎

    回復(fù)
    1. 可以的,注明出處就行

      來自浙江 回復(fù)
    2. 好的,謝謝

      來自北京 回復(fù)
  5. 深圳

    回復(fù)