Skip to main content
節點加入網路,必須回答兩個問題:我要怎麼走到這條鏈現在的位置,以及走到之後怎麼待住。狀態同步回答的就是這兩個問題,而兩者之間的取捨是攤開來的,不是藏起來的。

追趕的兩種模式

引導(bootstrapping)就是從零走到當前版本,做法有兩種,而且根本不同。 重放歷史。 從創世開始往前推進:要嘛把每筆交易重新執行一遍,要嘛套用執行早已產生的輸出。結果是一個持有完整歷史的節點,每個版本、每份證明、每筆交易都在。這條路也很慢,而且這條鏈每多跑一天就更慢。 下載當前狀態。 跳過歷史,直接取最新版本上的狀態鍵與值,對照已提交的根驗證。節點只花一小部分時間就追上了當下,代價是對這條鏈怎麼走到這裡一無所知。
新節點
引導模式
重放歷史從創世開始重新執行,或套用已儲存的輸出很慢,而且這條鏈每多跑一天就更慢
下載當前狀態最新版本上的鍵與值,對照已提交的根驗證只花一小部分時間就追上當下
當前版本之後持續同步
兩條路徑並不等價下載當前狀態起來的節點,提供不了歷史查詢,也答不出某個部位是怎麼走到今天這一步的。為索引器或稽核供給資料的節點,需要的正是被跳過的那段歷史。
重放這條路徑裡還有一層選擇:重新執行交易、套用已儲存的輸出,或者讓節點在每一處自行挑比較快的那種。重新執行是更強的驗證,因為它把結果重算出來,而不是信任一份記錄下來的結果;套用輸出則比較快。混合模式之所以存在,是因為正確答案會隨節點落後的程度而變。
這是維運決定,不是一個可以不加思索就接受的預設值。節點若是下載當前狀態起來的,就提供不了歷史查詢,也答不出某個部位是怎麼走到今天這一步的:它沒有歷史可讀。為索引器或稽核流程提供服務的節點,需要的正是被跳過的那段歷史。

保持在當前版本

到了當前版本之後,節點靠消費陸續到達的已提交區塊跟上進度,同樣可以選執行交易或套用輸出,驗證強度與速度之間還是同一套取捨。 和引導的差別在於,這裡的落差小而且恆定,不是大而且逐漸縮小。節點落後到一定程度就重新走引導路徑,不會想用增量方式去補一個任意大小的落差。

資料如何流動

同步不是一個節點向另一個節點索要一段區塊,而是拆成若干層,好讓任何單一對等節點都不會變成相依對象,也讓任何單點故障都拖不停進度。 值得理解的一個推論是:正在同步的節點並不信任對等節點。每個資料塊到達時都帶著一份證明,對照的是網路已經提交的根;對等節點若給出不一致的資料,直接拒絕,不會採信。選擇對等節點是效能決定,不是信任決定。

驗證

狀態同步裡沒有任何東西是憑發送方是誰就接受的。 狀態值對照已提交的狀態根驗證,交易和輸出對照累加器驗證。節點引導完成之後,狀態的根會和驗證者法定人數所簽署的一致,快速路徑安全就安全在這裡:下載當前狀態跳過的是歷史,不是驗證。

後續閱讀

儲存與證明

使同步可驗證的那些結構。

運行節點

節點角色,以及如何諮詢節點營運事宜。

網路拓撲

正在同步的對等節點在和哪一層節點通訊。

索引器

歷史能回答而當前狀態無法回答的問題。