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

在前面兩期中,主要對區(qū)塊鏈的基本概念和基本設計原則進行說明,現(xiàn)在有了這些背景知識后,再去學習更深層的知識將會更加容易。本期我們一起研究一下拜占庭將軍問題,這是區(qū)塊鏈解決的一個核心難題,通過理解這個問題的來龍去脈,相信大家會對區(qū)塊鏈的底層知識會有一個更深入的思考。
一、先講個故事
從前有個帝國叫做拜占庭,這個國家派出5位將軍去共同圍攻一座城市,他們5支軍隊分開駐扎在這個敵城周圍,這5個將軍之間只能通過信使聯(lián)系,只有5個將軍一起進攻敵城才會勝利。
于是在他們5個人出發(fā)之前一起商量了進攻的策略,少數(shù)服從多數(shù),當超過3個及以上的人都同意進攻,則5個人一起進攻,否則就一起撤退。
但是,如果他們5個人之前出現(xiàn)了一個叛徒,就可能導致最終的行動不一致。如下圖:
將軍1234都按照服從多數(shù)人的規(guī)則來執(zhí)行,圖中的將軍01和02跑了,將軍03和04去攻打了,違背了開始他們一起進退的約定。最終導致進攻失敗,打了敗仗。
其中,壞蛋將軍05就可以理解為一個作惡的節(jié)點,他向不同的節(jié)點傳遞不同的消息,讓系統(tǒng)內(nèi)部的信息出現(xiàn)了不一致。
從這個故事可以看出:幾個相互協(xié)同的人,如果其中有個人作惡的話,可能不同的成員得出的最終結(jié)論不一致,從而破壞了系統(tǒng)的一致性。這就是拜占庭將軍問題,這個問題一直是協(xié)同合作中難以解決的問題。
二、現(xiàn)代版拜占庭將軍
大家都知道了區(qū)塊鏈是一套去中心化的分布式系統(tǒng),既然是分布式系統(tǒng)就意味著要全網(wǎng)多臺服務器節(jié)點進行協(xié)同合作。
那拜占庭將軍問題就出來了:每個網(wǎng)絡節(jié)點相當于一個拜占庭將軍,這些節(jié)點最終要共同維護一套數(shù)據(jù),這個過程中可能出現(xiàn)兩個問題。
1.無法保證節(jié)點誠實
一個節(jié)點可能同時向不同的服務器發(fā)送不一致的消息,導致節(jié)點之間存儲的信息不一致。這個可以把它理解為單點一致性問題。
2.無法保證系統(tǒng)內(nèi)部信息統(tǒng)一
分布式系統(tǒng)中存在一部分節(jié)點收到的信息和另一部分節(jié)點的收到的信息是不同的,那最終所有的節(jié)點應該以哪一條信息為標準呢?
假設分布式網(wǎng)絡遵從少數(shù)服從多數(shù)的情況,那如果全網(wǎng)超過一半的節(jié)點同時作惡,去篡改了已經(jīng)存在的某條信息,那系統(tǒng)也只能接受這條不正確信息,導致系統(tǒng)的前后不一致。
這兩種問題可以統(tǒng)稱為系統(tǒng)一致性問題。
三、神奇的比特幣網(wǎng)絡
中本聰大神為了解決分布式系統(tǒng)中的拜占庭將軍問題,開創(chuàng)性的提出了工作量證明機制(POW),一舉解決了單點一致性和系統(tǒng)一致性問題。
先簡單理解一下工作量證明機制是什么(我會在后面一期中進行更詳細講解):工作量,顧名思義就是要干活,在比特幣網(wǎng)絡中要做的就是全網(wǎng)節(jié)點要共同算一道數(shù)學題,誰先算對,誰就能獲得發(fā)出一條消息的權(quán)利,并且系統(tǒng)還會給算對的節(jié)點額外的獎勵;然后全網(wǎng)節(jié)點在這條信息之后開始計算新的數(shù)學題。
1.如何解決的單點一致性問題
通過工作量證明機制,每個節(jié)點不再能隨便發(fā)送信息了,只有正確算出那道數(shù)學題才能發(fā)送一條消息。
這就降低了節(jié)點發(fā)送消息的速率,保證一段時間內(nèi),大部分節(jié)點收到的是一條一樣的消息。
2.如何解決系統(tǒng)一致性問題
為了解決系統(tǒng)的一致性問題,比特幣網(wǎng)絡提出了最長鏈概念和6次確認概念。
(1)最長鏈是什么?
可以理解為:節(jié)點發(fā)送一個消息就是一個區(qū)塊,一個節(jié)點接收上個節(jié)點發(fā)出的消息之后,在這個消息的基礎之上開始進行新的數(shù)學題計算來獲取發(fā)送消息的權(quán)利,并產(chǎn)生新的消息區(qū)塊,這些區(qū)塊組成一條首尾相連的鏈條。
在系統(tǒng)內(nèi)信息傳輸?shù)倪^程中,難免會出現(xiàn)節(jié)點A和節(jié)點B幾乎同時算出數(shù)學題的情況,這個時候它們向外發(fā)送消息,可能離節(jié)點A近的節(jié)點先聽到A的消息,離節(jié)點B近的節(jié)點先聽到B的消息。
節(jié)點都以最先收到的消息為準,分別開始在其后進行數(shù)學題計算。
出現(xiàn)這種情況,在系統(tǒng)內(nèi)就會出現(xiàn)兩條消息鏈條,出現(xiàn)了系統(tǒng)不一致性,如何解決呢?這里就采取了最長鏈為標準。
全網(wǎng)節(jié)點約定:只在消息最多的那條數(shù)據(jù)鏈條之后進行數(shù)學計算和消息連接,節(jié)點時刻監(jiān)聽全網(wǎng)狀態(tài),確定自己是不是在最長鏈條上;如果不是,則立即切換到最長鏈去進行數(shù)學題計算。這就保證了系統(tǒng)內(nèi)只有一套合法的消息鏈條。
C在收到A的消息之后優(yōu)先算出了數(shù)學題,那這個時候A和C所在的就是最長鏈,B所在的鏈條將會被舍棄,然后F,G,H節(jié)點會開始在C之后進行數(shù)學題計算。
(2)6次確認是什么
為了防止在比特幣網(wǎng)絡中出現(xiàn)信息篡改情況的發(fā)生,需要每條消息經(jīng)過6次確認沒有更改之后才認為有效。
通過6確認可以大大提高系統(tǒng)的不可篡改性,因為如果想更改一條已經(jīng)確認的消息,需要正確算出6個數(shù)學難題,然后還需要保證自己的更改之后的消息鏈條為最長鏈。
這會消耗大量的成本,導致篡改數(shù)據(jù)的成本高到無法承受,最大程度的保證了系統(tǒng)不會出現(xiàn)確認過的消息前后不一致的問題。
四、總結(jié)
比特幣雖然通過采用工作量證明的機制解決了拜占庭問題,但是也造成了一些新的問題:因為在比特幣網(wǎng)絡中節(jié)點需要通過計算數(shù)學題的方式來獲取發(fā)消息的權(quán)利,這就需要CPU之間競爭誰的計算力強,會造成巨大的能源浪費——這也是比特幣網(wǎng)絡經(jīng)常被人詬病的一個原因。
為了解決比特幣網(wǎng)絡存在的能源浪費,促使人們?nèi)ヌ剿鞲噢k法去解決拜占庭將軍問題,這就出現(xiàn)了后來的權(quán)益證明(POS)、股權(quán)委托證明(DPOS)等等。這些機制我將會在后面的期刊中進行詳細的介紹。
版權(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)載
題圖來自作者
提出一個疑惑!如果這樣的話那么A能不能夠在最長鏈上豈不是取決于他廣播的節(jié)點C接到消息的間隔以及C的計算能力了?這樣不公平啊
終于有一篇通俗易懂的講清楚區(qū)塊鏈原理的文章了 ??
牛皮
學習了,可以轉(zhuǎn)發(fā)朋友圈嗎
可以的,注明出處就行
好的,謝謝
深圳