共識(shí)算法的目的,就是讓所有節(jié)點(diǎn)對(duì)于新增區(qū)塊達(dá)成共識(shí),也就是說,所有人都要認(rèn)可新增的區(qū)塊。對(duì)于有中心的系統(tǒng),這事很簡(jiǎn)單,中心說什么大家同意就好了,但是放到去中心化系統(tǒng)里,尤其是當(dāng)有些節(jié)點(diǎn)有惡意的時(shí)候,這東西非常復(fù)雜,計(jì)算機(jī)科學(xué)里有個(gè)相應(yīng)的問題,叫做“拜占庭將軍問題”或者“拜占庭容錯(cuò)”(BFT)。
有很多用Lamport給出的那個(gè)例子來講BFT的東西,我在這里換一個(gè)角度。
Lamport大神當(dāng)年提出這個(gè)問題的時(shí)候在斯坦福研究中心給NASA做項(xiàng)目,他提出這個(gè)問題的原因并不是考慮類似比特幣的應(yīng)用場(chǎng)景(整個(gè)互聯(lián)網(wǎng)成千上萬個(gè)用戶),而是考慮特殊背景下的一個(gè)簡(jiǎn)單的系統(tǒng)——
航天飛機(jī)的控制系統(tǒng)。
如果有航空背景的同學(xué)可能知道,飛機(jī)有三套獨(dú)立的控制系統(tǒng),為什么呢?因?yàn)槿魏蜗到y(tǒng)都不可能完全不出故障,就算飛機(jī)控制系統(tǒng)的故障率已經(jīng)極低了,還是有飛到一半這東西壞了的可能。于是我們可以弄兩套獨(dú)立的系統(tǒng),同時(shí)壞掉的幾率就會(huì)大大降低。
可是兩套獨(dú)立的系統(tǒng)還是不足以容下一個(gè)系統(tǒng)的錯(cuò)誤——一架飛機(jī)迎面飛來,兩套系統(tǒng)一個(gè)說要躲,一個(gè)說不躲,那到底是躲還是不躲呢?所以我們需要三臺(tái)獨(dú)立的系統(tǒng),這樣,如果有一個(gè)系統(tǒng)有故障了,還有兩臺(tái)能正常工作,能少數(shù)服從多數(shù)給出正確的結(jié)果。學(xué)過糾錯(cuò)碼的同學(xué)對(duì)這個(gè)應(yīng)該不陌生,這個(gè)系統(tǒng)的輸出之間的漢明間距是3,所以可以糾正一位的錯(cuò)誤。
然而,對(duì)于航天飛機(jī),在冷戰(zhàn)的背景下,萬一某個(gè)系統(tǒng)不是壞掉了,而是被敵人控制了呢?三套系統(tǒng)還夠嗎?
答案是否定的,因?yàn)椴煌趩渭冎皇菈牡舻墓?jié)點(diǎn),惡意節(jié)點(diǎn)可以做一些別的事來阻止整個(gè)系統(tǒng)達(dá)成共識(shí)。
這個(gè)部分略復(fù)雜要講的話要單開一帖,所以我們只說最簡(jiǎn)單的情況(無簽名同步系統(tǒng))。
我們管三個(gè)系統(tǒng)叫ABC,正常工作流程是三個(gè)人每次得出結(jié)果就互相告訴一下,然后每個(gè)人選多數(shù)人同意的結(jié)果。這是個(gè)沒有中央節(jié)點(diǎn)的分布式系統(tǒng),也就是說三人不能聚在一起開個(gè)會(huì)啥的,仨人只能兩兩通信。這個(gè)時(shí)候,假設(shè)C有惡意,它的目標(biāo)是破壞這個(gè)系統(tǒng)。于是,假設(shè)正確的讀數(shù)是1,A和B都得出了1這個(gè)結(jié)果,這個(gè)時(shí)候C這個(gè)小婊砸告訴A說“我的結(jié)果是0,B也覺得是0”,同時(shí)打個(gè)電話跟B說“哎我覺得是0,A也這么說”,于是A和B就懵逼了。假設(shè)你是A,你聽到了兩個(gè)不同版本的B的答案,B說自己選了1,C說B選了0,可是A這個(gè)時(shí)候沒法知道B和C誰才是那個(gè)騙了自己的小婊砸,因?yàn)槿绻鸅真的告訴A選了1然后告訴C是0,他聽到的結(jié)果和現(xiàn)在是一模一樣的。
于是結(jié)論是,拜占庭容錯(cuò),也就是需要容下一個(gè)惡意系統(tǒng)而非錯(cuò)誤系統(tǒng),需要4個(gè)獨(dú)立系統(tǒng)。
(當(dāng)然,簽名可以解決這個(gè)問題,但是這只是同步系統(tǒng)的情況,在異步系統(tǒng)里這問題會(huì)變得更加復(fù)雜,原因是正常節(jié)點(diǎn)的回答有延遲,而惡意節(jié)點(diǎn)可以不回復(fù),所以,正常節(jié)點(diǎn)一方面要等另一個(gè)節(jié)點(diǎn)的回復(fù),但是它又不知道對(duì)方會(huì)不會(huì)回復(fù)因?yàn)閷?duì)方有可能會(huì)有惡意,而在收到回復(fù)之前,它完全沒法判斷對(duì)方是正常節(jié)點(diǎn)還是惡意節(jié)點(diǎn),這個(gè)問題叫異步BFT,也是BFT的最復(fù)雜的情況,這里不再做更多的解釋,下文提到的BFT算法,其實(shí)都是異步BFT的算法)
Lamport提出這個(gè)問題之后,有無數(shù)的算法被提出來,統(tǒng)稱BFT(拜占庭容錯(cuò))算法,其中最有代表性的叫PBFT,然后由于最近區(qū)塊鏈的熱度,無數(shù)針對(duì)區(qū)塊鏈應(yīng)用場(chǎng)景優(yōu)化過的BFT算法也涌現(xiàn)出來,但是一個(gè)重要的問題是,所有目前的BFT算法,都只能應(yīng)用在小型網(wǎng)絡(luò)里。原因很簡(jiǎn)單——因?yàn)锽FT這個(gè)問題是設(shè)計(jì)給類似于航天飛機(jī)控制系統(tǒng)這樣的場(chǎng)景的,早期的算法考慮的也主要是這種場(chǎng)景。PBFT論文里考慮的就是一個(gè)5個(gè)節(jié)點(diǎn)的系統(tǒng)。就算算上新提出的BFT算法,也最多應(yīng)用在不超過100個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)里。
這個(gè)問題被擱置了很久,直到比特幣的誕生——中本聰從某種意義上簡(jiǎn)化了這個(gè)問題,在比特幣中,同樣是共識(shí)問題,中本聰引入了一個(gè)重要的假設(shè)——獎(jiǎng)勵(lì),他之所以能這樣做的原因是,他考慮的是一個(gè)數(shù)字貨幣,也就是說共識(shí)這個(gè)東西是有價(jià)值的。
于是在這樣的系統(tǒng)上,他提出了工作證明機(jī)制。
所有挖礦,礦工,最長(zhǎng)鏈,分叉等等等等,都可以歸結(jié)為一句話:
說話是要有代價(jià)的,說真話是有好處的,說假話是要扣錢的……
這就是目前兩類共識(shí)算法的核心區(qū)別:
BFT共識(shí)模型:惡意節(jié)點(diǎn)可以干任何事。
比特幣共識(shí)模型:模型中有公認(rèn)的“價(jià)值”,每個(gè)節(jié)點(diǎn)說話都需要一定代價(jià),誠實(shí)節(jié)點(diǎn)會(huì)受到獎(jiǎng)勵(lì),而惡意節(jié)點(diǎn)由于只付出代價(jià)而收不到獎(jiǎng)勵(lì),變相受到了懲罰。
也就是說,BFT共識(shí)模型其實(shí)涵蓋了比特幣共識(shí)模型的場(chǎng)景,比特幣共識(shí)其實(shí)放寬了BFT共識(shí)模型的限制。
比特幣共識(shí)對(duì)于BFT的優(yōu)勢(shì)在于,由于給惡意節(jié)點(diǎn)的能力做了限制,惡意節(jié)點(diǎn)所能造成的破壞大大降低了,尤其是對(duì)于異步系統(tǒng)——BFT共識(shí)里惡意節(jié)點(diǎn)可以一直拒絕相應(yīng)而誠實(shí)節(jié)點(diǎn)還需要一直等它(因?yàn)椴恢浪遣皇菒阂獾?,而對(duì)于比特幣共識(shí),隨你便,你不響應(yīng)就沒有獎(jiǎng)勵(lì)可拿。于是,比特幣共識(shí)算法可以應(yīng)用于成千上萬個(gè)節(jié)點(diǎn),而且,任何人隨時(shí)都可以加入,不需要預(yù)先在網(wǎng)絡(luò)里注冊(cè)自己的身份(而BFT算法里,網(wǎng)絡(luò)中節(jié)點(diǎn)的數(shù)量和身份都必須是已知的)。
但比特幣共識(shí)的缺陷在于,首先,得有個(gè)有價(jià)值的東西,也就是說放在比特幣里這東西還行,以太坊的話現(xiàn)在可能也湊合,但是其他數(shù)字貨幣嘛……BFT共識(shí)有個(gè)嚴(yán)格的限定,就是惡意節(jié)點(diǎn)不能超過總數(shù)的1/3,然而其實(shí)比特幣共識(shí)沒有這樣的限制,唯一的限制就是假定大部分節(jié)點(diǎn)都是理性的,是逐利的,也就是會(huì)采用最佳的策略來賺取最大的價(jià)值。所以,嚴(yán)格來說,自私挖礦這種行為在比特幣共識(shí)里是允許的,而多數(shù)攻擊,其實(shí)也算不上一種攻擊,因?yàn)檫@些都沒有突破比特幣共識(shí)的框架——如果這個(gè)價(jià)值無限大,比特幣共識(shí)是非??煽康?。然而這并不是事實(shí),因?yàn)椴⒉皇敲總€(gè)虛擬貨幣都和比特幣一樣值錢,而在價(jià)值不高的情況下,比特幣共識(shí)的前提就站不住腳了——當(dāng)損失可能是幾千上萬塊錢的時(shí)候,假定每個(gè)人都是理性的是合理,但是如果損失就幾分錢這個(gè)假設(shè)就相當(dāng)扯淡了,事實(shí)上也發(fā)生過一個(gè)比特幣礦池跑到另一個(gè)貨幣惡意挖礦搞垮對(duì)手的情況。
此外,比特幣共識(shí)是最長(zhǎng)鏈共識(shí),也就是說最長(zhǎng)鏈-->大多數(shù)-->理性,于是分叉是允許的。于是導(dǎo)致了一些附帶的問題,例如,如果網(wǎng)絡(luò)有延遲,你怎么知道你手里那條鏈?zhǔn)钦麄€(gè)網(wǎng)絡(luò)里當(dāng)前的最長(zhǎng)鏈呢?于是,如果需要傳輸?shù)臄?shù)據(jù)多,那么延遲加大。延遲加大,那么越多的人手里的鏈并不是全網(wǎng)絡(luò)的最長(zhǎng)鏈。于是,全網(wǎng)絡(luò)的最長(zhǎng)鏈,就沒法代表大多數(shù)。這就打破了比特幣共識(shí)的根本,這也是為什么比特幣區(qū)塊頻率是10分鐘一塊的原因。比特幣目前有個(gè)著名的7幣交易每秒的上限,而現(xiàn)在擴(kuò)容鬧得很厲害,以太坊的交易格式不同,也用了新的工作證明,想要改成權(quán)益證明,但這些都不本質(zhì)。真正本質(zhì)的是,在目前的網(wǎng)絡(luò)條件下,如果適用全網(wǎng)的話,比特幣共識(shí)的交易量基本上超不過100筆交易每秒這個(gè)量級(jí)。
上面這幾段有可能太深了,簡(jiǎn)單來說,BFT共識(shí)和比特幣共識(shí)的區(qū)別可以這么理解:
BFT共識(shí):來,大家開個(gè)會(huì)討論一下集思廣益啊,討論出大家都滿意的結(jié)果為止。
問題:開會(huì)的效率大家都懂,人越多越不容易出結(jié)果。只能用于少數(shù)節(jié)點(diǎn),用于上千個(gè)節(jié)點(diǎn)的話……大家想象一下一天開一次人大的場(chǎng)景。
比特幣共識(shí):你的詩念得不錯(cuò),組織已經(jīng)決定了,今天就你來當(dāng)領(lǐng)導(dǎo)了,做得好有獎(jiǎng),做不好扣錢。
問題:獎(jiǎng)勵(lì)幾千塊錢還好,獎(jiǎng)勵(lì)幾分錢誰好好干?
而區(qū)塊鏈也就因此被分成了涇渭分明的兩類,很多人都聽過什么公有鏈私有鏈聯(lián)盟鏈,但是,如果你們以為這是根據(jù)應(yīng)用區(qū)分的就大錯(cuò)特錯(cuò),其實(shí),這兩種區(qū)塊鏈最本質(zhì)的區(qū)別,還是因?yàn)楣沧R(shí)模型或者說算法不同——BFT算法沒法應(yīng)用于大量節(jié)點(diǎn),所以用BFT算法的就沒法做公有鏈。而比特幣共識(shí)得有個(gè)價(jià)值體系,這東西去做私有鏈聯(lián)盟鏈就很不靠譜,因?yàn)橐粋€(gè)單純逐利的人的假設(shè)還算靠譜,但是如果對(duì)象是公司的話,公司的利益就太復(fù)雜了,不能簡(jiǎn)單認(rèn)為他們只追逐區(qū)塊鏈上那點(diǎn)價(jià)值。
1,公有鏈,以比特幣,以太坊和所有虛擬貨幣為代表,都采用比特幣共識(shí),共識(shí)算法基本上都采用工作證明機(jī)制,也就是挖礦那些,這種機(jī)制其他回答里已經(jīng)講得夠清楚了,就略過。工作證明一切都好,除了費(fèi)電……費(fèi)多少電呢?比特幣的話,差不多和一個(gè)百萬人級(jí)別的城市那么多。此外以太坊的創(chuàng)始人特別喜歡權(quán)益證明,似乎很快要小范圍投入使用(100個(gè)區(qū)塊里一個(gè)用權(quán)益證明)。但是目前為止,大家對(duì)這東西的可靠性還持觀望態(tài)度。
2,私有鏈和聯(lián)盟鏈。以IBM的hyperledger-fabric,以及一大堆其他的類似于tendermint,甚至R3 corda和ripple為代表,都用BFT共識(shí)。其實(shí)這方面的應(yīng)用已經(jīng)很多了,問題是,1,目前基本上所有應(yīng)用給人的感覺都還是為了做區(qū)塊鏈而區(qū)塊鏈,真的覺得這東西好到不可或缺的應(yīng)用還基本沒有。2,由于為了區(qū)塊鏈而區(qū)塊鏈,其實(shí)很多場(chǎng)景的安全性和可靠性還值得懷疑,這點(diǎn)經(jīng)常被被公有鏈的支持者詬病。
新聞熱點(diǎn)
疑難解答
圖片精選