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