分佈式技術原理(四):分佈式共識

目錄

分佈式共識:存異求同

PoW

PoS

DPoS


 

分佈式共識:存異求同

其實,這個選主過程就是一個分佈式共識問題,因爲每個節點在選出主節點之前都可以認爲自己會成爲主節點,也就是說集羣節點“存異”;而通過選舉的過程選出主節點,讓所有的節點都認可該主節點,這叫“求同”。由此可見,分佈式共識的本質就是“存異求同”。

所以,從本質上看分佈式選舉問題其實就是傳統的分佈式共識方法,主要是基於多數投票策略實現的。基於多數投票策略的分佈式選舉方法,如果用於分佈式在線記賬一致性問題中,那麼記賬權通常會完全掌握到主節點的手裏,這使得主節點非常容易造假,且存在性能瓶頸。因此,分佈式選舉不適用於分佈式在線記賬的一致性問題。在今天這篇文章中,我就帶你瞭解另外一種用於解決分佈式在線記賬一致性問題的分佈式共識技術。

這裏所說的分佈式在線記賬,是指在沒有集中的發行方,也就是沒有銀行參與的情況下,任意一臺接入互聯網的電腦都能參與買賣,所有看到該交易的服務器都可以記錄這筆交易,並且記錄信息最終都是一致的,以保證交易的準確性。而如何保證交易的一致性,就是該場景下的分佈式共識問題。接下來,我們就一起學習下分佈式共識技術吧。

假設,現在有 5 臺服務器,分散在美國華盛頓、英國倫敦、法國巴黎、中國北京、中國上海,分別對應着用戶{A,B,C,D,E}。現在,用戶 A 給用戶 B 轉了 100 元。

在傳統方法中,我們通過銀行進行轉賬並記錄該筆交易。但分佈式在線記賬方法中,沒有銀行這樣的一個集中方,而是由上述 5 臺服務器來記錄該筆交易。但是,這 5 臺服務器均是有各自想法的個體,都可以自主操作或記錄,那麼如何保證記錄的交易是一致的呢?這,就是分佈式共識技術要解決的問題。

可以看出,分佈式共識就是在多個節點均可獨自操作或記錄的情況下,使得所有節點針對某個狀態達成一致的過程。通過共識機制,我們可以使得分佈式系統中的多個節點的數據達成一致。

看到這裏,相信你已經看出來了,我在這裏說的分佈式在線記賬,就是近幾年比較火的區塊鏈技術解決的問題。而分佈式共識技術,就是區塊鏈技術共識機制的核心。

接下來,請和我一起看看分佈式共識是如何實現的,有哪些方法吧。爲了不影響你理解分佈式共識的核心技術,我會先和你分享區塊鏈中的一個核心概念:挖礦。

在傳統的交易方式中,用戶 A 給用戶 B 轉賬,需要銀行來實行具體的轉賬操作並記錄交易,銀行會從中收取相應的手續費。而採用分佈式在線記賬的話,參與記錄這筆交易的服務器,也可以從中獲得一些獎勵(這些獎勵,在區塊鏈技術中可以換成錢)。所有服務器幫助記錄交易並達成一致的過程,就是區塊鏈中的“挖礦”。

區塊鏈是由包含交易信息的區塊從後向前有序鏈接起來的數據結構,其中區塊是指很多交易數據的集合,每個區塊包括區塊頭和區塊體,區塊頭包括前一區塊的哈希值、本區塊的哈希值和時間戳;區塊體用來存儲交易數據。如果你對區塊鏈技術的其他概念感興趣的話,可以自行查閱更多資料。

接下來,我將與你介紹 3 種主流的解決分佈式在線記賬一致性問題的共識技術,即:PoW(Proof-of-Work,工作量證明)、PoS(Proof-of-Stake,權益證明)和 DPoS(Delegated Proof of Stake,委託權益證明)。

PoW

從分佈式選舉問題可以看出,同一輪選舉中有且僅有一個節點成爲主節點。同理,在分佈式在線記賬問題中,針對同一筆交易,有且僅有一個節點或服務器可以獲得記賬權,然後其他節點或服務器同意該節點或服務器的記賬結果,達成一致。也就是說,分佈式共識包括兩個關鍵點,獲得記賬權和所有節點或服務器達成一致。

PoW 算法,是以每個節點或服務器的計算能力(即“算力”)來競爭記賬權的機制,因此是一種使用工作量證明機制的共識算法。也就是說,誰的計算力強、工作能力強,誰獲得記賬權的可能性就越大。那麼,如何體現節點的“算力”呢?答案就是,每個節點都去解一道題,誰能先解決誰的能力就強。

假設每個節點會劃分多個區塊用於記錄用戶交易,PoW 算法獲取記賬權的原理是:利用區塊的 index、前一個區塊的哈希值、交易的時間戳、區塊數據和 nonce 值,通過 SHA256 哈希算法計算出一個哈希值,並判斷前 k 個值是否都爲 0。如果不是,則遞增 nonce 值,重新按照上述方法計算;如果是,則本次計算的哈希值爲要解決的題目的正確答案。誰最先計算出正確答案,誰就獲得這個區塊的記賬權。

請注意:nonce 值是用來找到一個滿足哈希值的數字;k 爲哈希值前導零的個數,標記了計算的難度,0 越多計算難度越大。達成共識的過程,就是獲得記賬權的節點將該區塊信息廣播給其他節點,其他節點判斷該節點找到的區塊中的所有交易都是有效且之前未存在過的,則認爲該區塊有效,並接受該區塊,達成一致。

接下來,我以上文提到的分散在世界各地的 5 臺服務器爲例,和你說明基於 PoW 的共識記賬過程。

假設客戶端 A 產生一個新的交易,基於 PoW 的共識記賬過程爲:

 客戶端 A 產生新的交易,向全網進行廣播,要求對交易進行記賬。

 每個記賬節點接收到這個請求後,將收到的交易信息放入一個區塊中。

 每個節點通過 PoW 算法,計算本節點的區塊的哈希值,嘗試找到一個具有足夠工作量難度的工作量證明。

https://static001.geekbang.org/resource/image/77/05/77a1cbcd3830acf730f3a0a820710205.png

 若節點 D 找到了一個工作量證明向全網廣播。當然,當且僅當包含在該區塊中的交易都是有效且之前未存在過的,其他節點纔會認同該區塊的有效性。

 其他節點接收到廣播信息後,若該區塊有效,接受該區塊,並跟隨在該區塊的末尾,製造新區塊延長該鏈條,將被接受的區塊的隨機哈希值視爲新區塊的隨機哈希值。可以看出,PoW 算法中,誰的計算能力強,獲得記賬權的可能性就越大。但必須保證其記賬的區塊是有效的,並在之前未存在過,才能獲得其他節點的認可。

目前,比特幣平臺採用了 PoW 算法,屬於區塊鏈 1.0 階段,其重心在於貨幣,比特幣大約 10min 纔會產生一個區塊,區塊的大小也只有 1MB,僅能夠包含 3000~4000 筆交易,平均每秒只能夠處理 5~7(個位數)筆交易。

PoW 通過“挖礦”的方式發行新幣,把比特幣分散給個人,實現了相對的公平。PoW 的容錯機制,允許全網 50% 的節點出錯,因此,如果要破壞系統,則需要投入極大成本(若你有全球 51% 的算力,則可嘗試攻擊比特幣)。

但PoW 機制每次達成共識需要全網共同參與運算,增加了每個節點的計算量,並且如果題目過難,會導致計算時間長、資源消耗多;而如果題目過於簡單,會導致大量節點同時獲得記賬權,衝突多。這些問題,都會增加達成共識的時間。所以,PoW 機制的缺點也很明顯,共識達成的週期長、效率低,資源消耗大。

PoS

爲了解決 PoW 算法的問題,引入了 PoS 算法。它的核心原理是,由系統權益代替算力來決定區塊記賬權,擁有的權益越大獲得記賬權的概率就越大。這裏所謂的權益,就是每個節點佔有貨幣的數量和時間,而貨幣就是節點所獲得的獎勵。PoS 算法充分利用了分佈式在線記賬中的獎勵,鼓勵“利滾利”。

在股權證明 PoS 模式下,根據你持有貨幣的數量和時間,給你發利息。每個幣每天產生 1 幣齡,比如你持有 100 個幣,總共持有了 50 天,那麼,你的幣齡就爲 5000。這個時候,如果你發現了一個 PoS 區塊,你的幣齡就會被減少 365。每被減少 365 幣齡,你就可以從區塊中獲得 0.05 個幣的利息 (可理解爲年利率 5%)。

在這個案例中,利息 = (5000*5% )/365 = 0.68 個幣。這下就有意思了,持幣有利息。接下來,我們看一個具體的案例。假設一個公鏈網絡中,共有 3 個節點,A 、B 和 C。其中 A 節點擁有 10000 個幣,總共持有 30 天,而 B 和 C 節點分別有 1000 和 2000 個幣,分別持有 15 和 20 天。

通過 PoS 算法決定區塊記賬權的流程和 PoW 算法類似,唯一不同的就是,每個節點在計算自己記賬權的時候,通過計算自己的股權或權益來評估,如果發現自己權益最大,則將自己的區塊廣播給其他節點,當然必須保證該區塊的有效性。

https://static001.geekbang.org/resource/image/be/db/be44bacadba9a47b8491156e646d59db.png

以太坊平臺屬於區塊鏈 2.0 階段,在區塊鏈 1.0 的基礎上進一步強調了合約,採用了 PoS 算法。12 年發佈的點點幣(PPC),綜合了 PoW 工作量證明及 PoS 權益證明方式,從而在安全和節能方面實現了創新。可以看出,PoS 將算力競爭轉變成權益競爭。與 PoW 相比,PoS 不需要消耗大量的電力就能夠保證區塊鏈網絡的安全性,同時也不需要在每個區塊中創建新的貨幣來激勵記賬者參與當前網絡的運行,這也就在一定程度上縮短了達成共識所需要的時間。所以,基於 PoS 算法的以太坊每秒大概能處理 30 筆左右的交易。

但PoS 算法中持幣越多或持幣越久,幣齡就會越高,持幣人就越容易挖到區塊並得到激勵,而持幣少的人基本沒有機會,這樣整個系統的安全性實際上會被持幣數量較大的一部分人掌握,容易出現壟斷現象。

DPoS

爲了解決 PoS 算法的壟斷問題,2014 年比特股(BitShares)的首席開發者丹尼爾 · 拉里默(Dan Larimer)提出了委託權益證明法,也就是 DPoS 算法。DPoS 算法的原理,類似股份制公司的董事會制度,普通股民雖然擁有股權,但進不了董事會,他們可以投票選舉代表(受託人)代他們做決策。DPoS 是由被社區選舉的可信帳戶(受託人,比如得票數排行前 101 位)來擁有記賬權。

爲了成爲正式受託人,用戶要去社區拉票,獲得足夠多的信任。用戶根據自己持有的貨幣數量佔總量的百分比來投票,好比公司股票機制,假設總的發行股票爲 1000,現在股東 A 持股 10,那麼股東 A 投票權爲 10/1000=1/100。如下圖所示,根據自己擁有的權益,投票選出可代表自己的受託節點,受託節點之間競爭記賬權。

https://static001.geekbang.org/resource/image/dc/6d/dc2fde94ff17bc317fc755c2c7184c6d.png

在 DPos 算法中,通常會選出 k(比如 101) 個受託節點,它們的權利是完全相等的。受託節點之間爭取記賬權也是根據算力進行競爭的。只要受託節點提供的算力不穩定,計算機宕機或者利用手中的權力作惡,隨時可以被握着貨幣的普通節點投票踢出整個系統,而後備的受託節點可以隨時頂上去。

DPoS 在比特股和 Steem 上已運行多年,整個網絡中選舉出的多個節點能夠在 1s 之內對 99.9% 的交易進行確認。此外,DPoS 在 EOS(Enterprise Operation System,爲商用分佈式應用設計的一款區塊鏈操作系統)中也有廣泛應用,被稱爲區塊鏈 3.0 階段。

DPoS 是在 PoW 和 PoS 的基礎上進行改進的,相比於 PoS 算法,DPoS 引入了受託人,優點主要表現在:1.由投票選舉出的若干信譽度更高的受託人記賬,解決了所有節點均參與競爭導致消息量大、達成一致的週期長的問題。也就是說,DPoS 能耗更低,具有更快的交易速度。2.每隔一定週期會調整受託人,避免受託人造假和獨權。但是,在 DPoS 中,由於大多數持幣人通過受託人參與投票,投票的積極性並不高;且一旦出現故障節點,DPoS 無法及時做出應對,導致安全隱患。

三種分佈式共識算法對比分析

https://static001.geekbang.org/resource/image/b2/29/b2a43f0e0239f083a2c89db7bce2f729.jpg

PoW 算法, 以每個節點或服務器的計算能力,即“算力”,來競爭記賬權的機制。類似於按勞分配,誰工作量大,誰拿的多。其實競爭的就是挖礦設備,看誰的挖礦設備的 CPU、GPU 等更厲害,缺點就是費電、污染環境。PoS 算法,由系統權益代替算力來決定區塊記賬權,擁有的權益越大,獲得記賬權的概率就越大。這種方法的優點是節能,不需要挖礦了,但缺點是容易形成壟斷。DPoS 算法,是一種委託權益證明算法。持有幣的人可以通過投票選舉出一些節點,來作爲代表去記賬,類似於全國人民代表大會制度。

https://static001.geekbang.org/resource/image/be/8d/be023c879a365df13578c6979b5d498d.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章