區(qū)塊鏈基礎(chǔ)之共識機制

1.1共識機制

1.1.1核心定義

區(qū)塊鏈上的共識機制主要解決由誰來構(gòu)造區(qū)塊盆耽,以及如何維護區(qū)塊鏈統(tǒng)一的問題

1.1.2共識機制分類

共識機制分類

1.1.3 共識算法

1.1.3.1 POW(工作量證明)

代表項目:BTC

由于不同的節(jié)點接受數(shù)據(jù)有所區(qū)別,為了保證數(shù)據(jù)一致性,每個區(qū)塊數(shù)據(jù)只能由一個節(jié)點進行記錄摄杂。BTC通過“工作量證明”(Proof of Work坝咐,PoW)來確認(rèn)記賬節(jié)點。每個節(jié)點如果想生成一個新的區(qū)塊并寫入?yún)^(qū)塊鏈析恢,必須解出比特幣網(wǎng)絡(luò)出的PoW問題墨坚。其關(guān)鍵的要素是工作量證明函數(shù)、區(qū)塊信息及難度值映挂。工作量證明函數(shù)是這道題的計算方式泽篮,區(qū)塊決定了這道題的輸入數(shù)據(jù),難度值決定了這道題所需要的計算量柑船∶背牛可以簡單理解成就是將不同的nonce值作為輸入,嘗試進行SHA256哈希運算鞍时,找出滿足給定數(shù)量前導(dǎo)0的哈希值的過程亏拉。而要求的前導(dǎo)0的個數(shù)越多,代表難度越大寸癌。

比特幣節(jié)點求解工作量證明問題的步驟大致歸納如下:

  1. 生成鑄幣交易专筷,并與其他所有準(zhǔn)備打包進區(qū)塊的交易組成交易列表弱贼,通過Merkle樹算法生成Merkle根哈希蒸苇;
  2. 把Merkle根哈希及其他相關(guān)字段組裝成區(qū)塊頭,將區(qū)塊頭的80字節(jié)數(shù)據(jù)作為工作量證明的輸入吮旅;
  3. 不停地變更區(qū)塊頭中的隨機數(shù)溪烤,即nonce的數(shù)值,并對每次變更后的區(qū)塊頭做雙重SHA256運算(即SHA256(SHA256(Block_Header)))庇勃,將結(jié)果值與當(dāng)前網(wǎng)絡(luò)的目標(biāo)值做對比檬嘀,如果小于目標(biāo)值,則解題成功责嚷,工作量證明完成鸳兽。

1.1.3.2 POS(股權(quán)證明)

代表項目:目前以太坊的共識機制正在朝POS方向迭代

由于PoW 方式需要消耗大量的算力,使得大家陷入算力競爭中罕拂,導(dǎo)致算力集中于頭部礦場存在安全性風(fēng)險揍异,同時挖礦的過程也沒有實際價值,因此出現(xiàn)了POS機制爆班。

目前PoS機制仍然有著問題需要解決衷掷,仍然處于發(fā)展之中。目前比較常見的是第一種Peercoin所采用的方式柿菩。

以Peercoin(點點幣)為代表的PoW+PoS混合共識
其所采用的股權(quán)證明PoS模式下戚嗅,有一個名詞叫幣齡,每個幣每天產(chǎn)生1幣齡,在hash計算中使得難度與交易輸入的幣齡成反比懦胞。同時在產(chǎn)出區(qū)塊后清空幣齡替久。但是仍然需要參與區(qū)塊生產(chǎn)的節(jié)點進行一定量的哈希值計算,即以類似工作量的方式生產(chǎn)區(qū)塊躏尉,只不過各節(jié)點通過計算尋找出合法區(qū)塊的概率與節(jié)點持有的權(quán)益相關(guān)侣肄,即根據(jù)權(quán)益選擇生產(chǎn)者,并且采用基于權(quán)益的激勵方式醇份。只是一定程度上解決了POW機制帶來的能源大量消耗浪費的問題稼锅。

以以太坊Casper為代表的新型PoS共識

  1. 驗證者押下一定比例的他們擁有的以太幣作為保證金。
  2. 然后僚纷,開始驗證每一個區(qū)塊高度上的每一個候選塊(由繳納了保證金的驗證人提交的塊)矩距。也就是說,當(dāng)他們發(fā)現(xiàn)一個可以他們認(rèn)為可以被加到鏈上的區(qū)塊的時候怖竭,他們將以通過押下賭注來驗證它锥债。
  3. 通過多位驗證人的下注,對于每個高度最終會選出唯一一個勝出塊痊臭。
  4. 如果該區(qū)塊被加到鏈上哮肚,然后驗證者們將得到一個跟他們的賭注成比例的獎勵。
  5. 但是广匙,如果一個驗證者采用一種惡意的方式行動允趟、試圖做“無利害關(guān)系”的事(如多次下注,反復(fù)下注)鸦致,他們將立即遭到懲罰潮剪。

1.1.3.3 DPOS(委托權(quán)益證明)

代表項目:EOS

對于PoS機制的加密貨幣,每個節(jié)點都可以創(chuàng)建區(qū)塊分唾。DPoS是由被社區(qū)選舉的可信帳戶(超級賬戶)來創(chuàng)建區(qū)塊抗碰。DPoS機制類似于股份制公司,普通股民進不了董事會绽乔,要投票選舉代表(受托人)代他們做決策弧蝇。

1.1.3.4 PBFT(實用拜占庭容錯算法)

PBFT的設(shè)計思想在很多共識機制中都有借鑒,同時也被很多聯(lián)盟鏈采用折砸。

支持容錯故障節(jié)點之外看疗,還支持容錯作惡節(jié)點。假設(shè)集群節(jié)點數(shù)為 N鞍爱,有問題的節(jié)點為 f鹃觉。pbft 算法的最大容錯節(jié)點數(shù)量是(n-1)/3。有問題的節(jié)點中睹逃,可以既是故障節(jié)點盗扇,也可以是作惡節(jié)點祷肯,或者只是故障節(jié)點或者只是作惡節(jié)點。

假設(shè)故障節(jié)點和作惡節(jié)點都是不同的節(jié)點疗隶。那么就會有 f 個問題節(jié)點和 f 個故障節(jié)點佑笋,當(dāng)發(fā)現(xiàn)節(jié)點是問題節(jié)點后,會被集群排除在外斑鼻,剩下 f 個故障節(jié)點蒋纬,那么根據(jù)小數(shù)服從多數(shù)的原則,集群里正常節(jié)點只需要比f個節(jié)點再多一個節(jié)點坚弱,即 f+1 個節(jié)點蜀备,確節(jié)點的數(shù)量就會比故障節(jié)點數(shù)量多,那么集群就能達(dá)成共識荒叶。所以碾阁,所有類型的節(jié)點數(shù)量加起來就是 f+1 個正確節(jié)點,f個故障節(jié)點和f個問題節(jié)點些楣,即 3f+1=n

pbft 算法的基本流程主要有以下四步:

  1. 客戶端發(fā)送請求給主節(jié)點
  2. 主節(jié)點廣播請求給其它節(jié)點脂凶,節(jié)點執(zhí)行 pbft 算法的三階段共識流程。
  3. 節(jié)點處理完三階段流程后愁茁,返回消息給客戶端蚕钦。
  4. 客戶端收到來自 f+1 個節(jié)點的相同消息后,代表共識已經(jīng)正確完成鹅很。
    為什么收到 f+1 個節(jié)點的相同消息后就代表共識已經(jīng)正確完成嘶居?從上一小節(jié)的推導(dǎo)里可知,無論是最好的情況還是最壞的情況道宅,如果客戶端收到 f+1 個節(jié)點的相同消息食听,那么就代表有足夠多的正確節(jié)點已全部達(dá)成共識并處理完畢了胸蛛。

1.1.3.5 RAFT

Fabric:已實現(xiàn)了raft算法
與PBFT不同污茵,RAFT不支持作惡節(jié)點,因此更多的用于私鏈中葬项。raft 算法包含三種角色泞当,分別是:跟隨者( follower ),候選人(candidate )和領(lǐng)導(dǎo)者( leader )民珍。集群中的一個節(jié)點在某一時刻只能是這三種狀態(tài)的其中一種襟士,這三種角色是可以隨著時間和條件的變化而互相轉(zhuǎn)換的。

raft 算法主要有兩個過程:一個過程是領(lǐng)導(dǎo)者選舉嚷量,另一個過程是日志復(fù)制陋桂,其中日志復(fù)制過程會分記錄日志和提交數(shù)據(jù)兩個階段。raft 算法支持最大的容錯故障節(jié)點是(N-1)/2蝶溶,其中 N 為 集群中總的節(jié)點數(shù)量嗜历。

在Raft中宣渗,每個結(jié)點會處于下面三種狀態(tài)中的一種:

  1. follower:所有結(jié)點都以follower的狀態(tài)開始。如果沒收到leader消息則會變成candidate狀態(tài)
  2. candidate:會向其他結(jié)點“拉選票”梨州,如果得到大部分的票則成為leader痕囱。這個過程就叫做Leader選舉(Leader Election)
  3. leader:所有對系統(tǒng)的修改都會先經(jīng)過leader。每個修改都會寫一條日志(log entry)
    leader收到修改請求后的過程如下暴匠,這個過程叫做日志復(fù)制(Log Replication):
  4. 復(fù)制日志到所有follower結(jié)點(replicate entry)
  5. 大部分結(jié)點響應(yīng)時才提交日志
  6. 通知所有follower結(jié)點日志已提交
  7. 所有follower也提交日志
  8. 整個系統(tǒng)處于一致的狀態(tài)

Raft算法動畫:https://link.zhihu.com/?target=http%3A//thesecretlivesofdata.com/raft/

1.1.4共識算法對比

1.1.4.1 PBFT VS RAFT

PBFT VS RAFT

1.1.4.2 主流算法對比

共識算法

1.1.4.3 ZAB協(xié)議與Raft協(xié)議比較

ZAB 是通過“一切以領(lǐng)導(dǎo)者為準(zhǔn)”的強領(lǐng)導(dǎo)者模型和嚴(yán)格按照順序處理鞍恢、提交提案,來實現(xiàn)操作的順序性的每窖。主節(jié)點是基于 TCP 協(xié)議來廣播消息的帮掉,并保證了消息接收的順序性。出來的比較早窒典。

Raft協(xié)議是Raft協(xié)議就是一切以領(lǐng)導(dǎo)者為準(zhǔn)的方式旭寿,實現(xiàn)一系列值的共識和各節(jié)點日志的一致性。通過日志的連續(xù)性來保證消息或者說是數(shù)據(jù)的順序性以及完整性崇败。Raft協(xié)議中日志不僅是數(shù)據(jù)的載體盅称,同時,日志的完整性還會影響領(lǐng)導(dǎo)者選舉的結(jié)果(注:選舉的因素不僅僅只有日志的完整性來保證后室,還有任期等其他因素)缩膝。

Raft目前是工程上使用較為廣泛的強一致性、去中心化岸霹、高可用的分布式協(xié)議疾层。在這里強調(diào)了是在工程上,因為在學(xué)術(shù)理論界贡避,最耀眼的還是大名鼎鼎的Paxos痛黎。

異同點:

  1. 領(lǐng)導(dǎo)者選舉:
    ZAB 采用的“見賢思齊、相互推薦”的快速領(lǐng)導(dǎo)者選舉(Fast Leader Election)刮吧,節(jié)點間通過PK競爭(資本是所持有的信息)看哪個節(jié)點更適合做Leader湖饱,一個節(jié)點PK后,會將選票信息廣播出去杀捻,最終選舉出了大多數(shù)節(jié)點中數(shù)據(jù)最完整的節(jié)點井厌。
    Raft 采用的是“一張選票、先到先得”的自定義算法(注:里面包含了一個隨機等待時間的概念致讥,來保證最多幾次選舉就能完整選舉過程仅仆。),這里簡單說一下就是一個節(jié)點發(fā)現(xiàn)leader掛了垢袱,就選舉自己為leader墓拜,然后通知其他節(jié)點,其他節(jié)點把選票投給第一個通知它的節(jié)點请契。(注:這里其實也會涉及到PK咳榜,根據(jù)數(shù)據(jù)的完整性以及任期等信息潘懊,如果通知它的節(jié)點 沒有當(dāng)前節(jié)點的數(shù)據(jù)完整等那么 當(dāng)前節(jié)點是不會將選票投給該節(jié)點)
    以上看來,Raft 的領(lǐng)導(dǎo)者選舉贿衍,需要通訊的消息數(shù)更少授舟,選舉也更快。

  2. 日志復(fù)制:
    Raft 和 ZAB 相同贸辈,都是以領(lǐng)導(dǎo)者的日志為準(zhǔn)來實現(xiàn)日志一致释树,而且日志必須是連續(xù)的,也必須按照順序提交擎淤。
    ZAB通過TCP來保證操作的順序性奢啥。
    Raft協(xié)議通過Log Entry 加自己的校驗來實現(xiàn)日志的連續(xù)性。建議看上面的博客文章

  3. 讀操作和一致性:
    ZAB 的設(shè)計目標(biāo)是操作的順序性嘴拢,在 ZooKeeper 中默認(rèn)實現(xiàn)的是最終一致性桩盲,讀操作可以在任何節(jié)點上執(zhí)行;(注:很多地方說ZK是CP這沒有毛病席吴,但是并不是指ZK中的讀寫時強一致性赌结,是指在發(fā)生P的時候,ZK是C孝冒,或者看到這個很懵柬姚,看下上面的博客,以及仔細(xì)看下CAP理論的圖庄涡,里面也清晰的標(biāo)記著在沒發(fā)生P的時候量承,AC是可以共存的)
    而 Raft 的設(shè)計目標(biāo)是強一致性(也就是線性一致性),所以 Raft 更靈活(可以自己配置)穴店,Raft 系統(tǒng)既可以提供強一致性撕捍,也可以提供最終一致性,但是一般為了保證性能泣洞,默認(rèn)提供的也是最終一致性忧风。

  4. 寫操作:
    Raft 和 ZAB 相同,寫操作都必須在領(lǐng)導(dǎo)者節(jié)點上處理斜棚。

  5. 成員變更:
    Raft 和 ZAB 都支持成員變更阀蒂,其中 ZAB 以動態(tài)配置(dynamic configuration)的方式實現(xiàn)的。那么當(dāng)你在節(jié)點變更時弟蚀,不需要重啟機器,集群是一直運行的酗失,服務(wù)也不會中斷义钉。

  6. 設(shè)計階段:
    相比 ZAB,Raft 的設(shè)計更為簡潔规肴,比如 Raft 沒有引入類似 ZAB 的成員發(fā)現(xiàn)和數(shù)據(jù)同步階段捶闸,而是當(dāng)節(jié)點發(fā)起選舉時夜畴,遞增任期編號,在選舉結(jié)束后删壮,廣播心跳贪绘,直接建立領(lǐng)導(dǎo)者關(guān)系,然后向各節(jié)點同步日志央碟,來實現(xiàn)數(shù)據(jù)副本的一致性税灌。
    ZAB協(xié)議的數(shù)據(jù)同步的階段,ZAB集群式無法對外提供服務(wù)亿虽。
    其實菱涤,ZAB 的成員發(fā)現(xiàn),可以和領(lǐng)導(dǎo)者選舉合到一起洛勉,類似 Raft贮庞,在領(lǐng)導(dǎo)者選舉結(jié)束后雏节,直接建立領(lǐng)導(dǎo)者關(guān)系,而不是再引入一個新的階段;數(shù)據(jù)同步階段尉辑,是一個冗余的設(shè)計,可以去除的牢贸,因為 ZAB 不是必須要先實現(xiàn)數(shù)據(jù)副本的一致性篙耗,才可以處理寫請求,而且這個設(shè)計是沒有額外的意義和價值的引润。

  7. 設(shè)計獨立性
    ZAB 和 ZooKeeper 強耦合巩趁,你無法在實際系統(tǒng)中獨立使用;而 Raft 的實現(xiàn)(比如 Hashicorp Raft)是可以獨立使用的淳附,編程友好议慰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奴曙,隨后出現(xiàn)的幾起案子别凹,更是在濱河造成了極大的恐慌,老刑警劉巖洽糟,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炉菲,死亡現(xiàn)場離奇詭異,居然都是意外死亡坤溃,警方通過查閱死者的電腦和手機拍霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薪介,“玉大人祠饺,你說我怎么就攤上這事≈” “怎么了道偷?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵缀旁,是天一觀的道長。 經(jīng)常有香客問我勺鸦,道長并巍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任换途,我火速辦了婚禮懊渡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怀跛。我一直安慰自己距贷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布吻谋。 她就那樣靜靜地躺著忠蝗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漓拾。 梳的紋絲不亂的頭發(fā)上阁最,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音骇两,去河邊找鬼速种。 笑死,一個胖子當(dāng)著我的面吹牛低千,可吹牛的內(nèi)容都是我干的配阵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼示血,長吁一口氣:“原來是場噩夢啊……” “哼棋傍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起难审,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤瘫拣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后告喊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麸拄,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年黔姜,在試婚紗的時候發(fā)現(xiàn)自己被綠了拢切。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡地淀,死狀恐怖失球,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帮毁,我是刑警寧澤实苞,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站烈疚,受9級特大地震影響黔牵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爷肝,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一猾浦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灯抛,春花似錦金赦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纵竖,卻和暖如春漠烧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背靡砌。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工已脓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人通殃。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓度液,卻偏偏與公主長得像,于是被迫代替她去往敵國和親画舌。 傳聞我的和親對象是個殘疾皇子堕担,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容