簡介
CBFT(Concurrent Byzantine Fault Tolerance) 并行拜占庭容錯(cuò)算法,從是拜占庭容錯(cuò)算法上發(fā)展而來新的共識算法。
CBFT算法有四個(gè)階段:block determination、pre-prepare、prepare 和 commit,后三個(gè)階段與PBFT算法的三個(gè)階段類似。CBFT的一個(gè)重要優(yōu)勢是并發(fā)性,每個(gè)塊可以與其他塊并發(fā)的方式投票及建塊,從而大大的提高共識速度。CBFT另一個(gè)重要特點(diǎn)就是可以在提交階段檢測受損節(jié)點(diǎn),可以在最后階段廣播消息來識別叛徒節(jié)點(diǎn)。步驟包含:交易級別的確認(rèn)和投票、建塊、塊驗(yàn)證、塊確認(rèn)。

交易級別的確認(rèn)和投票
所有節(jié)點(diǎn)對收到的交易進(jìn)行hash映射,得到一個(gè)交易Hash集合,將交易Hash集合發(fā)出給其余所有節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)對收到的交易Hash集合進(jìn)行2/3與運(yùn)算,求得2/3以上節(jié)點(diǎn)的交易交集對應(yīng)的交易Hash集合;對于副本Ni,假設(shè)Si是其捕獲中的一組交易。 Ni廣播Hi = {hash(t)| t∈S},并向其他副本sign(Hi,Ni)。這個(gè)階段也選擇一個(gè)主要的副本Np;
建塊
建塊節(jié)點(diǎn)根據(jù)這個(gè)交易Hash集合得到交易集合進(jìn)行建塊,將塊提交給其余節(jié)點(diǎn);對于每個(gè)接收到的消息(Hi,sign(Hi,Ni)),主副本Np首先使用sign(Hi,Ni)和Ni的公鑰來檢查Hi的一致性。然后,Np計(jì)算∩in = 1Hi。交集中的交易被添加到塊B中。然后,Np向其他副本廣播B和sign(B,Np)。
對塊進(jìn)行驗(yàn)證
收到塊的節(jié)點(diǎn)通過自身的交易Hash集合和塊中的交易集合對比完成驗(yàn)證,驗(yàn)證結(jié)束后將驗(yàn)證結(jié)果的數(shù)字簽名發(fā)給其余所有節(jié)點(diǎn);在這個(gè)階段,每個(gè)副本首先使用sign(B,Np)和Np的公鑰來檢查B的一致性,每個(gè)副本投票B。使vote(B,Ni)表示副本Ni對B的投票(vote(B,Ni)是表示同意或拒絕)。之后,Ni將vbi =(vote(B,Ni),sign(vote(B,Ni),Ni))廣播給其他副本。
塊投票
第二輪投票將所有節(jié)點(diǎn)收到的所有對該塊的投票簽名后轉(zhuǎn)發(fā),從而使得每個(gè)節(jié)點(diǎn)收到所有節(jié)點(diǎn)的投票,對投票進(jìn)行統(tǒng)計(jì)得到最終的結(jié)果,從而決定是否接納該塊;每個(gè)副本已收到所有其他副本的投票。然而,惡意副本可以向不同的副本發(fā)送不同的投票。因此,在這個(gè)階段,每個(gè)副本Nj首先使用sign(vote(B,Ni))和Ni的公鑰來檢查vote(B,Ni)的一致性。然后,Nj向所有其他副本廣播svj = {vb0,vb1,...,vbn}和sign(svj,Nj)。
塊確認(rèn)
對于每個(gè)副本Ni,它接收sv0,sv1,...,svn。對于0≤j≤n,它首先使用sign(svj,Nj)和Nj的公鑰來檢查svj的一致性。然后,計(jì)算B的同意的數(shù)量。如果同意的數(shù)量超過2n / 3,Ni回復(fù)agree給調(diào)用者。請注意,如果svj中的vbk與svl不同,對于j ≠ l,Nk是惡意副本。