fundrawtransaction - 它是什麼?
我在網上找到感興趣的文章。
如果沒有
fundrawtransaction
.
- bitcoin-cli listunspent [misconf=1] [max_number_confirmation=99999999] ‘’’["<wallet_address>"]’’'
- bitcoin-cli createrawtransaction ‘[{ “txid” : “<txid_of_selected_block>”, “vout” : }]’ ‘{"<recipient_address>": <amount_to_send>, “<sender_address>”: <amount_change>}’
- bitcoin-cli signrawtransaction <hex_createrawtransaction>
- 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 <A> 1.5
<A>
收件人地址在哪裡。它將自動確定要使用您的哪個 UTXO,並創建一個花費這些 UTXO 的交易,支付<A>
並創造變化,然後簽署結果,並在網路上廣播它。手動但仍在使用錢包
如果你想要更多的控制,你可以執行
sendtoaddress
正在做的事情,讓你觀察中間結果。您首先要做的是創建一個支付的原始交易,僅此
<A>
而已:bitcoin-cli createrawtransaction '[]' '[{"<A>": 1.5}]'
它將報告一個只有一個輸出而沒有輸入的十六進制原始部分交易。接下來,您要添加輸入並進行更改。您可以手動執行此操作(請參閱更多內容),但您可以讓錢包為您執行此操作。這是
fundrawtransaction
為了什麼。bitcoin-cli fundrawtransaction '"<output from CRT>"'
這將為您提供另一筆未簽名的原始交易,但現在包含輸入(足以覆蓋您嘗試發送的 1.5 BTC)和更改(減去 1.5 BTC 後剩餘的輸入,加上合理的費用)關於網路估計,以及簽署後交易規模的估計)。
然後你簽名,然後廣播。
bitcoin-cli signrawtransactionwithwallet '"<output from FRT>"' bitcoin-cli sendrawtransaction '"<output from SRTWW>"'
這種方法的優點是您可以在每個階段檢查中間結果(
decoderawtransaction
除其他外),或對流程進行許多更改。也許你有一個帶有另一個設備的多重簽名錢包——你需要通過那裡做另一個signrawtransactionwithwallet
(或其他設備/軟體用於處理原始交易的任何等效物)。全手動
如果您想要最大程度的控制,您可以手動完成所有操作 - 包括包含不屬於您自己錢包的輸入的能力。這是您在問題中給出的範例,但是如果您打算這樣做,那麼最好使用前兩種方法之一*。*
正如您所指出的,您首先需要收集可以使用的 UTXO 列表。這可以通過 來完成
listunspent
,但您也可以包含其他 UTXO - 例如,如果您參與CoinJoin交易,則包括來自其他人的 UTXO。bitcoin-cli listunspent
然後你必須建構(完整的)原始交易,包括你想從以前使用的輸入、給接收者的輸出,以及返回給你自己的更改輸出。如果您希望該零錢進入您自己的錢包,您可以使用
getrawchangeaddress
(類似於getnewaddress
,但會將其輸出視為零錢而不是收款)。您還需要在簽名後手動估計交易的 vsize,確定要使用的費用(區塊空間市場根據每個 vsize 的費用優先交易),並從您正在創建的更改中減去該費用。這是一堆工作,很容易犯錯誤。接下來,您需要簽署交易。如果您在自己的錢包中有私鑰,則可以
signrawtransactionwithwallet
像以前一樣使用(請注意,signrawtransaction
您的範例中不再存在;它已被拆分為signrawtransactionwithkey
andsignrawtransactionwithwallet
)。如果沒有,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 簽名和硬體錢包的其他操作。- 再次,
finalizepsbt
和sendrawtransaction
以前一樣。PSBT 有更多實用功能,例如
combinepsbt
(主要用於多重簽名)、joinpsbts
(用於進行類似 CoinJoin 的操作),decodepsbt
它們analyzepsbt
可以告訴您下一步該做什麼,utxoupdatepsbt
從 UTXO 集中收集資訊並將其添加到 PSBT 文件中(即使不涉及您的比特幣核心錢包也可以使用)等。TL; 博士
您可以使用帶有或不帶有
fundrawtransaction
. 如果你不使用它,你有更多的手動控制,並且不會被迫使用比特幣核心錢包本身。