比特幣交易能把全部輸入都付成手續費嗎?

比特幣交易能把全部輸入都付成手續費嗎?的文章封面插畫

比特幣交易會把既有資產當成輸入,再建立新的輸出。人們通常把輸入總額減去輸出總額的差,理解為付給礦工的費用。照這個算式推下去,若輸出總額降到零,是否代表整筆輸入都能變成手續費?

這個推論大致成立,不過交易不能把輸出欄位整個省略。一般交易至少要有一個輸出,否則會在基本格式與共識檢查時失敗;那個輸出的金額卻可以是零。只要其他規則也滿足,輸入價值與零金額輸出之間的全部差額,就會成為該筆交易的手續費。

因此,「沒有輸出」和「輸出總額為零」是兩種不同情況。前者是無效結構,後者在協議層可能有效。這個細節也揭示一項重要風險:比特幣不會替使用者判斷費用是否合理,格式正確的嚴重失誤仍可能被永久確認。

手續費沒有獨立的金額欄位

一筆普通交易會引用一個或多個 UTXO 作為輸入,並建立至少一個新輸出。每個輸出都包含金額與未來花用條件;全節點會檢查輸入是否可花、授權是否有效,以及輸出總額有沒有超過輸入總額。

節點不需要在交易裡尋找一格名為「手續費」的資料。假設輸入合計十萬聰,輸出合計九萬九千聰,差額一千聰就是費用;若輸出合計為零,差額便是完整的十萬聰。這筆價值沒有流入某個額外輸出,而是在礦工計算整個區塊可領取金額時被納入。

相反地,若交易的輸出清單完全空白,即使算術上看似能把差額全部當成費用,也過不了交易必須有輸出的基本檢查。協議要求結構存在,不代表結構內一定要保留正金額。

零金額輸出可以存在,但未必能花

輸出金額為零,不等於輸出沒有資料。它仍會帶有一段腳本,說明未來若要引用這個輸出,需要滿足什麼條件。技術上,零金額輸出也可能設定成可花用;只是日後花它還會增加另一筆交易的資料量,而且沒有帶來可轉移價值,通常缺乏實際用途。

更直觀的做法是使用 OP_RETURN 建立明確不可花用的零金額輸出。它能讓交易保有必要的輸出結構,同時告訴節點這項輸出永遠不會成為待花用資產。這類輸出常被用來承載少量資料,但資料用途與是否把所有輸入付成費用,仍是兩個分開的問題。

此外,符合共識規則,不保證每個節點都願意替交易轉送。常見軟體還有標準性、記憶池與防濫用政策;腳本形式、資料大小或費率異常,都可能影響交易能否沿一般網路路徑抵達礦工。礦工若透過其他管道取得一筆有效交易,仍可自行決定是否收錄。

礦工取得的是差額,不能多拿一層

若交易真的把十萬聰輸入全部留成費用,成功挖出該區塊的礦工就能把這十萬聰計入區塊獎勵。它不能再憑空替同一筆交易加收另一筆費用,也不能領取超過區塊補貼與全部交易費用總和的金額;其他節點會驗證礦工建立的新幣交易是否超額。

這裡也不能把普通交易與挖礦交易混為一談。每個區塊開頭的特殊交易負責領取補貼與費用,沒有引用既有 UTXO,適用不同的輸入檢查。本文所說的「把全部輸入付成費用」,指的是花用既有資產的普通交易。

一旦普通交易取得交易確認,原輸入就已被消耗,而零金額輸出不會把原價值留給付款人或收款人。若沒有其他輸出,原價值已全數進入礦工可領取的費用範圍;重新廣播交易、匯入助記詞或更換錢包,都不會把它恢復成餘額。

高得離譜的費用仍可能符合規則

比特幣的驗證規則主要回答資產有沒有被憑空創造、同一輸入有沒有重複花用,以及解鎖條件是否成立。它不掌握付款人的原意,也不知道十萬聰究竟是刻意給礦工,還是建立交易時漏掉了收款與找零。

因此,錢包軟體通常會自行估算合理費率,並在費用相對金額或交易大小明顯異常時警告或拒絕送出。這些保護屬於使用者介面與軟體政策,不是全網共識替每個人設定的退款機制。自製交易工具、手工輸入錯誤或程式缺陷,仍可能繞過防呆。

若異常交易尚未確認,有時可嘗試建立衝突版本、提高合理版本的費率,或聯絡可能收錄交易的礦工;是否可行取決於簽章、替換設定、節點政策與傳播狀態。一旦交易被有效區塊收錄,後續區塊持續增加,追回空間會迅速縮小,不能把這些方法當成保證。

所以,比特幣普通交易不能完全沒有輸出,卻可以只有總金額為零的輸出,進而把所有輸入價值留下作為手續費。這在技術上是一個有效邊界案例,在日常使用中則更像需要防範的災難性錯誤。理解結構有效與經濟合理之間的差別,才能看清協議會阻止憑空造幣,卻不會自動阻止人把自己的資產付錯地方。