Transactions

什麼是硬幣選擇算法?

  • September 9, 2019

在標準客戶端中創建交易時,用於確定哪些未使用的輸出將用作輸入的算法是什麼?

自第一個版本以來,這是否發生了變化?替代客戶使用哪些不同的算法?

客戶是否嘗試根據最小化交易規模、產生的碎片或用作來源的代幣(價值/交易)的“年齡”來優化使用哪些“代幣”?

我找不到寫在任何地方的硬幣選擇的結果,只是從程式碼中拼湊完成。正如大衛所說,它可以工作,但這裡有更多細節。

用於轉移目標金額的硬幣選擇算法邏輯

  1. 如果您的任何UTXO ² 匹配目標¹,它將被使用。
  2. 如果“所有小於目標的 UTXO 的總和”恰好與目標匹配,則將使用它們。(如果你掃了一個完整的錢包,就是這種情況。)
  3. 如果“小於目標的所有 UTXO 的總和”沒有超過目標,則將使用大於目標的最小 UTXO。
  4. 否則,比特幣核心會隨機組合 1000 輪未使用的交易輸出,直到它們的總和大於或等於目標。如果它碰巧找到一個完全匹配的,它會提前停止並使用它。

否則,它最終會滿足於最小值

  • 大於目標的最小 UTXO
  • 它在第 4 步中發現的最小 UTXO 組合。

正如大衛所提到的,子集問題將首先限制在 UTXO 上,如果您自己發送至少有一個確認,或者如果從另一個錢包收到六個確認,然後如果找不到合適的 UTXO 集,則稍後在兩次進一步通過時放寬這些要求.


一些例子

Alice 有四個 UTXO:

• UTXO_A 0.1BTC

• UTXO_B 0.3BTC

• UTXO_C 0.5BTC

• UTXO_D 1BTC

為簡單起見,我將忽略交易費用。

範例 1:

Alice 想發送0.3BTC

比特幣核心發現 UTXO_B 與目標匹配,它只使用 UTXO_B 作為輸入。

範例 2:

Alice 想要發送0.4BTC

Bitcoin Core 發現UTXO_C 是大於Target 的最小UTXO,並且所有小於target(即UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4)的UTXO 之和與這裡的Target 匹配。UTXO_A 和 UTXO_B 都用作輸入。

範例 3:

Alice 想要發送0.45BTC

Bitcoin Core 發現UTXO_C 是大於Target 的最小UTXO,並且所有小於Target(即UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4)的UTXO 的總和不超過Target。UTXO_C 用作唯一輸入,是大於目標的下一個最小輸入。

範例 4:

Alice 想發送0.35BTC

Bitcoin Core 發現UTXO_C 是大於Target 的最小UTXO,並且所有小於Target 的UTXO 之和(即UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4)與Target 不匹配。它將隨機選擇的 UTXO 加起來 1000 次,直到它們超過目標,記住最小的足夠組合。然後將最小的足夠組合與大於目標的最小單個輸入進行比較。假設它確實在這裡找到了最佳組合UTXO_A + UTXO_B,它會找到Target < UTXO_A + UTXO_B < UTXO_C並使用 UTXO_A 和 UTXO_B 作為輸入。

範例 5:

Alice 想要發送0.6BTC

Bitcoin Core 發現UTXO_D 是大於Target 的最小UTXO,並且所有小於Target 的UTXO 之和(即UTXO_A + UTXO_B + UTXO_C = 0.1 + 0.3 + 0.5 = 0.9)與Target 不匹配。它像以前一樣開始嘗試隨機組合,在這種情況下可能會發現UTXO_A + UTXO_C = Target. 當它找到與目標匹配的組合時,它會中斷並立即使用該組合。UTXO_A 和 UTXO_C 用作輸入。


¹ “目標”在此用於表示要花費的金額。

² UTXO = 未使用的交易輸出

是的,這正是客戶所做的。它使用啟發式方法來解決這個問題,解決子集/總和或背包問題。

它使用多通道方法,首先嘗試僅使用至少有六次確認的硬幣。在接下來的兩遍中,它放寬了這些要求。在每次傳遞中,它嘗試最小化要求的交易輸出數量,然後是返回的更改量。

請注意,您錢包中的所有硬幣都被考慮在內。在比特幣客戶端使用的會計模型中,特定的幣不屬於特定的賬戶。

如果您想自己檢查程式碼,請搜尋SelectCoinsin wallet.cpp

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