什麼是硬幣選擇算法?
在標準客戶端中創建交易時,用於確定哪些未使用的輸出將用作輸入的算法是什麼?
自第一個版本以來,這是否發生了變化?替代客戶使用哪些不同的算法?
客戶是否嘗試根據最小化交易規模、產生的碎片或用作來源的代幣(價值/交易)的“年齡”來優化使用哪些“代幣”?
我找不到寫在任何地方的硬幣選擇的結果,只是從程式碼中拼湊完成。正如大衛所說,它可以工作,但這裡有更多細節。
用於轉移目標金額的硬幣選擇算法邏輯
- 如果您的任何UTXO ² 匹配目標¹,它將被使用。
- 如果“所有小於目標的 UTXO 的總和”恰好與目標匹配,則將使用它們。(如果你掃了一個完整的錢包,就是這種情況。)
- 如果“小於目標的所有 UTXO 的總和”沒有超過目標,則將使用大於目標的最小 UTXO。
- 否則,比特幣核心會隨機組合 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 = 未使用的交易輸出
是的,這正是客戶所做的。它使用啟發式方法來解決這個問題,解決子集/總和或背包問題。
它使用多通道方法,首先嘗試僅使用至少有六次確認的硬幣。在接下來的兩遍中,它放寬了這些要求。在每次傳遞中,它嘗試最小化要求的交易輸出數量,然後是返回的更改量。
請注意,您錢包中的所有硬幣都被考慮在內。在比特幣客戶端使用的會計模型中,特定的幣不屬於特定的賬戶。
如果您想自己檢查程式碼,請搜尋
SelectCoins
inwallet.cpp
。