手機錢包沒下載完整區塊鏈,怎麼知道收款了?

手機錢包沒下載完整區塊鏈,怎麼知道收款了?的文章封面插畫

手機上的比特幣錢包,常在收款交易傳到網路後不久就顯示狀態。它沒有先下載完整區塊鏈,也能列出地址相關紀錄、估算可用餘額,並在交易進入區塊後增加確認數。

可是,這個速度容易讓人誤以為 App 已在手機內重做整套驗證。螢幕上的一行「已確認」,可能來自遠端服務的回答,也可能來自區塊標頭與密碼學證明的組合。兩種方法顯示相同結果時,背後承擔的信任、漏報與觀察風險仍有差別。

因此,判斷輕量錢包知道了什麼,可以把問題拆成三層:它怎麼找到與自己有關的交易、怎麼核對交易被區塊收錄,以及怎麼判斷該區塊位於目前追蹤的累積工作量較多標頭歷史。手機可以用較少資料回答前兩層的一部分,完整規則驗證的範圍則取決於錢包實際採用的架構。

先找到與自己有關的交易

錢包會從自己管理的收款資訊推導出要追蹤的輸出條件,再尋找符合條件的交易。全節點保存並驗證完整歷史,可以自行掃描這些資料;手機若不保存整份歷史,就需要某種索引或篩選方法縮小搜尋範圍。

最省資源的做法,是向遠端伺服器查詢相關交易。伺服器預先整理大量鏈上資料,收到請求後便回傳交易紀錄、未確認狀態與確認高度。這讓錢包啟動很快,也讓伺服器有機會看見哪些收款條件可能屬於同一名使用者。

這類回答的限制很直接:伺服器可以回傳真實資料,也可能延遲、漏掉或停止提供資料。連線到多個彼此獨立的來源有助於發現矛盾,卻無法讓一個單純查詢介面自動具備完整驗證能力。

SPV 核對標頭與收錄證明

簡化支付驗證(Simplified Payment Verification,SPV)提供了比完全相信查詢結果更強的一層證據。輕量客戶端下載連續的區塊標頭,檢查各標頭彼此銜接、工作量證明符合目標,並追蹤累積工作量較多的標頭鏈。標頭遠小於完整區塊,因此所需儲存與傳輸量也低很多。

當某筆交易被收錄時,資料提供者還能交出一條默克爾證明。錢包用交易識別碼與少量相鄰雜湊重新計算,若結果等於標頭內的默克爾根,就能確認該交易確實被那個區塊承諾。後方標頭繼續增加,也能呈現這段歷史累積了多少工作量。

這份證明的邊界很窄。它核對的是「交易與特定標頭的納入關係」,沒有逐筆檢查區塊內所有交易是否符合完整規則。惡意來源也可能選擇不告知某筆交易,或把輕量客戶端隔離在錯誤的網路視野中。SPV 減少了信任範圍,仍保留比全節點更大的假設。

精簡區塊過濾器把比對留在手機端

另一種輕量方法,是先下載由每個區塊內容產生的精簡過濾器。錢包在本機測試過濾器是否可能包含自己關心的輸出條件;有命中時,再下載相應的完整區塊,檢查其中與自己相關的資料。過濾器可能出現誤判,讓手機多下載一個無關區塊,但依規則正確建立的過濾器不應漏掉集合內的項目。

這種方向改善了一項隱私問題:錢包不必先把自己關心的每個地址逐一交給同一個服務查詢。代價是它要下載更多過濾資料與部分完整區塊,而下載模式仍可能洩漏線索。過濾器標頭、交叉詢問多個來源與自行重算過濾器,可以協助發現不一致;若連線被完全隔離,輕量客戶端仍可能只看見攻擊者安排的資料。

精簡過濾器負責協助發現相關交易,區塊標頭負責呈現工作量歷史,兩者加在一起也沒有執行所有完整規則。它們改善的是頻寬、隱私與可驗證性之間的折衷,沒有把手機變成完整驗證者。

同一個狀態標籤,可能代表不同證據

錢包剛收到交易通知時,通常只能說某個資料來源已看見它。出現第一次交易確認,表示錢包所採用的資料與驗證方法認為交易已進入某個區塊;確認數增加,則表示其後又接上更多區塊。至於畫面上的餘額,還需要整理與錢包有關、目前看來仍可花費的UTXO

如果伺服器漏報一筆收款,餘額可能暫時偏低;若漏報一筆支出,畫面也可能暫時高估可用資產。SPV 或精簡過濾器能降低部分風險,全節點則能自行檢查每個區塊與交易規則。驗證越獨立,通常需要承擔的頻寬、儲存、運算與維護也越多。

還有一條容易混淆的界線:錢包可以讓私鑰始終留在使用者裝置上,鏈上狀態卻仍由外部服務提供。控制交易的能力與驗證交易狀態的能力是兩個面向;保有前者,不會自動補齊後者。

所以,手機錢包能快速知道收款,靠的是把完整歷史問題縮成幾個較小的查詢與證明。遠端索引負責找資料,標頭與默克爾證明提高收錄證據的強度,完整規則則只有在實際執行驗證時才算被檢查。畫面上的確認狀態是一份有邊界的證據摘要;錢包採用哪一條資料路徑,決定了哪些事情由手機核對,哪些仍交給別人回答。