?文章來源地址http://www.zghlxwxcb.cn/news/detail-839219.html
?
?蘇澤
大家好 這里是蘇澤 一個(gè)鐘愛區(qū)塊鏈技術(shù)的后端開發(fā)者
本篇專欄?←持續(xù)記錄本人自學(xué)兩年走過無數(shù)彎路的智能合約學(xué)習(xí)筆記和經(jīng)驗(yàn)總結(jié) 如果喜歡拜托三連支持~
專欄的前面幾篇詳細(xì)了介紹了區(qū)塊鏈的核心基礎(chǔ)知識 有興趣學(xué)習(xí)的小伙伴可以看看→ 關(guān)于區(qū)塊鏈的基本組成、加密原理都用最通俗易懂的方式講解了 希望能夠幫助大家學(xué)習(xí)
以下是正文
目錄
專欄的前面幾篇詳細(xì)了介紹了區(qū)塊鏈的核心基礎(chǔ)知識 有興趣學(xué)習(xí)的小伙伴可以看看→ 關(guān)于區(qū)塊鏈的基本組成、加密原理都用最通俗易懂的方式講解了 希望能夠幫助大家學(xué)習(xí)
以下是正文
共識機(jī)制
實(shí)用拜占庭容錯(cuò)機(jī)制理解
RBFT
RBFT算法通常包含以下幾個(gè)階段:視圖切換(View Change)、決策提案(Proposal)、驗(yàn)證和投票(Validation and Voting)、決策達(dá)成(Decision)。
當(dāng)然了還有很多種不同的算法沒有天下第一的算法 只有不同場景下相對的最優(yōu)決策
常用的共識機(jī)制有PoW(Proof of Work)工作量證明,PoS(Proof of Stake)權(quán)益證明,DPoS(Delegated Proof of Stake委任權(quán)益證明,DBFT(Delegated Byzantine Fault Tolerance)等。
EOS
在研究EOS之前 我們先說說DPOS
而在EOS的機(jī)制下,節(jié)點(diǎn)是定向廣播的。21節(jié)點(diǎn)的位置是透明的,會選擇最短路徑來規(guī)定廣播順序。如圖:
DBFT
共識術(shù)語?
共識消息?
共識流程?
三階段共識流程?
大致分為這么幾步:
?文章來源:http://www.zghlxwxcb.cn/news/detail-839219.html
共識機(jī)制
共識算法是用于保證分布式系統(tǒng)一致性的機(jī)制。這里的一致性可以是交易順序的一致性、賬本一致性、節(jié)點(diǎn)狀態(tài)的一致性等。一般地,我們根據(jù)容錯(cuò)類型將共識算法分為兩類。
- 拜占庭容錯(cuò)?: 拜占庭容錯(cuò)強(qiáng)調(diào)的是能夠容忍部分區(qū)塊鏈節(jié)點(diǎn)由于硬件錯(cuò)誤、網(wǎng)絡(luò)擁塞或斷開以及遭到惡意攻擊等情況出現(xiàn)的不可預(yù)料的行為。BFT系列算法是典型的拜占庭容錯(cuò)算法,比如PBFT、HotStuff等。
- 非拜占庭容錯(cuò)?: 非拜占庭容錯(cuò)通常指能夠容忍部分區(qū)塊鏈節(jié)點(diǎn)出現(xiàn)宕機(jī)錯(cuò)誤,但不容忍出現(xiàn)不可預(yù)料的惡意行為導(dǎo)致的系統(tǒng)故障。常見的CFT共識算法有Paxos、Raft等。
實(shí)用拜占庭容錯(cuò)機(jī)制理解
我們用一個(gè)例子來說明 這個(gè)機(jī)制
假設(shè)有一個(gè)拜占庭帝國,帝國中有多位將軍和士兵組成的軍隊(duì),這些將軍需要就發(fā)起進(jìn)攻或撤退的決策達(dá)成一致,然后將命令傳達(dá)給士兵執(zhí)行。然而,有些將軍可能是叛徒,他們可能會發(fā)送錯(cuò)誤的指令或者偽造指令來導(dǎo)致軍隊(duì)混亂。
為了解決這個(gè)問題,拜占庭容錯(cuò)機(jī)制可以被應(yīng)用。在這個(gè)機(jī)制中,將軍們通過多輪的消息交流來達(dá)成共識。每一輪,將軍們會相互發(fā)送自己的意見和指令,并收集其他將軍們的意見。
在每一輪中,將軍們會根據(jù)收到的消息進(jìn)行驗(yàn)證。他們會檢查消息的完整性、一致性和發(fā)送者的可信度。如果大多數(shù)將軍發(fā)送了相同的指令,那么其他將軍將接受這個(gè)指令并傳達(dá)給士兵。如果有少數(shù)叛徒將軍發(fā)送了錯(cuò)誤的指令,那么大多數(shù)忠誠的將軍可以通過多數(shù)投票的方式排除這些錯(cuò)誤指令,并達(dá)成一致的決策。
通過這種方式,拜占庭容錯(cuò)機(jī)制可以保證大多數(shù)忠誠的將軍達(dá)成一致的決策,并將正確的指令傳達(dá)給士兵,即使存在少數(shù)叛徒將軍的干擾。
?
大多數(shù)平臺采用?自適應(yīng)共識機(jī)制?,支持RBFT、NoxBFT(BFT類)以及RAFT(CFT類)等多種共識算法,以滿足不同的業(yè)務(wù)場景需求。下文將主要介紹RBFT、NoxBFT和RAFT等共識算法。
?
我們這里講解其中一種--RBFT
RBFT
RBFT(Redundant Byzantine Fault Tolerance)是一種拜占庭容錯(cuò)算法,它通過增加冗余節(jié)點(diǎn)來提高系統(tǒng)的容錯(cuò)性能。在RBFT算法中,系統(tǒng)中的節(jié)點(diǎn)被分為兩類:主節(jié)點(diǎn)(Primary)和備份節(jié)點(diǎn)(Backup)。主節(jié)點(diǎn)負(fù)責(zé)提出決策并向其他節(jié)點(diǎn)傳達(dá),備份節(jié)點(diǎn)則用于容錯(cuò),以確保即使主節(jié)點(diǎn)出現(xiàn)錯(cuò)誤或惡意行為,系統(tǒng)仍能正常運(yùn)行。
回到之前的拜占庭帝國的例子,我們可以應(yīng)用RBFT算法來改進(jìn)共識過程。假設(shè)有5位將軍,其中一位將軍被選為主將軍,其他4位將軍作為備份將軍。
在每一輪的共識過程中,主將軍會提出進(jìn)攻或撤退的決策,并將其發(fā)送給其他4位備份將軍。備份將軍會驗(yàn)證主將軍的決策,并與其他備份將軍進(jìn)行比較。如果大多數(shù)備份將軍收到并驗(yàn)證了相同的決策,那么他們會接受該決策并將其傳達(dá)給士兵。
然而,如果主將軍是叛徒或出現(xiàn)錯(cuò)誤,發(fā)出了錯(cuò)誤的決策,備份將軍可以通過相互比較和多數(shù)投票的方式排除錯(cuò)誤的決策,并達(dá)成一致的決策。只有當(dāng)大多數(shù)備份將軍達(dá)成一致時(shí),正確的決策才會被傳達(dá)給士兵。
通過增加備份將軍,RBFT算法提供了冗余的節(jié)點(diǎn)來容忍主節(jié)點(diǎn)的錯(cuò)誤或惡意行為。即使主節(jié)點(diǎn)是叛徒或出現(xiàn)錯(cuò)誤,只要大多數(shù)備份節(jié)點(diǎn)是誠實(shí)的,系統(tǒng)仍然能夠達(dá)成共識并保持正常運(yùn)行。
RBFT算法通常包含以下幾個(gè)階段:視圖切換(View Change)、決策提案(Proposal)、驗(yàn)證和投票(Validation and Voting)、決策達(dá)成(Decision)。
- 視圖切換(View Change):在RBFT算法中,主節(jié)點(diǎn)可能會出現(xiàn)錯(cuò)誤或惡意行為。為了應(yīng)對這種情況,備份節(jié)點(diǎn)可以通過視圖切換機(jī)制選擇新的主節(jié)點(diǎn)。在每個(gè)視圖中,節(jié)點(diǎn)可以根據(jù)事先約定的規(guī)則來選擇新的主節(jié)點(diǎn)。這個(gè)階段的目標(biāo)是確保主節(jié)點(diǎn)的正確性和可靠性。
沿用之前的例子,假設(shè)主將軍在某個(gè)輪次中發(fā)送了錯(cuò)誤的決策或者出現(xiàn)了故障。備份將軍可以觸發(fā)視圖切換,并通過約定的規(guī)則來選擇新的主將軍。
- ?
- 決策提案(Proposal):在RBFT算法中,主節(jié)點(diǎn)負(fù)責(zé)提出決策。主節(jié)點(diǎn)會根據(jù)一定的規(guī)則和條件提出進(jìn)攻或撤退的決策,并將其發(fā)送給其他節(jié)點(diǎn)。
在我們的例子中,新選出的主將軍會提出進(jìn)攻或撤退的決策,并將其發(fā)送給其他備份將軍
? - 驗(yàn)證和投票(Validation and Voting):備份節(jié)點(diǎn)在收到主節(jié)點(diǎn)的決策提案后,會對其進(jìn)行驗(yàn)證。節(jié)點(diǎn)會檢查決策的合法性和正確性,并與其他節(jié)點(diǎn)進(jìn)行比較。如果大多數(shù)節(jié)點(diǎn)對決策達(dá)成一致,它們將投票支持該決策。
在例子中,備份將軍會驗(yàn)證主將軍的決策,并與其他備份將軍進(jìn)行比較。如果大多數(shù)備份將軍驗(yàn)證了相同的決策,它們會投票支持該決策。
? ?? - 決策達(dá)成(Decision):當(dāng)大多數(shù)節(jié)點(diǎn)投票支持同一決策時(shí),系統(tǒng)會達(dá)成共識并執(zhí)行該決策。正確的決策將被傳達(dá)給士兵,以便他們執(zhí)行相應(yīng)的行動。
在例子中,當(dāng)大多數(shù)備份將軍達(dá)成一致,并投票支持同一個(gè)決策時(shí),該決策將被傳達(dá)給士兵,以便他們執(zhí)行進(jìn)攻或撤退的行動。
通過這些階段的組合,RBFT算法能夠容忍主節(jié)點(diǎn)的錯(cuò)誤或惡意行為,并通過多數(shù)投票的方式達(dá)成共識。這種機(jī)制提高了系統(tǒng)的容錯(cuò)性和安全性
當(dāng)然了還有很多種不同的算法沒有天下第一的算法 只有不同場景下相對的最優(yōu)決策
常用的共識機(jī)制有PoW(Proof of Work)
工作量證明,PoS(Proof of Stake)
權(quán)益證明,DPoS(Delegated Proof of Stake
委任權(quán)益證明,DBFT(Delegated Byzantine Fault Tolerance)
等。
EOS
采用了委任權(quán)益證明,選出一些代表性的節(jié)點(diǎn)來進(jìn)行投票,這種方式目的是優(yōu)化社區(qū)投票的效率和結(jié)果,但帶來了一些中心化的風(fēng)險(xiǎn)。
在研究EOS之前 我們先說說DPOS
假設(shè)將軍的例子中,我們有三個(gè)節(jié)點(diǎn)分別代表將軍A、將軍B和將軍C?,F(xiàn)在我們將這個(gè)例子應(yīng)用于上述提到的情況。
假設(shè)A是第一個(gè)出塊的將軍,然后是B,最后是C?,F(xiàn)在,將軍B決定進(jìn)行分叉。在輪到將軍B出塊時(shí),他不再承認(rèn)將軍C和將軍A的塊,而是自己單獨(dú)出塊。在這種情況下,B分叉出去的鏈每9秒才能出一個(gè)塊,而C和A每6秒出一個(gè)塊。在DPOS機(jī)制下,即使分叉,B仍然需要等待A和C都出塊后才能繼續(xù)出塊。
?
因此,分叉出塊的速度永遠(yuǎn)追不上原來鏈的速度,因?yàn)楣沧R機(jī)制只承認(rèn)最長的鏈。這意味著少數(shù)節(jié)點(diǎn)分叉的情況下,分叉的節(jié)點(diǎn)無法超過由其他節(jié)點(diǎn)認(rèn)可的鏈的增長速度。
?
如果有三分之二的節(jié)點(diǎn)決定分叉,原理也是一樣的。最后一個(gè)誠實(shí)的少數(shù)節(jié)點(diǎn)決定了最快、最長的鏈。分叉的節(jié)點(diǎn)無法追上由其他節(jié)點(diǎn)認(rèn)可的鏈的增長速度。
?
在DPOS共識機(jī)制中,確定最長的鏈?zhǔn)峭ㄟ^"最后不可逆塊"的概念實(shí)現(xiàn)的。最后不可逆塊是指無法修改的最后一個(gè)區(qū)塊。根據(jù)DPOS規(guī)定,當(dāng)三分之二的節(jié)點(diǎn)確認(rèn)一個(gè)區(qū)塊時(shí),它就成為不可逆塊。如果最新出塊的三分之二節(jié)點(diǎn)確認(rèn)一個(gè)區(qū)塊,那么它就是最后不可逆塊。
?
通過最后不可逆塊,可以確認(rèn)這條鏈?zhǔn)欠袷怯扇种墓?jié)點(diǎn)簽名的最長鏈。
?
總結(jié)來說,DPOS機(jī)制可以有效地防范拜占庭作惡,具有強(qiáng)大的拜占庭容錯(cuò)性。本例只列舉了幾種主要的作惡情況,而DPOS機(jī)制可以預(yù)防許多其他作惡情況,這里沒有一一列舉。
此外,交易作為權(quán)益證明(TaPOS)是指交易作為驗(yàn)證前一個(gè)塊的數(shù)據(jù)的證明。當(dāng)塊數(shù)增加時(shí),這條鏈很難被替代,因?yàn)樾薷囊粋€(gè)塊會導(dǎo)致所有的TaPOS值不匹配。
在EOS的DPOS機(jī)制中,通過定向廣播來提高出塊速度和性能。在比特股和STEEM等系統(tǒng)中,廣播是隨機(jī)的,誰先收到塊就可以接力生成新的塊。然而,EOS采用了定向廣播,使得塊的傳播更加高效。這種機(jī)制使得EOS可以達(dá)到更快的出塊速度(例如500毫秒)。
?
?
在上文提到,比特股的出塊速度是3s,而EOS可以達(dá)到500ms。EOS能提高出塊速度是因?yàn)槎ㄏ驈V播。
因?yàn)槭请S機(jī)廣播,所以會誕生很多同步一輪的區(qū)塊路徑不是最短路徑。
而在EOS的機(jī)制下,節(jié)點(diǎn)是定向廣播的。21節(jié)點(diǎn)的位置是透明的,會選擇最短路徑來規(guī)定廣播順序。如圖:
?
?
DBFT
DBFT共識機(jī)制則是通過對節(jié)點(diǎn)分配不同的角色來達(dá)成共識,這樣可以很大程度降低開銷和避免分叉,但是也有核心角色作惡的風(fēng)險(xiǎn)。
NEO 在 PBFT(Practical Byzantine Fault Tolerance, 實(shí)用拜占庭容錯(cuò))算法的基礎(chǔ)上,提出了 dBFT(delegated Byzantine Fault Tolerance, 委托拜占庭容錯(cuò))共識算法。算法根據(jù)區(qū)塊鏈實(shí)時(shí)投票情況,決定下一輪參與共識的節(jié)點(diǎn),有效降低了算法耗時(shí),從而提高了出塊速度,同時(shí)降低了交易確認(rèn)周期。
共識術(shù)語?
名稱 | 定義 |
---|---|
共識節(jié)點(diǎn) | 具有發(fā)起新塊提案和對提案投票權(quán)限的節(jié)點(diǎn) |
普通節(jié)點(diǎn) | 具有轉(zhuǎn)賬、交易權(quán)限和全網(wǎng)賬本,但不能發(fā)起區(qū)塊提案與投票 |
議長 | 負(fù)責(zé)向其他節(jié)點(diǎn)廣播新塊提案 |
議員 | 參與共識出塊的賬戶,負(fù)責(zé)對新塊提案進(jìn)行投票 |
候選人 | 被提名有權(quán)參與共識節(jié)點(diǎn)競選的賬戶 |
共識節(jié)點(diǎn) | 從候選人中被選出的,參與共識的賬戶 |
視圖 | 一輪共識從開始到結(jié)束所使用的數(shù)據(jù)集。視圖編號?v,從 0 開始,本輪共識失敗時(shí)?v?逐漸遞增,直到新的提案通過后重置 |
共識消息?
dBFT 2.0 算法包含 6 種共識消息:
名稱 | 描述 |
---|---|
Prepare Request | 發(fā)起新一輪共識的信息 |
Prepare Response | 用來通知其他節(jié)點(diǎn)已獲取構(gòu)建區(qū)塊的全部交易信息 |
Commit | 通知其他節(jié)點(diǎn)已獲取了足夠多的 Prepare Response |
Change View Request | 嘗試改變視圖的信息 |
Recovery Request | 同步共識狀態(tài)的請求 |
Recovery Message | 對 Recovery Request 的響應(yīng)信息 |
共識流程?
三階段共識流程?
我們可以使用剛才的將軍的例子來解釋這四個(gè)步驟。
假設(shè)我們有三個(gè)將軍A、B和C,他們正在進(jìn)行一輪共識。
-
議長發(fā)起共識,廣播 Prepare Request(準(zhǔn)備請求):
- 在這個(gè)步驟中,將軍A被選為議長,并發(fā)出一個(gè)準(zhǔn)備請求,表示他準(zhǔn)備開始共識過程。
- 將軍A廣播這個(gè)準(zhǔn)備請求給其他兩個(gè)將軍B和C。
-
接收到 Prepare Request 后,議員廣播 Prepare Response(準(zhǔn)備響應(yīng)):
- 將軍B和將軍C接收到將軍A的準(zhǔn)備請求后,他們分別廣播自己的準(zhǔn)備響應(yīng)。
- 這些準(zhǔn)備響應(yīng)表示將軍B和將軍C同意參與共識過程。
-
接收到足夠多的 Prepare Response 后,共識節(jié)點(diǎn)廣播 Commit(提交):
- 一旦將軍A收到足夠多的準(zhǔn)備響應(yīng)(例如收到了B和C的準(zhǔn)備響應(yīng)),他就會廣播提交消息。
- 這個(gè)提交消息表示將軍A確認(rèn)共識已經(jīng)達(dá)成,并準(zhǔn)備繼續(xù)下一步。
-
接收到足夠多的 Commit 后,共識節(jié)點(diǎn)產(chǎn)生新塊并廣播:
- 一旦將軍A收到足夠多的提交消息(例如收到了B和C的提交消息),他們就開始生成新的區(qū)塊。
- 生成的新區(qū)塊包含了達(dá)成共識后的數(shù)據(jù),并由將軍A廣播給其他節(jié)點(diǎn),以便它們更新他們的鏈。
大致分為這么幾步:
?
初始化本地共識信息,重置共識上下文:
- 這個(gè)步驟類似于將軍們初始化并準(zhǔn)備開始新一輪戰(zhàn)斗。他們確定了將誰擔(dān)任議長,并設(shè)置了超時(shí)時(shí)間。
各共識節(jié)點(diǎn)超時(shí)前監(jiān)聽網(wǎng)絡(luò),收集交易信息:
- 這個(gè)步驟類似于將軍們在超時(shí)時(shí)間之前,收集關(guān)于戰(zhàn)局和敵方動向的情報(bào)信息。
發(fā)起共識:
- 在這個(gè)步驟中,議長根據(jù)共識策略從內(nèi)存池中選擇交易,并將它們打包為準(zhǔn)備請求(Prepare Request),然后廣播出去,這相當(dāng)于將軍們發(fā)起了新一輪的戰(zhàn)斗。
廣播 Prepare Response:
- 在這個(gè)步驟中,議員們收到議長的準(zhǔn)備請求后,進(jìn)行驗(yàn)證并將準(zhǔn)備響應(yīng)(Prepare Response)廣播出去,這相當(dāng)于將軍們對議長的命令作出回應(yīng)。
收集 Prepare Response & 廣播 Commit:
- 在這個(gè)步驟中,議長和接收到準(zhǔn)備請求的議員們收集到足夠多的準(zhǔn)備響應(yīng)后,進(jìn)行驗(yàn)證并廣播提交消息(Commit),這相當(dāng)于將軍們收集到足夠多的回應(yīng)后決定執(zhí)行戰(zhàn)斗計(jì)劃。
收集 Commit 信息 & 出塊:
- 在這個(gè)步驟中,已經(jīng)收集到準(zhǔn)備請求中交易信息的共識節(jié)點(diǎn)收集到足夠多的提交消息后,進(jìn)行驗(yàn)證并生成新的區(qū)塊,然后廣播出去,這相當(dāng)于將軍們根據(jù)戰(zhàn)斗計(jì)劃執(zhí)行行動并取得勝利。
回到第 1 步,開始下一輪共識:
- 在這個(gè)步驟中,共識過程完成后,開始準(zhǔn)備新一輪的共識,這相當(dāng)于將軍們完成一輪戰(zhàn)斗后準(zhǔn)備進(jìn)入下一輪。
這樣? 我們就能對這個(gè)算法有一個(gè)初步的認(rèn)知 但是實(shí)際的使用還要看具體的業(yè)務(wù)場景來判別
?
?
到了這里,關(guān)于區(qū)塊鏈基礎(chǔ)知識(下):共識機(jī)制 附帶圖解、超詳細(xì)教學(xué) 看不懂你打死我的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!