Bitcoind

有沒有辦法避免 sendtoaddress 被“掃描”?

  • June 19, 2021

我有一個錢包,其中有數百個小額資金位於多個地址。昨天我注意到,當向第三方發送相對較小的金額時,bitcoind“掃蕩”了其中大約 47 個作為vin金額並生成兩個vout目的地;一是第三方,二是錢包裡的新地址(找零地址)。

令我驚訝的是,它不是只組裝轉移所需的碎片數量(加上費用),而是將許多碎片掃到一起以產生比必要的變化轉移更大的數量。

給出一些細節但保持簡單:

  • sendtoaddress我通過 cli發起了一個。轉賬金額為 0.004 BTC
  • Bitcoind 使用了大約 47 個現有碎片作為 vin,產生了 0.08+ BTC 的總價值

除了手動生成原始交易(我可以這樣做,但當我可以避免它時我不喜歡這樣做,因為一個簡單的錯誤可能會導致無意中產生大量費用…… :))之外,還有什麼方法可以強制sendtoaddress執行只組裝所需的最小元件?

Bitcoin Core 的硬幣選擇算法在過去幾年中進行了多次改進。最新版本的比特幣核心 ( 0.17.0+ ) 將嘗試選擇一個不需要更改輸出的輸入集。如果你使用的是足夠新的比特幣核心版本,它應該會找到並更喜歡這樣的解決方案,如果可能的話。

這意味著要麼錢包的 UTXO 池沒有產生這樣的解決方案,要麼你的 Bitcoind 版本早於 0.17.0。在前一種情況下,您可能希望使用硬幣控製或createrawtransaction 回退到手動選擇來強制執行您的選擇要求,在後一種情況下,您可能需要更新並重試。

請注意,目前的困難時期對區塊空間的需求非常低,這將是一個以 1 sat/vB 的最小費率將您的“數百個小型”UTXO 中的一些合併到更大的 UTXO 的絕佳時機。如果您嘗試以低費率發送,從長遠來看,具有 47 個輸入的交易實際上可能會為您節省資金。

比特幣核心中的硬幣選擇算法很奇怪,很多其他使用者過去也遇到過類似的問題。範例:https ://github.com/bitcoin/bitcoin/issues/20598

開放的 PR 和最近合併的 PR 很少,這可能會改變一些事情,儘管我不確定,因為我沒有審查它們。

除了與費用相關的問題外,還可能存在一些與隱私相關的問題。範例:https ://lists.linuxfoundation.org/pipermail/bitcoin-dev/2021-May/019027.html

除了手動生成原始交易(我可以這樣做,但當我可以避免它時我不喜歡這樣做,因為一個簡單的錯誤可能會導致無意中產生大量費用…… :))之外,還有什麼方法可以強制 sendtoaddress只組裝所需的最小元件?

  1. 你應該使用最新的比特幣核心
  2. 盡可能避免使用硬幣選擇算法。
  3. 如果對每個事務使用 GUI,則手動選擇輸入
  4. 如果使用 CLI 並且不想手動添加輸入,至少在廣播之前檢查交易詳情:
bitcoin-cli createrawtransaction "[]" "{\"myaddress\":0.01}"
bitcoin-cli fundrawtransaction "rawtransactionhex"
bitcoin-cli signrawtransactionwithwallet "fundedtransactionhex"

bitcoin-cli decoderawtransaction "hexstring"

如果輸入看起來不錯:

bitcoin-cli sendrawtransaction "signedtransactionhex"

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