比特幣全節點第一次同步,為什麼要等這麼久?

比特幣全節點第一次同步,為什麼要等這麼久?的文章封面插畫

安裝一般通訊軟體後,登入帳號往往就能看到最新內容。第一次啟動比特幣全節點,畫面上的同步進度卻可能走上很久,處理器、網路和儲存裝置也持續忙碌。這很容易讓人以為,軟體只是在下載一份過度龐大的帳本副本。

不過,如果節點直接接受別人整理好的「目前餘額」,速度雖快,使用者也得相信提供者沒有漏資料、改規則或選錯歷史。全節點想取得的是獨立判斷能力,因此初次同步還要把多年交易依序檢查,親手重建今天的狀態。

所以,等待時間主要來自兩件同時進行的工作:取得過去的區塊資料,以及驗證每一步狀態轉換。進度條代表的更接近一次大型審帳,而非單純複製檔案。

節點要從歷史推導出現在

新節點找到可交換資料的同伴後,會取得區塊標頭與區塊內容。標頭讓它檢查工作量證明並比較不同候選歷史的累積工作量;完整內容則讓它核對每筆交易。某個同伴傳得快或聲稱自己已同步完成,都不會讓資料自動通過。

驗證過程包含許多規則:區塊結構與工作量是否合格、交易引用的輸入是否存在、同一筆資產有沒有被重複花費、簽章及花費條件能否成立,以及礦工建立的新幣與手續費有沒有超過規則允許的範圍。只有通過檢查的資料,才會被套用到節點自己的狀態。

每套用一筆有效交易,節點就移除已被花掉的 UTXO,並加入新產生的 UTXO。一路處理到目前鏈尖後,它手上的可花費狀態才是從歷史逐步推導而來。錢包查詢餘額、節點檢查新交易時,依靠的正是這份本機建立的結果。

下載、運算與寫入會彼此牽制

初次同步同時消耗多種資源。網路連線負責接收歷史區塊;處理器要計算雜湊、檢查簽章與執行交易條件;儲存裝置則持續讀寫區塊索引和可花費狀態。任何一環較慢,都可能讓其他資源暫時等候。

這也解釋了為什麼同一套軟體在不同電腦上的時間差異很大。較快的網路未必能補救緩慢的磁碟,處理器很強也可能受限於資料寫入。可供快取的記憶體、同伴連線品質、裝置是否同時處理其他工作,也會改變實際速度。

進度通常不會完全線性。早期區塊交易較少,驗證可能推進得快;接近較繁忙的歷史區段後,每個區塊包含的資料與花費條件增加,相同比例的進度可能需要更多工作。只用剩餘區塊數量推算完成時間,因而容易失準。

直接下載快照,會改變信任邊界

若只想得到最新狀態,最直覺的方法是下載一份別人準備的快照。它確實能省下部分等待,但節點必須先回答:這份快照由誰製作、對應哪段歷史、內容是否完整,以及之後會不會再補做驗證。若完全依賴快照,獨立驗證就退回對提供者的信任。

不同節點軟體與同步模式可以採用檢查點、預設可信區段或狀態快照等加速方法。這些設計不必然取消驗證,有些只是略過已知舊區塊中最昂貴的重複檢查,有些則讓節點先追上近期狀態、再於背景補驗歷史。使用者判斷同步完成時,需要分清楚「已能跟上最新區塊」和「預定的歷史驗證已全部完成」。

全節點也不一定要永久保存所有原始區塊。啟用剪枝後,節點可以在驗證舊資料並更新本機狀態之後,刪除較早的原始區塊,只保留繼續驗證所需的狀態與近期資料。這能降低長期磁碟需求,初次同步時仍得取得並處理那些舊區塊;若日後要重新掃描很久以前的交易或改回完整保存,可能需要再次下載。

尚未追上鏈尖時,畫面只是過去的切片

同步到某個高度,表示節點已驗證到那一段歷史,不代表它知道網路此刻的最新狀態。此時顯示的 UTXO、錢包餘額與交易確認,都可能落後於其他已同步節點。暫停後通常可以續傳,但在重新追上以前,不宜把舊畫面當作即時結算依據。

獨立驗證也有資訊邊界。節點能拒絕收到的無效資料,卻無法檢查從未傳來的區塊;若所有連線都把它隔離在同一段過時歷史,它可能不知道外界已經前進。多樣的同伴來源、累積工作量比較與持續更新連線,降低了這類風險,無法保證任何網路環境都沒有隔離。

因此,初次同步的漫長並非單純的軟體遲鈍。它反映全節點選擇從規則和歷史自行推出目前狀態,而不把答案直接交給單一伺服器。剪枝與快照可以調整儲存、等待和信任之間的取捨;無論採哪種模式,真正重要的是知道哪些資料已驗證、哪些判斷仍借助外部假設,以及節點何時才確實追上最新有效歷史。