比特幣錢包怎麼決定先花哪幾筆錢?

比特幣錢包怎麼決定先花哪幾筆錢?的文章封面插畫

比特幣錢包通常把許多收款整理成一個總餘額。使用者輸入金額、確認收款資訊,再按下送出,看起來就像從同一筆餘額扣款。

不過,比特幣網路沒有一個帳戶數字可直接減少。錢包掌握的價值散落在多筆尚未花費交易輸出,也就是 UTXO;建立付款時,軟體必須先決定要動用其中哪幾筆。

因此,選幣並非畫面背後無關緊要的小步驟。選到的輸入必須足以支付收款金額與手續費,還會改變交易大小、找零形狀、未來花費成本,以及公開紀錄留下的隱私線索。錢包實際在解的是一個多項條件互相牽制的選擇問題。

總餘額其實是一組待選輸出

每筆 UTXO 都有自己的金額與花費條件。交易引用它作為輸入時,必須把這筆輸出整筆花掉,不能只在原處削去需要的部分。輸入總額超過付款與費用後,剩餘價值通常會被建立成新的找零輸出,由錢包控制新的找零地址。

這和拿紙鈔付款有些相似:手上可能有多種面額,付同一筆款可以拿一張較大的鈔票,也可以拼出幾張小鈔。不過,比特幣多了一層資料成本。每加入一筆輸入,都要附上來源與滿足花費條件所需的資料;多建立一筆輸出,也會增加交易占用的空間。

錢包因而不能只找出「金額夠大」的組合。它還要估計選定輸入與預計輸出會形成多大的交易,再依費率算出費用。如果增加輸入讓交易變大,所需費用也會上升,原本剛好足夠的組合可能又變得不足。實際計算常要在選擇與估費之間反覆調整,直到整筆交易能成立。

輸入愈少,通常愈省,卻未必最合適

使用少量輸入往往能縮小交易,降低當下競爭區塊空間的成本。若錢包有一筆略高於目標的大型 UTXO,直接使用它可能很有效率。可是,這樣也會產生一筆較大的找零,並讓外界看見這筆輸入和新輸出同時出現在一筆公開交易裡。

另一個組合可能更接近付款加費用的目標,甚至不必建立找零,但它若要拼入多筆小輸出,當下費用可能較高。若剩餘差額小到不適合建立新輸出,部分錢包會把差額併入費用;若照樣建立很小的找零,未來動用它又可能增加另一筆交易的成本。

這表示「最便宜」也有時間範圍。某個選法能省下現在的輸入資料,卻可能留下未來較昂貴的零碎輸出;另一個選法現在多付一些資料成本,可能減少往後整理的負擔。錢包軟體會用不同演算法與估算方式衡量這些代價,沒有一套選法能在每種費率、輸出組合與使用目的下同時取得最佳結果。

公開鏈上,選擇也會留下關聯

多筆 UTXO 一起成為同一筆交易的輸入時,鏈上分析常把它們視為可能由同一方控制。這項共同輸入推測很有用,仍只是一種線索;多人協作交易等情況可能打破它。即使如此,把原本分散在不同來源或不同地址的輸出合併,通常會讓觀察者多得到一層可分析的關係。

有些錢包會替收款來源加上標籤,盡量避免把用途不同的輸出混在一起;有些軟體主要追求較低費用,或根本沒有足夠資訊判斷哪些來源應分開。若錢包不知道某筆收款和什麼現實活動有關,演算法也無法憑空保護那層脈絡。

因此,費用與隱私經常彼此拉扯。少用輸入可能節省空間,卻可能挑中不希望被連在一起的來源;刻意分開來源有助降低部分鏈上關聯,可用組合會變少,費用或找零也可能不理想。自動選幣的結果反映軟體的取捨,不代表網路替所有使用者規定了同一答案。

「餘額足夠」不保證所有組合都划算

當錢包累積許多小額 UTXO,畫面加總可能足以付款,實際花用卻需要大量輸入。費率較高時,加入這些輸入所增加的費用會吃掉一部分可用價值,所以軟體顯示的可花餘額可能低於單純相加的總額。

把零碎輸出預先合併,可以減少某次未來付款需要的輸入數量;合併本身仍是一筆占用空間的交易,也會公開連結那些來源。等待較低費率可能降低資料成本,未來費率卻無法保證。成本、時機與鏈上關聯依然要一起衡量。

部分錢包提供「硬幣控制」功能,讓使用者手動指定 UTXO、排除陌生小額收款或保留特定來源。這增加了可見度,也把判斷責任交回使用者;手動選擇若忽略找零、費率或來源關聯,同樣可能付出更高成本。自動與手動之間的差別,在於由誰承擔這組取捨,並不會消除取捨本身。

選幣是錢包政策,交易有效性是網路規則

比特幣協議沒有要求每個錢包採用同一套選幣演算法。錢包可以偏好較少輸入、接近目標的組合、特定標籤,或其他本機政策;只要最後形成的交易符合規則,全節點收到後關心的是輸入是否可花、簽章與金額是否有效。礦工是否把它放進區塊,還會受到費率與候選交易狀況影響。

公開交易會揭示最後使用了哪些輸入與輸出,卻不會列出錢包當時放棄過哪些候選組合,也不會直接說明演算法的目標。單看鏈上結果,可以分析成本與關聯,難以反推出使用者完整意圖。

所以,錢包按下送出以前,其實已替總餘額做了一次具體拆解:哪些舊輸出要結束、要建立多少找零、現在與未來各付出多少資料成本,以及哪些來源可能因此被連在一起。理解這一步,就能看出相同付款金額為何可能得到不同手續費,也能明白選幣沒有脫離費用與隱私而單獨存在的完美答案。