共識就像是議會中的投票規矩,前面 Block Verification 是在講每位議員如何決定自己要不要投票給該領導者,但並不表示投的內容就是對的。而共識則是一種「機制」,是投票的遊戲規矩,所有節點都需要遵守這個規矩,不然會受到懲罰,而這項規矩的設定會使得議員們減少故意投給錯誤選項的頻率,促進區塊鏈上資訊的正確性及統一性。本篇將以圖解讓您詳細了解 Solana 上共識機制的步驟,以及此共識機制設計的巧妙之處,達到避免節點亂投票的效果。
提醒讀者:如果您尚未閱讀過或想先了解 Solana 的基本運作流程,建議先參考 **由 Transaction 的生命週期看 Solana 的底層架構 ,**這將有助於您更好地理解本篇深入探討的技術細節。
Solana 使用的共識機制是 Tower BFT (TBFT),有別於其他區塊鏈經常使用的 Practical Byzantine Fault Tolerance (PBFT),TBFT 利用了PoH 機制確定了交易發生的時間點及順序,讓整個共識過程變得容易且快速許多。
先簡單說明一下 Solana 的共識跟其他區塊鏈的共識最大的不同點,就是其他區塊鏈在生產下一個區塊之前,就會讓所有節點統一狀態,才進行下一個出塊。但 Solana 不同,領導者會不斷地生產下一個區塊,並且傳送給不同的節點(Turbine Tree 順序會輪替),再加上領導者還會換人當(每四個 slot 換一個領導者,且新領導者要輪到他之前會休息兩個 slot 做準備),這會導致每個節點收到的區塊可能不同導致當下的狀態彼此不同,這種情況我們稱為出現了多個 fork。每個 fork 就代表了每個節點當下 bank 的歷史,所以雖然我們會說「針對某個區塊進行投票」,但這同時也代表該節點在對某個 fork 進行投票,因為同一個區塊不能同時出現在兩個 fork 之中,就像是在兩個平行宇宙中的兩位蜘蛛人不應該突然共享了彼此的記憶一樣(假設平行宇宙不相交)。總之,要如何統整所有節點的 fork 就成為共識中最重要的一部分。
節點們會用 ”blockstore“ 來儲存所有可能的 forks ,直到某一個 block 被確認出塊後(即獲得 2/3 以上驗證者的投票,成為 Supermajority root (SMR) ),與之衝突的 fork 就會被刪減掉。如果很不巧的某節點所投的 fork 是被刪減掉的 fork,那他將不會因為本次投票獲得任何獎勵,反而還會因為投票所花費的手續費而產生損失。而且在 TBFT 中還有一個 locktime 的機制,簡單來說他規定了一個節點在投票給了某個 fork 之後,必須在一段時間內保持自己的這項決定,不能投票給與之衝突的其他 fork,不然就會被 slash。
我們可以看下圖的兩個例子。
範例一:由於區塊傳播速度較慢,加上Turbine Tree 節點輪替,導致 fork 出現
範例二:由於領導者換人前會休息,導致領導者在不是最新狀態的情況下出塊
由以上的範例可以知道 fork 究竟是如何生成的,接下來我們來看看 TBFT 實際上是怎麼運作的吧。首先介紹幾個詞:
Tower(塔):每個節點用來跑 TBFT 使用到的資料結構
root:塔中最底層存放的區塊
lockout:概念有點像是該節點對某個區塊的信任度,lockout越大表示此節點覺得這個區塊越可信
expiration:每個區塊在塔中的過期時間,當塔中新增的區塊所處的時間大於 expiration 該層就會被從塔中移除(下面範例中 block 編號 = block 被產出的 slot 編號)