PBFT基于狀態(tài)機副本機制馏臭,每個節(jié)點有當前的狀態(tài)(state),如果每個正常的節(jié)點都執(zhí)行順序的相同請求滓技,那么正常的節(jié)點將保持狀態(tài)一致姜贡。
1.通過主節(jié)點分配順序的序號囱怕,并且將請求發(fā)送給其他節(jié)點功舀。(pre-prepare)
2.為防止主節(jié)點作惡萍倡,給不同的節(jié)點發(fā)送序號不同,或者信息不一致辟汰。通過節(jié)點之間互相交互信息保證序號和信息一致列敲。(prepare)
3了防止主節(jié)點作惡,通過timeout機制來切換主節(jié)點帖汞,切換主節(jié)點的過程需要保證節(jié)點的狀態(tài)一致(可能在上個view中有一些節(jié)點執(zhí)行了戴而,有一些沒有執(zhí)行),需要commit階段和新主的條件來保證。(commit)(quorum)翩蘸。
提示:進行commit階段的原因是所意,如果沒有這個階段,在prepare階段之后直接執(zhí)行催首,可能在view-change的時候一些節(jié)點還沒有執(zhí)行扶踊。而在選主的時候主節(jié)點收到2f+1個節(jié)點的view_change消息就會切換成功,如果在之前的view對一個消息m達成共識郎任,有一個節(jié)點執(zhí)行了這個消息的操作秧耗,在新的view選出來之后,因為存在錯誤的節(jié)點舶治,主節(jié)點并不能確認之前已經執(zhí)行的消息在新的view中還能形成2f+1的多數(shù)派分井,所以可能造成有些節(jié)點執(zhí)行了,有些節(jié)點沒有執(zhí)行霉猛。導致整個集群狀態(tài)的不一致尺锚。