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

7 評(píng)論 12270 瀏覽 33 收藏 9 分鐘

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

一、先講個(gè)故事

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

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

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

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

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

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

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

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

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

1.無法保證節(jié)點(diǎn)誠實(shí)

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

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

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

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

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

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

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

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

1.如何解決的單點(diǎn)一致性問題

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

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

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

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

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

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

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

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

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

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

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

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

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

通過6確認(rèn)可以大大提高系統(tǒng)的不可篡改性,因?yàn)槿绻敫囊粭l已經(jīng)確認(rèn)的消息,需要正確算出6個(gè)數(shù)學(xué)難題,然后還需要保證自己的更改之后的消息鏈條為最長(zhǎng)鏈。

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

四、總結(jié)

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

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

版權(quán)聲明:

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

 

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

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

題圖來自作者

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

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

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

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

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

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

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

    回復(fù)