有小朋友問PBFT的基本問題:“PBFT為何需要COMMIT階段”除破?整理舊日筆記如下:
需要幾個(gè)階段云云掸掏,一定不能拋開VIEW CHANGE邏輯孤立地去看船殉,一定一定需要結(jié)合起來才能明白更振。
先看PBFT目前的邏輯中炕桨,如果某個(gè)honest node收到了(2f+1)個(gè)COMMIT消息后(對(duì)應(yīng)的交易假設(shè)是txnA),據(jù)此認(rèn)定共識(shí)達(dá)成并執(zhí)行肯腕,然后由于網(wǎng)絡(luò)的異步性引發(fā)眾多其他節(jié)點(diǎn)超時(shí)献宫,最終發(fā)生VIEW CHANGE會(huì)如何。
VIEW CHANGE過程中會(huì)有 (2f+1)個(gè)節(jié)點(diǎn)提供VIEW_CHG消息实撒,每個(gè)VIEW_CHG消息里面又打包了這個(gè)節(jié)點(diǎn)見到過的姊途、屬于不同VIEW的各類消息(PRE_PREPARE,PREPARE等等)知态,新的leader會(huì)試圖根據(jù)這些VIEW_CHG消息恢復(fù)原先view里面做了半拉的事情捷兰,以一種確保一致的方式替前任背完鍋后再宣布進(jìn)入自己的VIEW,并提出自己的pre_prepare负敏。
所謂COMMON WORKFLOW和VIEW CHANGE的配合贡茅,就是說COMMON WORKFLOW里面要為可能的VIEW CHANGE保存足夠的信息,而VIEW CHANGE必須充分利用這些信息完美地替前任擦干凈屁股其做。友扰。彤叉。兩者一定是互相配合。
回到剛才的討論村怪。只要有一個(gè)honest節(jié)點(diǎn)收到了view=v的(2f+1)個(gè)COMMIT消息(對(duì)應(yīng)的交易假設(shè)是txnA)后秽浇,據(jù)此認(rèn)定共識(shí)達(dá)成并執(zhí)行,后續(xù)的VIEW CHANGE應(yīng)該能告訴其他節(jié)點(diǎn):view=v共識(shí)的交易是txnA甚负,不可導(dǎo)致其他人認(rèn)為共識(shí)到txnB或者NULL柬焕。那么在現(xiàn)在的PBFT協(xié)議中,這些信息是足夠的:?
(觀察一)有一個(gè)honest node收到了view=v的(2f+1)個(gè)COMMIT消息(對(duì)應(yīng)的交易假設(shè)是txnA)--->? 有(2f+1)個(gè)節(jié)點(diǎn)發(fā)出了對(duì)應(yīng)txnA的COMMIT消息?---> 至少有(f+1)個(gè)honest節(jié)點(diǎn)發(fā)出了對(duì)應(yīng)txnA的COMMIT消息?--->有(f+1)個(gè)honest節(jié)點(diǎn)收到了(2f+1)個(gè)對(duì)應(yīng)txnA的PREPARE消息梭域,記錄這(f+1)個(gè)honest節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)集為QUORUM_A
(2f+1)個(gè)提供VIEW_CHG消息的節(jié)點(diǎn)記為QUORUM_B斑举,根據(jù)抽屜原理,QUORUM_A和QUORU_B的交集至少包含了一個(gè)honest節(jié)點(diǎn)病涨,這個(gè)節(jié)點(diǎn)可以提供前一個(gè)VIEW中可能被最終提交的交易信息txnA(證據(jù)是2f+1個(gè)對(duì)應(yīng)于它的prepare消息)
(觀察二)除了對(duì)應(yīng)txnA的(2f+1)個(gè)PREPARE消息之外富玷,沒有任何節(jié)點(diǎn)有能力給出(2f+1)個(gè)對(duì)應(yīng)其他txnB的(2f+1)個(gè)PREPARE消息:因?yàn)槿绻€存在另外(2f+1)個(gè)對(duì)應(yīng)于txnB的PREPARE消息,一定有一個(gè)honest節(jié)點(diǎn)又發(fā)了對(duì)應(yīng)txnA的PREPARE消息既穆,又發(fā)了對(duì)應(yīng)txnB的PREPARE消息赎懦,而這個(gè)是不可能的。
(觀察三)結(jié)合上述二者幻工,QUORUM_B中至少包含了前一個(gè)VIEW鐘可能被最終提交的交易信息txnB励两,且不可能存在矛盾的txnB,因此據(jù)此去恢復(fù)翻車現(xiàn)場(chǎng)是可行的且不會(huì)導(dǎo)致分叉囊颅。
因此当悔,上述分析說明的是,有了COMMIT階段的協(xié)議踢代,配合正確的VIEW CHANGE算法盲憎,是正確的。
反過來胳挎,如果簡(jiǎn)單去掉COMMIT階段饼疙,而VIEW CHANGE算法仍然是這樣會(huì)如何?答案是這個(gè)爛攤子是沒法收拾的串远,因?yàn)椴淮嬖谏鲜鑫ㄒ徽_的信息宏多。
1)假設(shè)view = v 時(shí)候的惡意節(jié)點(diǎn)集合是HE儿惫, 其中惡意leader給honest節(jié)點(diǎn)x 和包括 f個(gè)其他honest節(jié)點(diǎn)的集合HX發(fā)送了 對(duì)應(yīng) txnA 的 PRE_PREPARE消息澡罚,給包括f個(gè)額外的honest節(jié)點(diǎn)集合 HY 發(fā)送了對(duì)應(yīng) txnB的 PRE_PREPARE消息;?
2)HE, HX和x自己給x發(fā)送了對(duì)應(yīng)txnA的( 2f+1)個(gè)PREPARE消息肾请,而節(jié)點(diǎn)x據(jù)此認(rèn)為共識(shí)完成(是txnA)
3) 由于異步網(wǎng)絡(luò)的緣故留搔,HX和HB的其他節(jié)點(diǎn)沒收到足夠的PREPARE消息(包括對(duì)應(yīng)txnA的)
4) 異步網(wǎng)絡(luò)引發(fā)VIEW CHANGE
5) 提供(2f+1)個(gè) VIEW_CHG消息的節(jié)點(diǎn)可能不包含上述節(jié)點(diǎn)x,可能是 HX中的1個(gè)節(jié)點(diǎn)(支持txnA)铛铁,加上惡意節(jié)點(diǎn)集合HE隔显,honest節(jié)點(diǎn)集合HY(支持txnB)却妨,這樣在VIEW_CHG消息集合中占優(yōu)勢(shì)的信息反而是txnB,這個(gè)時(shí)候新的LEADER應(yīng)該如何決策括眠?算法該如何設(shè)計(jì)彪标?
上述分析說明的是,簡(jiǎn)單在PBFT中去掉COMMIT階段的協(xié)議掷豺,VIEW CHANGE算法應(yīng)該如何設(shè)計(jì)就不清楚了捞烟。