Bitcoin-Core

fundrawtransaction - 它是什麼?

  • May 10, 2021

我在網上找到感興趣的文章

如果沒有fundrawtransaction.

  1. bitcoin-cli listunspent [misconf=1] [max_number_confirmation=99999999] ‘’’["<wallet_address>"]’’'
  2. bitcoin-cli createrawtransaction ‘[{ “txid” : “<txid_of_selected_block>”, “vout” : }]’ ‘{"<recipient_address>": <amount_to_send>, “<sender_address>”: <amount_change>}’
  3. bitcoin-cli signrawtransaction <hex_createrawtransaction>
  4. bitcoin-cli sendrawtransaction <hex_signrawtransaction>

僅此而已fundrawtransaction

我不明白為什麼fundrawtransaction需要?“有”和“沒有”有什麼區別?

我是新手,我不確定我是否正確理解輸入和輸出的含義,可能所以我無法理解是什麼意思fundrawtransaction

拜託,更多的例子和更簡單的演講。謝謝。

先簡單介紹一下背景:比特幣使用所謂的 UTXO 模型。你擁有 UTXO(或“硬幣”,打個比方)。每枚硬幣都有一個價值(可以是任意數量的 satoshis),並且有一個所有者(腳本)“印”在其中。每筆交易都會“融化”一些現有的代幣,並“鍛造”新的代幣。新硬幣的價值不能超過熔化硬幣的價值。融化的金額和偽造的金額之間的差額就是交易的費用。

這意味著該協議真的沒有“平衡”的概念。只有硬幣。您的錢包中可以有 3 BTC,包括 1 BTC 硬幣 X 和 2 BTC 硬幣 Y。這些可以用相同的腳本(地址)或不加蓋。這並不重要——一個錢包可以包含許多地址。

假設您想向給您地址 A 的其他人支付 1.5 BTC。您的最終目標是創建一個消耗 2 BTC 硬幣的交易,並產生 1.5 BTC 硬幣(給收款人)和 0.5 BTC 硬幣(減去費用)回到您自己錢包的新地址(稱為找零地址)。也可以同時消耗 1 BTC 和 2 BTC 硬幣,並輸出 2 倍 1.5 BTC 硬幣。讓我們假設這就是你正在做的事情。

你會如何使用比特幣核心 RPC 來做到這一點?有很多方法:

最自動的方式

如果您使用的是比特幣核心的內置錢包(即比特幣核心錢包是創建相關地址的工具,它管理您的硬幣),您可以讓它做任何事情。做就是了:

bitcoin-cli sendtoaddress &lt;A&gt; 1.5

&lt;A&gt;收件人地址在哪裡。它將自動確定要使用您的哪個 UTXO,並創建一個花費這些 UTXO 的交易,支付&lt;A&gt;並創造變化,然後簽署結果,並在網路上廣播它。

手動但仍在使用錢包

如果你想要更多的控制,你可以執行sendtoaddress正在做的事情,讓你觀察中間結果。

您首先要做的是創建一個支付的原始交易,僅此&lt;A&gt;而已:

bitcoin-cli createrawtransaction '[]' '[{"&lt;A&gt;": 1.5}]'

它將報告一個只有一個輸出而沒有輸入的十六進制原始部分交易。接下來,您要添加輸入並進行更改。您可以手動執行此操作(請參閱更多內容),但您可以讓錢包為您執行此操作。這是fundrawtransaction為了什麼。

bitcoin-cli fundrawtransaction '"&lt;output from CRT&gt;"'

這將為您提供另一筆未簽名的原始交易,但現在包含輸入(足以覆蓋您嘗試發送的 1.5 BTC)和更改(減去 1.5 BTC 後剩餘的輸入,加上合理的費用)關於網路估計,以及簽署後交易規模的估計)。

然後你簽名,然後廣播。

bitcoin-cli signrawtransactionwithwallet '"&lt;output from FRT&gt;"'
bitcoin-cli sendrawtransaction '"&lt;output from SRTWW&gt;"'

這種方法的優點是您可以在每個階段檢查中間結果(decoderawtransaction除其他外),或對流程進行許多更改。也許你有一個帶有另一個設備的多重簽名錢包——你需要通過那裡做另一個signrawtransactionwithwallet(或其他設備/軟體用於處理原始交易的任何等效物)。

全手動

如果您想要最大程度的控制,您可以手動完成所有操作 - 包括包含不屬於您自己錢包的輸入的能力。這是您在問題中給出的範例,但是如果您打算這樣做,那麼最好使用前兩種方法之一*。*

正如您所指出的,您首先需要收集可以使用的 UTXO 列表。這可以通過 來完成listunspent,但您也可以包含其他 UTXO - 例如,如果您參與CoinJoin交易,則包括來自其他人的 UTXO。

bitcoin-cli listunspent

然後你必須建構(完整的)原始交易,包括你想從以前使用的輸入、給接收者的輸出,以及返回給你自己的更改輸出。如果您希望該零錢進入您自己的錢包,您可以使用getrawchangeaddress(類似於getnewaddress,但會將其輸出視為零錢而不是收款)。您還需要在簽名後手動估計交易的 vsize,確定要使用的費用(區塊空間市場根據每個 vsize 的費用優先交易),並從您正在創建的更改中減去該費用。這是一堆工作,很容易犯錯誤。

接下來,您需要簽署交易。如果您在自己的錢包中有私鑰,則可以signrawtransactionwithwallet像以前一樣使用(請注意,signrawtransaction您的範例中不再存在;它已被拆分為signrawtransactionwithkeyand signrawtransactionwithwallet)。如果沒有,signrawtransactionwithkey如果你有私鑰,你可以使用,或者你可以將原始交易轉移到其他設備/人,並在那裡簽名。

最後你會sendrawtransaction像以前一樣使用。

使用 PSBT

在這一點上,我需要指出,所有基於原始事務的事務 API 都已被基於PSBT的 RPC 取代(參見BIP 174)。如果您嘗試使用上面的 RPC,您會發現它們實際上只適用於簡單的腳本,並且您需要在各處傳遞大量資訊。特別是,signrawtransactionwithkey將再次需要有關 UTXO 的資訊,其中使用的腳本,它們是什麼類型的腳本。這很痛苦,而且很容易搞砸。

PSBT 是一種交換格式,用於傳輸/儲存部分簽名的交易,以及簽名者或其他參與者可能需要能夠簽名的任何資訊。它將傳達 UTXO、腳本資訊、關於其中的鍵的資訊,……

相當於“手動但仍使用錢包”將是:

  • walletcreatefundedpsbt而不是createrawtransaction+fundrawtransaction
  • walletprocesspsbt代替signrawtransactionwithwallet
  • finalizepsbt將完全簽名的 PSBT 轉換為原始交易
  • sendrawtransaction像以前一樣廣播結果。

“完全手動”的等價物是:

  • createpsbt代替createrawtransaction
  • walletprocesspsbt而不是signrawtransactionwithwallet. 目前沒有類似的signrawtransactionwithkey,但 PSBT 受到各種其他軟體的支持(最值得注意的是,HWI允許 PSBT 簽名和硬體錢包的其他操作。
  • 再次,finalizepsbtsendrawtransaction以前一樣。

PSBT 有更多實用功能,例如combinepsbt(主要用於多重簽名)、joinpsbts(用於進行類似 CoinJoin 的操作),decodepsbt它們analyzepsbt可以告訴您下一步該做什麼,utxoupdatepsbt從 UTXO 集中收集資訊並將其添加到 PSBT 文件中(即使不涉及您的比特幣核心錢包也可以使用)等。

TL; 博士

您可以使用帶有或不帶有fundrawtransaction. 如果你不使用它,你有更多的手動控制,並且不會被迫使用比特幣核心錢包本身。

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