Bitcoin-Core

硬幣選擇算法

  • July 31, 2019

玩弄比特幣核心客戶端 v0.18.0,我使用了這個命令:

$ bitcoin-cli sendtoaddress "mozazucvLK179u41bF5Vd2Agp4wsm7HsPo" 0.1

這創造了 這個交易

我注意到創建的交易消耗了三個輸入,即使有確切數量的 UTXO 可用。

在尋找 UTXO 選擇算法時,我遇到了Bound Coin Selection Algorithm,但我對程式碼庫並不是很熟悉。

這是客戶使用的唯一硬幣選擇算法嗎?有人可以解釋它是如何工作的嗎?

選擇硬幣時需要考慮很多事情。僅僅支付您想要發送的金額是不夠的,您還沒有考慮您將為交易支付的交易費用。因此,即使您擁有價值 0.1 BTC 的 UTXO,但僅使用其中之一意味著您在交易中將沒有足夠的價值來支付交易費用,因此您的交易不會被轉發或確認。

因此,如果您必須超過目標值,現在您需要更改輸出。但即使在這裡,你也必須小心。如果你選擇的比特幣剛好足以支付匯出金額和交易費用,你最終可能會產生非常小的零錢輸出,這將被視為塵埃。灰塵輸出不好,因為它們花費不經濟,即它們的交易費用比它們的價值高。


Bitcoin Core 針對不同的情況使用了兩種不同的選幣算法,它們有不同的目標值。

第一個(您找到的那個)稱為分支和綁定。它試圖完全匹配交易所需的金額(支出金額 + 交易費用)並且不產生變化。有一個小的緩衝區允許算法選擇比必要的多一點的硬幣,以便更好地匹配並避免產生找零輸出。

這個緩衝區的總體構想是,如果您願意創建變更輸出並且必須在未來消耗花費該輸出的成本,那麼您現在願意承擔該成本並且根本不產生變更輸出。只要選擇的額外金額小於未來花費找零輸出的預計成本,現在就值得將這筆金額作為額外的交易費用燒掉,而不是產生找零輸出。使用者的成本最多相同,而且更可能更少。

一般來說,這將產生較小的交易,因此由於避免了更改輸出而支付的費用較少。它還有助於保護隱私,因為連結回您的錢包沒有任何變化。

如果分支定界精確匹配器失敗並且它必須產生變化輸出,那麼比特幣核心將回退到其原始算法。這個原始算法在很大程度上也是一個精確匹配器,它只是有一堆隨機修復和黑客,用於修復各種問題。在較高級別,它隨機選擇硬幣。

這個回退算法的一個重要部分是,因為它必須創建一個更改輸出,它選擇以最小更改量為目標,以避免我之前提到的灰塵問題。比特幣核心預設最小找零金額為 0.01 比特幣。當然,當錢包中沒有足夠的硬幣時,也有例外。


所以這裡發生的事情是你沒有正確價值的硬幣來完全匹配 0.01 BTC + 交易費用,所以分支定界算法失敗了。它回退到回退算法,現在的目標是 0.01 BTC(流出)+ 0.01(最小變化)+ 交易費用。備份算法能夠為此目標值選擇硬幣,因此您可以獲得您擁有的交易。

引用自:https://bitcoin.stackexchange.com/questions/89489