比特幣如何證明一筆交易真的在區塊裡?

比特幣如何證明一筆交易真的在區塊裡?的文章封面插畫

錢包顯示一筆交易已有交易確認,背後至少包含一項可檢查的事實:這筆交易被收進了某個區塊。區塊可能容納許多交易,而每個全節點都能取得完整內容並逐筆驗證。

不過,若只想核對其中一筆交易,每次都重新傳送整個區塊會很浪費。只拿到交易識別碼與區塊標頭,又怎麼知道兩者真的有關?一個網站說「已收錄」很方便,說法本身仍不是密碼學證據。

因此,比特幣用默克爾樹(Merkle tree)把一整批交易識別碼濃縮成一個默克爾根(Merkle root),再把這個根放進區塊標頭。驗證者只需取得目標交易與樹上的少量相鄰雜湊,就能重新算到同一個根,檢查交易是否確實被該標頭承諾。

從許多交易縮成一個根

每筆交易都能計算出交易識別碼,常寫成 TXID。建立區塊時,這些識別碼依區塊內的順序兩兩配對,合併後再次計算雜湊;新得到的結果繼續兩兩配對,直到頂端只剩一個值。這個值就是默克爾根。

它有點像替一整箱文件製作防拆封條。封條沒有保存每張文件的可讀內容,卻與這批文件的排列綁在一起。只要其中一個 TXID 改變,沿路往上的雜湊也會改變,最後算出的根便無法再與原本標頭相符。

默克爾根又會參與區塊標頭的雜湊計算,而每個標頭也會帶著前一個標頭的雜湊。於是,交易清單的承諾接上了區塊鏈的先後結構與工作量證明。想替換舊區塊中的交易,不能只改一列資料;標頭與其後累積的工作也會受到牽動。

證明只需要樹上的一條路

假設一個區塊有很多交易,要證明其中某筆交易被收錄,沒有必要交出樹上每一片葉子。提供者只要交出目標 TXID,以及從它所在位置一路算向樹根時所需的相鄰雜湊。這組資料通常稱為默克爾證明或默克爾分支。

驗證者先把目標 TXID 與第一個相鄰值依正確順序合併並計算,再把結果與下一層相鄰值重複處理。最後得到的值若等於區塊標頭內的默克爾根,便能確認這個 TXID 位於該區塊所承諾的交易集合中。提供證明的伺服器若偷偷換掉交易或分支資料,計算結果通常就會對不上。

這種證明的資料量隨交易數增加得很慢。交易數量大致增加一倍,證明通常只多一層相鄰雜湊。因此,沒有保存整個區塊內容的輕量程式,也能用較少資料核對特定交易的納入關係。

被收錄、符合規則與足夠穩定是三件事

默克爾證明回答的範圍很窄:某個 TXID 是否連得到某個區塊標頭裡的根。數學關係成立,仍不代表那個區塊必然符合共識規則。區塊可能包含無效簽章、重複花費或錯誤的新幣發行;只有檢查完整區塊內容,才能排除這些問題。全節點會做這一層驗證,單獨一條默克爾分支做不到。

證明也不會自動告訴你該區塊目前是否留在網路接受的最佳有效歷史中。兩名礦工接近同時產出區塊時,落敗分支上的交易仍能擁有完全正確的默克爾證明,該區塊卻可能不再是共同歷史的一部分。要判斷結算穩定度,還得核對區塊所在的鏈,以及後方累積了多少確認。

同樣地,納入證明無法證明付款人的真實身分、交易背後的契約,也無法單憑一次收錄判定某個輸出目前仍未花費。它證明資料曾被特定區塊承諾,沒有替現實語意或後續狀態作保。

所以,看到「交易已在鏈上」時,可以把判斷拆成三層:默克爾證明核對交易與特定標頭的關係;完整規則驗證判斷區塊能否被接受;後續區塊累積則逐步降低歷史被改組的機率。默克爾樹的價值在於用很短的資料回答第一層問題,同時也提醒我們,一份精巧的證明只有在問題問得夠精確時,才不會被誤解成無所不包的保證。