Bitcoin Core 28.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
rawtransaction.cpp
Go to the documentation of this file.
1// Copyright (c) 2010 Satoshi Nakamoto
2// Copyright (c) 2009-2022 The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#include <base58.h>
7#include <chain.h>
8#include <coins.h>
9#include <consensus/amount.h>
11#include <core_io.h>
12#include <index/txindex.h>
13#include <key_io.h>
14#include <node/blockstorage.h>
15#include <node/coin.h>
16#include <node/context.h>
17#include <node/psbt.h>
18#include <node/transaction.h>
19#include <node/types.h>
20#include <policy/packages.h>
21#include <policy/policy.h>
22#include <policy/rbf.h>
24#include <psbt.h>
25#include <random.h>
26#include <rpc/blockchain.h>
28#include <rpc/server.h>
29#include <rpc/server_util.h>
30#include <rpc/util.h>
31#include <script/script.h>
32#include <script/sign.h>
34#include <script/solver.h>
35#include <uint256.h>
36#include <undo.h>
37#include <util/bip32.h>
38#include <util/check.h>
39#include <util/strencodings.h>
40#include <util/string.h>
41#include <util/vector.h>
42#include <validation.h>
43#include <validationinterface.h>
44
45#include <numeric>
46#include <stdint.h>
47
48#include <univalue.h>
49
51using node::FindCoins;
55
56static void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry,
57 Chainstate& active_chainstate, const CTxUndo* txundo = nullptr,
59{
61 // Call into TxToUniv() in bitcoin-common to decode the transaction hex.
62 //
63 // Blockchain contextual information (confirmations and blocktime) is not
64 // available to code in bitcoin-common, so we query them here and push the
65 // data into the returned UniValue.
66 TxToUniv(tx, /*block_hash=*/uint256(), entry, /*include_hex=*/true, txundo, verbosity);
67
68 if (!hashBlock.IsNull()) {
70
71 entry.pushKV("blockhash", hashBlock.GetHex());
72 const CBlockIndex* pindex = active_chainstate.m_blockman.LookupBlockIndex(hashBlock);
73 if (pindex) {
74 if (active_chainstate.m_chain.Contains(pindex)) {
75 entry.pushKV("confirmations", 1 + active_chainstate.m_chain.Height() - pindex->nHeight);
76 entry.pushKV("time", pindex->GetBlockTime());
77 entry.pushKV("blocktime", pindex->GetBlockTime());
78 }
79 else
80 entry.pushKV("confirmations", 0);
81 }
82 }
83}
84
85static std::vector<RPCResult> ScriptPubKeyDoc() {
86 return
87 {
88 {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
89 {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
90 {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
91 {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
92 {RPCResult::Type::STR, "type", "The type (one of: " + GetAllOutputTypes() + ")"},
93 };
94}
95
96static std::vector<RPCResult> DecodeTxDoc(const std::string& txid_field_doc)
97{
98 return {
99 {RPCResult::Type::STR_HEX, "txid", txid_field_doc},
100 {RPCResult::Type::STR_HEX, "hash", "The transaction hash (differs from txid for witness transactions)"},
101 {RPCResult::Type::NUM, "size", "The serialized transaction size"},
102 {RPCResult::Type::NUM, "vsize", "The virtual transaction size (differs from size for witness transactions)"},
103 {RPCResult::Type::NUM, "weight", "The transaction's weight (between vsize*4-3 and vsize*4)"},
104 {RPCResult::Type::NUM, "version", "The version"},
105 {RPCResult::Type::NUM_TIME, "locktime", "The lock time"},
106 {RPCResult::Type::ARR, "vin", "",
107 {
108 {RPCResult::Type::OBJ, "", "",
109 {
110 {RPCResult::Type::STR_HEX, "coinbase", /*optional=*/true, "The coinbase value (only if coinbase transaction)"},
111 {RPCResult::Type::STR_HEX, "txid", /*optional=*/true, "The transaction id (if not coinbase transaction)"},
112 {RPCResult::Type::NUM, "vout", /*optional=*/true, "The output number (if not coinbase transaction)"},
113 {RPCResult::Type::OBJ, "scriptSig", /*optional=*/true, "The script (if not coinbase transaction)",
114 {
115 {RPCResult::Type::STR, "asm", "Disassembly of the signature script"},
116 {RPCResult::Type::STR_HEX, "hex", "The raw signature script bytes, hex-encoded"},
117 }},
118 {RPCResult::Type::ARR, "txinwitness", /*optional=*/true, "",
119 {
120 {RPCResult::Type::STR_HEX, "hex", "hex-encoded witness data (if any)"},
121 }},
122 {RPCResult::Type::NUM, "sequence", "The script sequence number"},
123 }},
124 }},
125 {RPCResult::Type::ARR, "vout", "",
126 {
127 {RPCResult::Type::OBJ, "", "",
128 {
129 {RPCResult::Type::STR_AMOUNT, "value", "The value in " + CURRENCY_UNIT},
130 {RPCResult::Type::NUM, "n", "index"},
131 {RPCResult::Type::OBJ, "scriptPubKey", "", ScriptPubKeyDoc()},
132 }},
133 }},
134 };
135}
136
137static std::vector<RPCArg> CreateTxDoc()
138{
139 return {
140 {"inputs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The inputs",
141 {
143 {
144 {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
145 {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
146 {"sequence", RPCArg::Type::NUM, RPCArg::DefaultHint{"depends on the value of the 'replaceable' and 'locktime' arguments"}, "The sequence number"},
147 },
148 },
149 },
150 },
151 {"outputs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The outputs specified as key-value pairs.\n"
152 "Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n"
153 "At least one output of either type must be specified.\n"
154 "For compatibility reasons, a dictionary, which holds the key-value pairs directly, is also\n"
155 " accepted as second parameter.",
156 {
158 {
159 {"address", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "A key-value pair. The key (string) is the bitcoin address, the value (float or string) is the amount in " + CURRENCY_UNIT},
160 },
161 },
163 {
164 {"data", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "A key-value pair. The key must be \"data\", the value is hex-encoded data"},
165 },
166 },
167 },
168 RPCArgOptions{.skip_type_check = true}},
169 {"locktime", RPCArg::Type::NUM, RPCArg::Default{0}, "Raw locktime. Non-0 value also locktime-activates inputs"},
170 {"replaceable", RPCArg::Type::BOOL, RPCArg::Default{true}, "Marks this transaction as BIP125-replaceable.\n"
171 "Allows this transaction to be replaced by a transaction with higher fees. If provided, it is an error if explicit sequence numbers are incompatible."},
172 };
173}
174
175// Update PSBT with information from the mempool, the UTXO set, the txindex, and the provided descriptors.
176// Optionally, sign the inputs that we can using information from the descriptors.
177PartiallySignedTransaction ProcessPSBT(const std::string& psbt_string, const std::any& context, const HidingSigningProvider& provider, int sighash_type, bool finalize)
178{
179 // Unserialize the transactions
181 std::string error;
182 if (!DecodeBase64PSBT(psbtx, psbt_string, error)) {
183 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
184 }
185
186 if (g_txindex) g_txindex->BlockUntilSyncedToCurrentChain();
187 const NodeContext& node = EnsureAnyNodeContext(context);
188
189 // If we can't find the corresponding full transaction for all of our inputs,
190 // this will be used to find just the utxos for the segwit inputs for which
191 // the full transaction isn't found
192 std::map<COutPoint, Coin> coins;
193
194 // Fetch previous transactions:
195 // First, look in the txindex and the mempool
196 for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
197 PSBTInput& psbt_input = psbtx.inputs.at(i);
198 const CTxIn& tx_in = psbtx.tx->vin.at(i);
199
200 // The `non_witness_utxo` is the whole previous transaction
201 if (psbt_input.non_witness_utxo) continue;
202
204
205 // Look in the txindex
206 if (g_txindex) {
207 uint256 block_hash;
208 g_txindex->FindTx(tx_in.prevout.hash, block_hash, tx);
209 }
210 // If we still don't have it look in the mempool
211 if (!tx) {
212 tx = node.mempool->get(tx_in.prevout.hash);
213 }
214 if (tx) {
215 psbt_input.non_witness_utxo = tx;
216 } else {
217 coins[tx_in.prevout]; // Create empty map entry keyed by prevout
218 }
219 }
220
221 // If we still haven't found all of the inputs, look for the missing ones in the utxo set
222 if (!coins.empty()) {
223 FindCoins(node, coins);
224 for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
225 PSBTInput& input = psbtx.inputs.at(i);
226
227 // If there are still missing utxos, add them if they were found in the utxo set
228 if (!input.non_witness_utxo) {
229 const CTxIn& tx_in = psbtx.tx->vin.at(i);
230 const Coin& coin = coins.at(tx_in.prevout);
231 if (!coin.out.IsNull() && IsSegWitOutput(provider, coin.out.scriptPubKey)) {
232 input.witness_utxo = coin.out;
233 }
234 }
235 }
236 }
237
238 const PrecomputedTransactionData& txdata = PrecomputePSBTData(psbtx);
239
240 for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
241 if (PSBTInputSigned(psbtx.inputs.at(i))) {
242 continue;
243 }
244
245 // Update script/keypath information using descriptor data.
246 // Note that SignPSBTInput does a lot more than just constructing ECDSA signatures.
247 // We only actually care about those if our signing provider doesn't hide private
248 // information, as is the case with `descriptorprocesspsbt`
249 SignPSBTInput(provider, psbtx, /*index=*/i, &txdata, sighash_type, /*out_sigdata=*/nullptr, finalize);
250 }
251
252 // Update script/keypath information using descriptor data.
253 for (unsigned int i = 0; i < psbtx.tx->vout.size(); ++i) {
254 UpdatePSBTOutput(provider, psbtx, i);
255 }
256
257 RemoveUnnecessaryTransactions(psbtx, /*sighash_type=*/1);
258
259 return psbtx;
260}
261
263{
264 return RPCHelpMan{
265 "getrawtransaction",
266
267 "By default, this call only returns a transaction if it is in the mempool. If -txindex is enabled\n"
268 "and no blockhash argument is passed, it will return the transaction if it is in the mempool or any block.\n"
269 "If a blockhash argument is passed, it will return the transaction if\n"
270 "the specified block is available and the transaction is in that block.\n\n"
271 "Hint: Use gettransaction for wallet transactions.\n\n"
272
273 "If verbosity is 0 or omitted, returns the serialized transaction as a hex-encoded string.\n"
274 "If verbosity is 1, returns a JSON Object with information about the transaction.\n"
275 "If verbosity is 2, returns a JSON Object with information about the transaction, including fee and prevout information.",
276 {
277 {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
278 {"verbosity|verbose", RPCArg::Type::NUM, RPCArg::Default{0}, "0 for hex-encoded data, 1 for a JSON object, and 2 for JSON object with fee and prevout",
279 RPCArgOptions{.skip_type_check = true}},
280 {"blockhash", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The block in which to look for the transaction"},
281 },
282 {
283 RPCResult{"if verbosity is not set or set to 0",
284 RPCResult::Type::STR, "data", "The serialized transaction as a hex-encoded string for 'txid'"
285 },
286 RPCResult{"if verbosity is set to 1",
287 RPCResult::Type::OBJ, "", "",
289 {
290 {RPCResult::Type::BOOL, "in_active_chain", /*optional=*/true, "Whether specified block is in the active chain or not (only present with explicit \"blockhash\" argument)"},
291 {RPCResult::Type::STR_HEX, "blockhash", /*optional=*/true, "the block hash"},
292 {RPCResult::Type::NUM, "confirmations", /*optional=*/true, "The confirmations"},
293 {RPCResult::Type::NUM_TIME, "blocktime", /*optional=*/true, "The block time expressed in " + UNIX_EPOCH_TIME},
294 {RPCResult::Type::NUM, "time", /*optional=*/true, "Same as \"blocktime\""},
295 {RPCResult::Type::STR_HEX, "hex", "The serialized, hex-encoded data for 'txid'"},
296 },
297 DecodeTxDoc(/*txid_field_doc=*/"The transaction id (same as provided)")),
298 },
299 RPCResult{"for verbosity = 2",
300 RPCResult::Type::OBJ, "", "",
301 {
302 {RPCResult::Type::ELISION, "", "Same output as verbosity = 1"},
303 {RPCResult::Type::NUM, "fee", /*optional=*/true, "transaction fee in " + CURRENCY_UNIT + ", omitted if block undo data is not available"},
304 {RPCResult::Type::ARR, "vin", "",
305 {
306 {RPCResult::Type::OBJ, "", "utxo being spent",
307 {
308 {RPCResult::Type::ELISION, "", "Same output as verbosity = 1"},
309 {RPCResult::Type::OBJ, "prevout", /*optional=*/true, "The previous output, omitted if block undo data is not available",
310 {
311 {RPCResult::Type::BOOL, "generated", "Coinbase or not"},
312 {RPCResult::Type::NUM, "height", "The height of the prevout"},
313 {RPCResult::Type::STR_AMOUNT, "value", "The value in " + CURRENCY_UNIT},
314 {RPCResult::Type::OBJ, "scriptPubKey", "", ScriptPubKeyDoc()},
315 }},
316 }},
317 }},
318 }},
319 },
321 HelpExampleCli("getrawtransaction", "\"mytxid\"")
322 + HelpExampleCli("getrawtransaction", "\"mytxid\" 1")
323 + HelpExampleRpc("getrawtransaction", "\"mytxid\", 1")
324 + HelpExampleCli("getrawtransaction", "\"mytxid\" 0 \"myblockhash\"")
325 + HelpExampleCli("getrawtransaction", "\"mytxid\" 1 \"myblockhash\"")
326 + HelpExampleCli("getrawtransaction", "\"mytxid\" 2 \"myblockhash\"")
327 },
328 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
329{
330 const NodeContext& node = EnsureAnyNodeContext(request.context);
332
333 uint256 hash = ParseHashV(request.params[0], "parameter 1");
334 const CBlockIndex* blockindex = nullptr;
335
336 if (hash == chainman.GetParams().GenesisBlock().hashMerkleRoot) {
337 // Special exception for the genesis block coinbase transaction
338 throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "The genesis block coinbase is not considered an ordinary transaction and cannot be retrieved");
339 }
340
341 // Accept either a bool (true) or a num (>=0) to indicate verbosity.
342 int verbosity{0};
343 if (!request.params[1].isNull()) {
344 if (request.params[1].isBool()) {
345 verbosity = request.params[1].get_bool();
346 } else {
347 verbosity = request.params[1].getInt<int>();
348 }
349 }
350
351 if (!request.params[2].isNull()) {
352 LOCK(cs_main);
353
354 uint256 blockhash = ParseHashV(request.params[2], "parameter 3");
355 blockindex = chainman.m_blockman.LookupBlockIndex(blockhash);
356 if (!blockindex) {
357 throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block hash not found");
358 }
359 }
360
361 bool f_txindex_ready = false;
362 if (g_txindex && !blockindex) {
363 f_txindex_ready = g_txindex->BlockUntilSyncedToCurrentChain();
364 }
365
366 uint256 hash_block;
367 const CTransactionRef tx = GetTransaction(blockindex, node.mempool.get(), hash, hash_block, chainman.m_blockman);
368 if (!tx) {
369 std::string errmsg;
370 if (blockindex) {
371 const bool block_has_data = WITH_LOCK(::cs_main, return blockindex->nStatus & BLOCK_HAVE_DATA);
372 if (!block_has_data) {
373 throw JSONRPCError(RPC_MISC_ERROR, "Block not available");
374 }
375 errmsg = "No such transaction found in the provided block";
376 } else if (!g_txindex) {
377 errmsg = "No such mempool transaction. Use -txindex or provide a block hash to enable blockchain transaction queries";
378 } else if (!f_txindex_ready) {
379 errmsg = "No such mempool transaction. Blockchain transactions are still in the process of being indexed";
380 } else {
381 errmsg = "No such mempool or blockchain transaction";
382 }
383 throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, errmsg + ". Use gettransaction for wallet transactions.");
384 }
385
386 if (verbosity <= 0) {
387 return EncodeHexTx(*tx);
388 }
389
390 UniValue result(UniValue::VOBJ);
391 if (blockindex) {
392 LOCK(cs_main);
393 result.pushKV("in_active_chain", chainman.ActiveChain().Contains(blockindex));
394 }
395 // If request is verbosity >= 1 but no blockhash was given, then look up the blockindex
396 if (request.params[2].isNull()) {
397 LOCK(cs_main);
398 blockindex = chainman.m_blockman.LookupBlockIndex(hash_block); // May be nullptr for mempool transactions
399 }
400 if (verbosity == 1) {
401 TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
402 return result;
403 }
404
405 CBlockUndo blockUndo;
406 CBlock block;
407
408 if (tx->IsCoinBase() || !blockindex || WITH_LOCK(::cs_main, return chainman.m_blockman.IsBlockPruned(*blockindex)) ||
409 !(chainman.m_blockman.UndoReadFromDisk(blockUndo, *blockindex) && chainman.m_blockman.ReadBlockFromDisk(block, *blockindex))) {
410 TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
411 return result;
412 }
413
414 CTxUndo* undoTX {nullptr};
415 auto it = std::find_if(block.vtx.begin(), block.vtx.end(), [tx](CTransactionRef t){ return *t == *tx; });
416 if (it != block.vtx.end()) {
417 // -1 as blockundo does not have coinbase tx
418 undoTX = &blockUndo.vtxundo.at(it - block.vtx.begin() - 1);
419 }
420 TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate(), undoTX, TxVerbosity::SHOW_DETAILS_AND_PREVOUT);
421 return result;
422},
423 };
424}
425
427{
428 return RPCHelpMan{"createrawtransaction",
429 "\nCreate a transaction spending the given inputs and creating new outputs.\n"
430 "Outputs can be addresses or data.\n"
431 "Returns hex-encoded raw transaction.\n"
432 "Note that the transaction's inputs are not signed, and\n"
433 "it is not stored in the wallet or transmitted to the network.\n",
434 CreateTxDoc(),
435 RPCResult{
436 RPCResult::Type::STR_HEX, "transaction", "hex string of the transaction"
437 },
439 HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"address\\\":0.01}]\"")
440 + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
441 + HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"[{\\\"address\\\":0.01}]\"")
442 + HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
443 },
444 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
445{
446 std::optional<bool> rbf;
447 if (!request.params[3].isNull()) {
448 rbf = request.params[3].get_bool();
449 }
450 CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf);
451
452 return EncodeHexTx(CTransaction(rawTx));
453},
454 };
455}
456
458{
459 return RPCHelpMan{"decoderawtransaction",
460 "Return a JSON object representing the serialized, hex-encoded transaction.",
461 {
462 {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction hex string"},
463 {"iswitness", RPCArg::Type::BOOL, RPCArg::DefaultHint{"depends on heuristic tests"}, "Whether the transaction hex is a serialized witness transaction.\n"
464 "If iswitness is not present, heuristic tests will be used in decoding.\n"
465 "If true, only witness deserialization will be tried.\n"
466 "If false, only non-witness deserialization will be tried.\n"
467 "This boolean should reflect whether the transaction has inputs\n"
468 "(e.g. fully valid, or on-chain transactions), if known by the caller."
469 },
470 },
471 RPCResult{
472 RPCResult::Type::OBJ, "", "",
473 DecodeTxDoc(/*txid_field_doc=*/"The transaction id"),
474 },
476 HelpExampleCli("decoderawtransaction", "\"hexstring\"")
477 + HelpExampleRpc("decoderawtransaction", "\"hexstring\"")
478 },
479 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
480{
482
483 bool try_witness = request.params[1].isNull() ? true : request.params[1].get_bool();
484 bool try_no_witness = request.params[1].isNull() ? true : !request.params[1].get_bool();
485
486 if (!DecodeHexTx(mtx, request.params[0].get_str(), try_no_witness, try_witness)) {
487 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
488 }
489
490 UniValue result(UniValue::VOBJ);
491 TxToUniv(CTransaction(std::move(mtx)), /*block_hash=*/uint256(), /*entry=*/result, /*include_hex=*/false);
492
493 return result;
494},
495 };
496}
497
499{
500 return RPCHelpMan{
501 "decodescript",
502 "\nDecode a hex-encoded script.\n",
503 {
504 {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "the hex-encoded script"},
505 },
506 RPCResult{
507 RPCResult::Type::OBJ, "", "",
508 {
509 {RPCResult::Type::STR, "asm", "Disassembly of the script"},
510 {RPCResult::Type::STR, "desc", "Inferred descriptor for the script"},
511 {RPCResult::Type::STR, "type", "The output type (e.g. " + GetAllOutputTypes() + ")"},
512 {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
513 {RPCResult::Type::STR, "p2sh", /*optional=*/true,
514 "address of P2SH script wrapping this redeem script (not returned for types that should not be wrapped)"},
515 {RPCResult::Type::OBJ, "segwit", /*optional=*/true,
516 "Result of a witness output script wrapping this redeem script (not returned for types that should not be wrapped)",
517 {
518 {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
519 {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
520 {RPCResult::Type::STR, "type", "The type of the output script (e.g. witness_v0_keyhash or witness_v0_scripthash)"},
521 {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
522 {RPCResult::Type::STR, "desc", "Inferred descriptor for the script"},
523 {RPCResult::Type::STR, "p2sh-segwit", "address of the P2SH script wrapping this witness redeem script"},
524 }},
525 },
526 },
528 HelpExampleCli("decodescript", "\"hexstring\"")
529 + HelpExampleRpc("decodescript", "\"hexstring\"")
530 },
531 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
532{
535 if (request.params[0].get_str().size() > 0){
536 std::vector<unsigned char> scriptData(ParseHexV(request.params[0], "argument"));
537 script = CScript(scriptData.begin(), scriptData.end());
538 } else {
539 // Empty scripts are valid
540 }
541 ScriptToUniv(script, /*out=*/r, /*include_hex=*/false, /*include_address=*/true);
542
543 std::vector<std::vector<unsigned char>> solutions_data;
544 const TxoutType which_type{Solver(script, solutions_data)};
545
546 const bool can_wrap{[&] {
547 switch (which_type) {
554 // Can be wrapped if the checks below pass
555 break;
561 // Should not be wrapped
562 return false;
563 } // no default case, so the compiler can warn about missing cases
564 if (!script.HasValidOps() || script.IsUnspendable()) {
565 return false;
566 }
567 for (CScript::const_iterator it{script.begin()}; it != script.end();) {
568 opcodetype op;
569 CHECK_NONFATAL(script.GetOp(it, op));
570 if (op == OP_CHECKSIGADD || IsOpSuccess(op)) {
571 return false;
572 }
573 }
574 return true;
575 }()};
576
577 if (can_wrap) {
579 // P2SH and witness programs cannot be wrapped in P2WSH, if this script
580 // is a witness program, don't return addresses for a segwit programs.
581 const bool can_wrap_P2WSH{[&] {
582 switch (which_type) {
585 // Uncompressed pubkeys cannot be used with segwit checksigs.
586 // If the script contains an uncompressed pubkey, skip encoding of a segwit program.
587 for (const auto& solution : solutions_data) {
588 if ((solution.size() != 1) && !CPubKey(solution).IsCompressed()) {
589 return false;
590 }
591 }
592 return true;
595 // Can be P2WSH wrapped
596 return true;
604 // Should not be wrapped
605 return false;
606 } // no default case, so the compiler can warn about missing cases
608 }()};
609 if (can_wrap_P2WSH) {
611 CScript segwitScr;
612 FlatSigningProvider provider;
613 if (which_type == TxoutType::PUBKEY) {
614 segwitScr = GetScriptForDestination(WitnessV0KeyHash(Hash160(solutions_data[0])));
615 } else if (which_type == TxoutType::PUBKEYHASH) {
616 segwitScr = GetScriptForDestination(WitnessV0KeyHash(uint160{solutions_data[0]}));
617 } else {
618 // Scripts that are not fit for P2WPKH are encoded as P2WSH.
619 provider.scripts[CScriptID(script)] = script;
621 }
622 ScriptToUniv(segwitScr, /*out=*/sr, /*include_hex=*/true, /*include_address=*/true, /*provider=*/&provider);
623 sr.pushKV("p2sh-segwit", EncodeDestination(ScriptHash(segwitScr)));
624 r.pushKV("segwit", std::move(sr));
625 }
626 }
627
628 return r;
629},
630 };
631}
632
634{
635 return RPCHelpMan{"combinerawtransaction",
636 "\nCombine multiple partially signed transactions into one transaction.\n"
637 "The combined transaction may be another partially signed transaction or a \n"
638 "fully signed transaction.",
639 {
640 {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The hex strings of partially signed transactions",
641 {
642 {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "A hex-encoded raw transaction"},
643 },
644 },
645 },
646 RPCResult{
647 RPCResult::Type::STR, "", "The hex-encoded raw transaction with signature(s)"
648 },
650 HelpExampleCli("combinerawtransaction", R"('["myhex1", "myhex2", "myhex3"]')")
651 },
652 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
653{
654
655 UniValue txs = request.params[0].get_array();
656 std::vector<CMutableTransaction> txVariants(txs.size());
657
658 for (unsigned int idx = 0; idx < txs.size(); idx++) {
659 if (!DecodeHexTx(txVariants[idx], txs[idx].get_str())) {
660 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed for tx %d. Make sure the tx has at least one input.", idx));
661 }
662 }
663
664 if (txVariants.empty()) {
665 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transactions");
666 }
667
668 // mergedTx will end up with all the signatures; it
669 // starts as a clone of the rawtx:
670 CMutableTransaction mergedTx(txVariants[0]);
671
672 // Fetch previous transactions (inputs):
673 CCoinsView viewDummy;
674 CCoinsViewCache view(&viewDummy);
675 {
676 NodeContext& node = EnsureAnyNodeContext(request.context);
677 const CTxMemPool& mempool = EnsureMemPool(node);
679 LOCK2(cs_main, mempool.cs);
680 CCoinsViewCache &viewChain = chainman.ActiveChainstate().CoinsTip();
681 CCoinsViewMemPool viewMempool(&viewChain, mempool);
682 view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view
683
684 for (const CTxIn& txin : mergedTx.vin) {
685 view.AccessCoin(txin.prevout); // Load entries from viewChain into view; can fail.
686 }
687
688 view.SetBackend(viewDummy); // switch back to avoid locking mempool for too long
689 }
690
691 // Use CTransaction for the constant parts of the
692 // transaction to avoid rehashing.
693 const CTransaction txConst(mergedTx);
694 // Sign what we can:
695 for (unsigned int i = 0; i < mergedTx.vin.size(); i++) {
696 CTxIn& txin = mergedTx.vin[i];
697 const Coin& coin = view.AccessCoin(txin.prevout);
698 if (coin.IsSpent()) {
699 throw JSONRPCError(RPC_VERIFY_ERROR, "Input not found or already spent");
700 }
701 SignatureData sigdata;
702
703 // ... and merge in other signatures:
704 for (const CMutableTransaction& txv : txVariants) {
705 if (txv.vin.size() > i) {
706 sigdata.MergeSignatureData(DataFromTransaction(txv, i, coin.out));
707 }
708 }
710
711 UpdateInput(txin, sigdata);
712 }
713
714 return EncodeHexTx(CTransaction(mergedTx));
715},
716 };
717}
718
720{
721 return RPCHelpMan{"signrawtransactionwithkey",
722 "\nSign inputs for raw transaction (serialized, hex-encoded).\n"
723 "The second argument is an array of base58-encoded private\n"
724 "keys that will be the only keys used to sign the transaction.\n"
725 "The third optional argument (may be null) is an array of previous transaction outputs that\n"
726 "this transaction depends on but may not yet be in the block chain.\n",
727 {
728 {"hexstring", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction hex string"},
729 {"privkeys", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base58-encoded private keys for signing",
730 {
731 {"privatekey", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "private key in base58-encoding"},
732 },
733 },
734 {"prevtxs", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The previous dependent transaction outputs",
735 {
737 {
738 {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
739 {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
740 {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "output script"},
741 {"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"},
742 {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"},
743 {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "(required for Segwit inputs) the amount spent"},
744 },
745 },
746 },
747 },
748 {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type. Must be one of:\n"
749 " \"DEFAULT\"\n"
750 " \"ALL\"\n"
751 " \"NONE\"\n"
752 " \"SINGLE\"\n"
753 " \"ALL|ANYONECANPAY\"\n"
754 " \"NONE|ANYONECANPAY\"\n"
755 " \"SINGLE|ANYONECANPAY\"\n"
756 },
757 },
758 RPCResult{
759 RPCResult::Type::OBJ, "", "",
760 {
761 {RPCResult::Type::STR_HEX, "hex", "The hex-encoded raw transaction with signature(s)"},
762 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
763 {RPCResult::Type::ARR, "errors", /*optional=*/true, "Script verification errors (if there are any)",
764 {
765 {RPCResult::Type::OBJ, "", "",
766 {
767 {RPCResult::Type::STR_HEX, "txid", "The hash of the referenced, previous transaction"},
768 {RPCResult::Type::NUM, "vout", "The index of the output to spent and used as input"},
769 {RPCResult::Type::ARR, "witness", "",
770 {
771 {RPCResult::Type::STR_HEX, "witness", ""},
772 }},
773 {RPCResult::Type::STR_HEX, "scriptSig", "The hex-encoded signature script"},
774 {RPCResult::Type::NUM, "sequence", "Script sequence number"},
775 {RPCResult::Type::STR, "error", "Verification or signing error related to the input"},
776 }},
777 }},
778 }
779 },
781 HelpExampleCli("signrawtransactionwithkey", "\"myhex\" \"[\\\"key1\\\",\\\"key2\\\"]\"")
782 + HelpExampleRpc("signrawtransactionwithkey", "\"myhex\", \"[\\\"key1\\\",\\\"key2\\\"]\"")
783 },
784 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
785{
787 if (!DecodeHexTx(mtx, request.params[0].get_str())) {
788 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed. Make sure the tx has at least one input.");
789 }
790
791 FlatSigningProvider keystore;
792 const UniValue& keys = request.params[1].get_array();
793 for (unsigned int idx = 0; idx < keys.size(); ++idx) {
794 UniValue k = keys[idx];
795 CKey key = DecodeSecret(k.get_str());
796 if (!key.IsValid()) {
797 throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
798 }
799
800 CPubKey pubkey = key.GetPubKey();
801 CKeyID key_id = pubkey.GetID();
802 keystore.pubkeys.emplace(key_id, pubkey);
803 keystore.keys.emplace(key_id, key);
804 }
805
806 // Fetch previous transactions (inputs):
807 std::map<COutPoint, Coin> coins;
808 for (const CTxIn& txin : mtx.vin) {
809 coins[txin.prevout]; // Create empty map entry keyed by prevout.
810 }
811 NodeContext& node = EnsureAnyNodeContext(request.context);
812 FindCoins(node, coins);
813
814 // Parse the prevtxs array
815 ParsePrevouts(request.params[2], &keystore, coins);
816
817 UniValue result(UniValue::VOBJ);
818 SignTransaction(mtx, &keystore, coins, request.params[3], result);
819 return result;
820},
821 };
822}
823
825 RPCResult::Type::ARR, "inputs", "",
826 {
827 {RPCResult::Type::OBJ, "", "",
828 {
829 {RPCResult::Type::OBJ, "non_witness_utxo", /*optional=*/true, "Decoded network transaction for non-witness UTXOs",
830 {
832 }},
833 {RPCResult::Type::OBJ, "witness_utxo", /*optional=*/true, "Transaction output for witness UTXOs",
834 {
835 {RPCResult::Type::NUM, "amount", "The value in " + CURRENCY_UNIT},
836 {RPCResult::Type::OBJ, "scriptPubKey", "",
837 {
838 {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
839 {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
840 {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
841 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
842 {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
843 }},
844 }},
845 {RPCResult::Type::OBJ_DYN, "partial_signatures", /*optional=*/true, "",
846 {
847 {RPCResult::Type::STR, "pubkey", "The public key and signature that corresponds to it."},
848 }},
849 {RPCResult::Type::STR, "sighash", /*optional=*/true, "The sighash type to be used"},
850 {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
851 {
852 {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
853 {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
854 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
855 }},
856 {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
857 {
858 {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
859 {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
860 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
861 }},
862 {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
863 {
864 {RPCResult::Type::OBJ, "", "",
865 {
866 {RPCResult::Type::STR, "pubkey", "The public key with the derivation path as the value."},
867 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
868 {RPCResult::Type::STR, "path", "The path"},
869 }},
870 }},
871 {RPCResult::Type::OBJ, "final_scriptSig", /*optional=*/true, "",
872 {
873 {RPCResult::Type::STR, "asm", "Disassembly of the final signature script"},
874 {RPCResult::Type::STR_HEX, "hex", "The raw final signature script bytes, hex-encoded"},
875 }},
876 {RPCResult::Type::ARR, "final_scriptwitness", /*optional=*/true, "",
877 {
878 {RPCResult::Type::STR_HEX, "", "hex-encoded witness data (if any)"},
879 }},
880 {RPCResult::Type::OBJ_DYN, "ripemd160_preimages", /*optional=*/ true, "",
881 {
882 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
883 }},
884 {RPCResult::Type::OBJ_DYN, "sha256_preimages", /*optional=*/ true, "",
885 {
886 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
887 }},
888 {RPCResult::Type::OBJ_DYN, "hash160_preimages", /*optional=*/ true, "",
889 {
890 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
891 }},
892 {RPCResult::Type::OBJ_DYN, "hash256_preimages", /*optional=*/ true, "",
893 {
894 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
895 }},
896 {RPCResult::Type::STR_HEX, "taproot_key_path_sig", /*optional=*/ true, "hex-encoded signature for the Taproot key path spend"},
897 {RPCResult::Type::ARR, "taproot_script_path_sigs", /*optional=*/ true, "",
898 {
899 {RPCResult::Type::OBJ, "signature", /*optional=*/ true, "The signature for the pubkey and leaf hash combination",
900 {
901 {RPCResult::Type::STR, "pubkey", "The x-only pubkey for this signature"},
902 {RPCResult::Type::STR, "leaf_hash", "The leaf hash for this signature"},
903 {RPCResult::Type::STR, "sig", "The signature itself"},
904 }},
905 }},
906 {RPCResult::Type::ARR, "taproot_scripts", /*optional=*/ true, "",
907 {
908 {RPCResult::Type::OBJ, "", "",
909 {
910 {RPCResult::Type::STR_HEX, "script", "A leaf script"},
911 {RPCResult::Type::NUM, "leaf_ver", "The version number for the leaf script"},
912 {RPCResult::Type::ARR, "control_blocks", "The control blocks for this script",
913 {
914 {RPCResult::Type::STR_HEX, "control_block", "A hex-encoded control block for this script"},
915 }},
916 }},
917 }},
918 {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
919 {
920 {RPCResult::Type::OBJ, "", "",
921 {
922 {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
923 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
924 {RPCResult::Type::STR, "path", "The path"},
925 {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
926 {
927 {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
928 }},
929 }},
930 }},
931 {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
932 {RPCResult::Type::STR_HEX, "taproot_merkle_root", /*optional=*/ true, "The hex-encoded Taproot merkle root"},
933 {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/ true, "The unknown input fields",
934 {
935 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
936 }},
937 {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The input proprietary map",
938 {
939 {RPCResult::Type::OBJ, "", "",
940 {
941 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
942 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
943 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
944 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
945 }},
946 }},
947 }},
948 }
949};
950
952 RPCResult::Type::ARR, "outputs", "",
953 {
954 {RPCResult::Type::OBJ, "", "",
955 {
956 {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
957 {
958 {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
959 {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
960 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
961 }},
962 {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
963 {
964 {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
965 {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
966 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
967 }},
968 {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
969 {
970 {RPCResult::Type::OBJ, "", "",
971 {
972 {RPCResult::Type::STR, "pubkey", "The public key this path corresponds to"},
973 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
974 {RPCResult::Type::STR, "path", "The path"},
975 }},
976 }},
977 {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
978 {RPCResult::Type::ARR, "taproot_tree", /*optional=*/ true, "The tuples that make up the Taproot tree, in depth first search order",
979 {
980 {RPCResult::Type::OBJ, "tuple", /*optional=*/ true, "A single leaf script in the taproot tree",
981 {
982 {RPCResult::Type::NUM, "depth", "The depth of this element in the tree"},
983 {RPCResult::Type::NUM, "leaf_ver", "The version of this leaf"},
984 {RPCResult::Type::STR, "script", "The hex-encoded script itself"},
985 }},
986 }},
987 {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
988 {
989 {RPCResult::Type::OBJ, "", "",
990 {
991 {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
992 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
993 {RPCResult::Type::STR, "path", "The path"},
994 {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
995 {
996 {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
997 }},
998 }},
999 }},
1000 {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown output fields",
1001 {
1002 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1003 }},
1004 {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The output proprietary map",
1005 {
1006 {RPCResult::Type::OBJ, "", "",
1007 {
1008 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1009 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1010 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1011 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1012 }},
1013 }},
1014 }},
1015 }
1016};
1017
1019{
1020 return RPCHelpMan{
1021 "decodepsbt",
1022 "Return a JSON object representing the serialized, base64-encoded partially signed Bitcoin transaction.",
1023 {
1024 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The PSBT base64 string"},
1025 },
1026 RPCResult{
1027 RPCResult::Type::OBJ, "", "",
1028 {
1029 {RPCResult::Type::OBJ, "tx", "The decoded network-serialized unsigned transaction.",
1030 {
1031 {RPCResult::Type::ELISION, "", "The layout is the same as the output of decoderawtransaction."},
1032 }},
1033 {RPCResult::Type::ARR, "global_xpubs", "",
1034 {
1035 {RPCResult::Type::OBJ, "", "",
1036 {
1037 {RPCResult::Type::STR, "xpub", "The extended public key this path corresponds to"},
1038 {RPCResult::Type::STR_HEX, "master_fingerprint", "The fingerprint of the master key"},
1039 {RPCResult::Type::STR, "path", "The path"},
1040 }},
1041 }},
1042 {RPCResult::Type::NUM, "psbt_version", "The PSBT version number. Not to be confused with the unsigned transaction version"},
1043 {RPCResult::Type::ARR, "proprietary", "The global proprietary map",
1044 {
1045 {RPCResult::Type::OBJ, "", "",
1046 {
1047 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1048 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1049 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1050 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1051 }},
1052 }},
1053 {RPCResult::Type::OBJ_DYN, "unknown", "The unknown global fields",
1054 {
1055 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1056 }},
1059 {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid if all UTXOs slots in the PSBT have been filled."},
1060 }
1061 },
1063 HelpExampleCli("decodepsbt", "\"psbt\"")
1064 },
1065 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1066{
1067 // Unserialize the transactions
1069 std::string error;
1070 if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1071 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1072 }
1073
1074 UniValue result(UniValue::VOBJ);
1075
1076 // Add the decoded tx
1077 UniValue tx_univ(UniValue::VOBJ);
1078 TxToUniv(CTransaction(*psbtx.tx), /*block_hash=*/uint256(), /*entry=*/tx_univ, /*include_hex=*/false);
1079 result.pushKV("tx", std::move(tx_univ));
1080
1081 // Add the global xpubs
1082 UniValue global_xpubs(UniValue::VARR);
1083 for (std::pair<KeyOriginInfo, std::set<CExtPubKey>> xpub_pair : psbtx.m_xpubs) {
1084 for (auto& xpub : xpub_pair.second) {
1085 std::vector<unsigned char> ser_xpub;
1086 ser_xpub.assign(BIP32_EXTKEY_WITH_VERSION_SIZE, 0);
1087 xpub.EncodeWithVersion(ser_xpub.data());
1088
1089 UniValue keypath(UniValue::VOBJ);
1090 keypath.pushKV("xpub", EncodeBase58Check(ser_xpub));
1091 keypath.pushKV("master_fingerprint", HexStr(Span<unsigned char>(xpub_pair.first.fingerprint, xpub_pair.first.fingerprint + 4)));
1092 keypath.pushKV("path", WriteHDKeypath(xpub_pair.first.path));
1093 global_xpubs.push_back(std::move(keypath));
1094 }
1095 }
1096 result.pushKV("global_xpubs", std::move(global_xpubs));
1097
1098 // PSBT version
1099 result.pushKV("psbt_version", static_cast<uint64_t>(psbtx.GetVersion()));
1100
1101 // Proprietary
1102 UniValue proprietary(UniValue::VARR);
1103 for (const auto& entry : psbtx.m_proprietary) {
1104 UniValue this_prop(UniValue::VOBJ);
1105 this_prop.pushKV("identifier", HexStr(entry.identifier));
1106 this_prop.pushKV("subtype", entry.subtype);
1107 this_prop.pushKV("key", HexStr(entry.key));
1108 this_prop.pushKV("value", HexStr(entry.value));
1109 proprietary.push_back(std::move(this_prop));
1110 }
1111 result.pushKV("proprietary", std::move(proprietary));
1112
1113 // Unknown data
1114 UniValue unknowns(UniValue::VOBJ);
1115 for (auto entry : psbtx.unknown) {
1116 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1117 }
1118 result.pushKV("unknown", std::move(unknowns));
1119
1120 // inputs
1121 CAmount total_in = 0;
1122 bool have_all_utxos = true;
1123 UniValue inputs(UniValue::VARR);
1124 for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
1125 const PSBTInput& input = psbtx.inputs[i];
1127 // UTXOs
1128 bool have_a_utxo = false;
1129 CTxOut txout;
1130 if (!input.witness_utxo.IsNull()) {
1131 txout = input.witness_utxo;
1132
1134 ScriptToUniv(txout.scriptPubKey, /*out=*/o, /*include_hex=*/true, /*include_address=*/true);
1135
1137 out.pushKV("amount", ValueFromAmount(txout.nValue));
1138 out.pushKV("scriptPubKey", std::move(o));
1139
1140 in.pushKV("witness_utxo", std::move(out));
1141
1142 have_a_utxo = true;
1143 }
1144 if (input.non_witness_utxo) {
1145 txout = input.non_witness_utxo->vout[psbtx.tx->vin[i].prevout.n];
1146
1147 UniValue non_wit(UniValue::VOBJ);
1148 TxToUniv(*input.non_witness_utxo, /*block_hash=*/uint256(), /*entry=*/non_wit, /*include_hex=*/false);
1149 in.pushKV("non_witness_utxo", std::move(non_wit));
1150
1151 have_a_utxo = true;
1152 }
1153 if (have_a_utxo) {
1154 if (MoneyRange(txout.nValue) && MoneyRange(total_in + txout.nValue)) {
1155 total_in += txout.nValue;
1156 } else {
1157 // Hack to just not show fee later
1158 have_all_utxos = false;
1159 }
1160 } else {
1161 have_all_utxos = false;
1162 }
1163
1164 // Partial sigs
1165 if (!input.partial_sigs.empty()) {
1166 UniValue partial_sigs(UniValue::VOBJ);
1167 for (const auto& sig : input.partial_sigs) {
1168 partial_sigs.pushKV(HexStr(sig.second.first), HexStr(sig.second.second));
1169 }
1170 in.pushKV("partial_signatures", std::move(partial_sigs));
1171 }
1172
1173 // Sighash
1174 if (input.sighash_type != std::nullopt) {
1175 in.pushKV("sighash", SighashToStr((unsigned char)*input.sighash_type));
1176 }
1177
1178 // Redeem script and witness script
1179 if (!input.redeem_script.empty()) {
1181 ScriptToUniv(input.redeem_script, /*out=*/r);
1182 in.pushKV("redeem_script", std::move(r));
1183 }
1184 if (!input.witness_script.empty()) {
1186 ScriptToUniv(input.witness_script, /*out=*/r);
1187 in.pushKV("witness_script", std::move(r));
1188 }
1189
1190 // keypaths
1191 if (!input.hd_keypaths.empty()) {
1192 UniValue keypaths(UniValue::VARR);
1193 for (auto entry : input.hd_keypaths) {
1194 UniValue keypath(UniValue::VOBJ);
1195 keypath.pushKV("pubkey", HexStr(entry.first));
1196
1197 keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1198 keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1199 keypaths.push_back(std::move(keypath));
1200 }
1201 in.pushKV("bip32_derivs", std::move(keypaths));
1202 }
1203
1204 // Final scriptSig and scriptwitness
1205 if (!input.final_script_sig.empty()) {
1206 UniValue scriptsig(UniValue::VOBJ);
1207 scriptsig.pushKV("asm", ScriptToAsmStr(input.final_script_sig, true));
1208 scriptsig.pushKV("hex", HexStr(input.final_script_sig));
1209 in.pushKV("final_scriptSig", std::move(scriptsig));
1210 }
1211 if (!input.final_script_witness.IsNull()) {
1212 UniValue txinwitness(UniValue::VARR);
1213 for (const auto& item : input.final_script_witness.stack) {
1214 txinwitness.push_back(HexStr(item));
1215 }
1216 in.pushKV("final_scriptwitness", std::move(txinwitness));
1217 }
1218
1219 // Ripemd160 hash preimages
1220 if (!input.ripemd160_preimages.empty()) {
1221 UniValue ripemd160_preimages(UniValue::VOBJ);
1222 for (const auto& [hash, preimage] : input.ripemd160_preimages) {
1223 ripemd160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1224 }
1225 in.pushKV("ripemd160_preimages", std::move(ripemd160_preimages));
1226 }
1227
1228 // Sha256 hash preimages
1229 if (!input.sha256_preimages.empty()) {
1230 UniValue sha256_preimages(UniValue::VOBJ);
1231 for (const auto& [hash, preimage] : input.sha256_preimages) {
1232 sha256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1233 }
1234 in.pushKV("sha256_preimages", std::move(sha256_preimages));
1235 }
1236
1237 // Hash160 hash preimages
1238 if (!input.hash160_preimages.empty()) {
1239 UniValue hash160_preimages(UniValue::VOBJ);
1240 for (const auto& [hash, preimage] : input.hash160_preimages) {
1241 hash160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1242 }
1243 in.pushKV("hash160_preimages", std::move(hash160_preimages));
1244 }
1245
1246 // Hash256 hash preimages
1247 if (!input.hash256_preimages.empty()) {
1248 UniValue hash256_preimages(UniValue::VOBJ);
1249 for (const auto& [hash, preimage] : input.hash256_preimages) {
1250 hash256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1251 }
1252 in.pushKV("hash256_preimages", std::move(hash256_preimages));
1253 }
1254
1255 // Taproot key path signature
1256 if (!input.m_tap_key_sig.empty()) {
1257 in.pushKV("taproot_key_path_sig", HexStr(input.m_tap_key_sig));
1258 }
1259
1260 // Taproot script path signatures
1261 if (!input.m_tap_script_sigs.empty()) {
1262 UniValue script_sigs(UniValue::VARR);
1263 for (const auto& [pubkey_leaf, sig] : input.m_tap_script_sigs) {
1264 const auto& [xonly, leaf_hash] = pubkey_leaf;
1265 UniValue sigobj(UniValue::VOBJ);
1266 sigobj.pushKV("pubkey", HexStr(xonly));
1267 sigobj.pushKV("leaf_hash", HexStr(leaf_hash));
1268 sigobj.pushKV("sig", HexStr(sig));
1269 script_sigs.push_back(std::move(sigobj));
1270 }
1271 in.pushKV("taproot_script_path_sigs", std::move(script_sigs));
1272 }
1273
1274 // Taproot leaf scripts
1275 if (!input.m_tap_scripts.empty()) {
1276 UniValue tap_scripts(UniValue::VARR);
1277 for (const auto& [leaf, control_blocks] : input.m_tap_scripts) {
1278 const auto& [script, leaf_ver] = leaf;
1279 UniValue script_info(UniValue::VOBJ);
1280 script_info.pushKV("script", HexStr(script));
1281 script_info.pushKV("leaf_ver", leaf_ver);
1282 UniValue control_blocks_univ(UniValue::VARR);
1283 for (const auto& control_block : control_blocks) {
1284 control_blocks_univ.push_back(HexStr(control_block));
1285 }
1286 script_info.pushKV("control_blocks", std::move(control_blocks_univ));
1287 tap_scripts.push_back(std::move(script_info));
1288 }
1289 in.pushKV("taproot_scripts", std::move(tap_scripts));
1290 }
1291
1292 // Taproot bip32 keypaths
1293 if (!input.m_tap_bip32_paths.empty()) {
1294 UniValue keypaths(UniValue::VARR);
1295 for (const auto& [xonly, leaf_origin] : input.m_tap_bip32_paths) {
1296 const auto& [leaf_hashes, origin] = leaf_origin;
1297 UniValue path_obj(UniValue::VOBJ);
1298 path_obj.pushKV("pubkey", HexStr(xonly));
1299 path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1300 path_obj.pushKV("path", WriteHDKeypath(origin.path));
1301 UniValue leaf_hashes_arr(UniValue::VARR);
1302 for (const auto& leaf_hash : leaf_hashes) {
1303 leaf_hashes_arr.push_back(HexStr(leaf_hash));
1304 }
1305 path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1306 keypaths.push_back(std::move(path_obj));
1307 }
1308 in.pushKV("taproot_bip32_derivs", std::move(keypaths));
1309 }
1310
1311 // Taproot internal key
1312 if (!input.m_tap_internal_key.IsNull()) {
1313 in.pushKV("taproot_internal_key", HexStr(input.m_tap_internal_key));
1314 }
1315
1316 // Write taproot merkle root
1317 if (!input.m_tap_merkle_root.IsNull()) {
1318 in.pushKV("taproot_merkle_root", HexStr(input.m_tap_merkle_root));
1319 }
1320
1321 // Proprietary
1322 if (!input.m_proprietary.empty()) {
1323 UniValue proprietary(UniValue::VARR);
1324 for (const auto& entry : input.m_proprietary) {
1325 UniValue this_prop(UniValue::VOBJ);
1326 this_prop.pushKV("identifier", HexStr(entry.identifier));
1327 this_prop.pushKV("subtype", entry.subtype);
1328 this_prop.pushKV("key", HexStr(entry.key));
1329 this_prop.pushKV("value", HexStr(entry.value));
1330 proprietary.push_back(std::move(this_prop));
1331 }
1332 in.pushKV("proprietary", std::move(proprietary));
1333 }
1334
1335 // Unknown data
1336 if (input.unknown.size() > 0) {
1337 UniValue unknowns(UniValue::VOBJ);
1338 for (auto entry : input.unknown) {
1339 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1340 }
1341 in.pushKV("unknown", std::move(unknowns));
1342 }
1343
1344 inputs.push_back(std::move(in));
1345 }
1346 result.pushKV("inputs", std::move(inputs));
1347
1348 // outputs
1349 CAmount output_value = 0;
1350 UniValue outputs(UniValue::VARR);
1351 for (unsigned int i = 0; i < psbtx.outputs.size(); ++i) {
1352 const PSBTOutput& output = psbtx.outputs[i];
1354 // Redeem script and witness script
1355 if (!output.redeem_script.empty()) {
1357 ScriptToUniv(output.redeem_script, /*out=*/r);
1358 out.pushKV("redeem_script", std::move(r));
1359 }
1360 if (!output.witness_script.empty()) {
1362 ScriptToUniv(output.witness_script, /*out=*/r);
1363 out.pushKV("witness_script", std::move(r));
1364 }
1365
1366 // keypaths
1367 if (!output.hd_keypaths.empty()) {
1368 UniValue keypaths(UniValue::VARR);
1369 for (auto entry : output.hd_keypaths) {
1370 UniValue keypath(UniValue::VOBJ);
1371 keypath.pushKV("pubkey", HexStr(entry.first));
1372 keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1373 keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1374 keypaths.push_back(std::move(keypath));
1375 }
1376 out.pushKV("bip32_derivs", std::move(keypaths));
1377 }
1378
1379 // Taproot internal key
1380 if (!output.m_tap_internal_key.IsNull()) {
1381 out.pushKV("taproot_internal_key", HexStr(output.m_tap_internal_key));
1382 }
1383
1384 // Taproot tree
1385 if (!output.m_tap_tree.empty()) {
1387 for (const auto& [depth, leaf_ver, script] : output.m_tap_tree) {
1389 elem.pushKV("depth", (int)depth);
1390 elem.pushKV("leaf_ver", (int)leaf_ver);
1391 elem.pushKV("script", HexStr(script));
1392 tree.push_back(std::move(elem));
1393 }
1394 out.pushKV("taproot_tree", std::move(tree));
1395 }
1396
1397 // Taproot bip32 keypaths
1398 if (!output.m_tap_bip32_paths.empty()) {
1399 UniValue keypaths(UniValue::VARR);
1400 for (const auto& [xonly, leaf_origin] : output.m_tap_bip32_paths) {
1401 const auto& [leaf_hashes, origin] = leaf_origin;
1402 UniValue path_obj(UniValue::VOBJ);
1403 path_obj.pushKV("pubkey", HexStr(xonly));
1404 path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1405 path_obj.pushKV("path", WriteHDKeypath(origin.path));
1406 UniValue leaf_hashes_arr(UniValue::VARR);
1407 for (const auto& leaf_hash : leaf_hashes) {
1408 leaf_hashes_arr.push_back(HexStr(leaf_hash));
1409 }
1410 path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1411 keypaths.push_back(std::move(path_obj));
1412 }
1413 out.pushKV("taproot_bip32_derivs", std::move(keypaths));
1414 }
1415
1416 // Proprietary
1417 if (!output.m_proprietary.empty()) {
1418 UniValue proprietary(UniValue::VARR);
1419 for (const auto& entry : output.m_proprietary) {
1420 UniValue this_prop(UniValue::VOBJ);
1421 this_prop.pushKV("identifier", HexStr(entry.identifier));
1422 this_prop.pushKV("subtype", entry.subtype);
1423 this_prop.pushKV("key", HexStr(entry.key));
1424 this_prop.pushKV("value", HexStr(entry.value));
1425 proprietary.push_back(std::move(this_prop));
1426 }
1427 out.pushKV("proprietary", std::move(proprietary));
1428 }
1429
1430 // Unknown data
1431 if (output.unknown.size() > 0) {
1432 UniValue unknowns(UniValue::VOBJ);
1433 for (auto entry : output.unknown) {
1434 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1435 }
1436 out.pushKV("unknown", std::move(unknowns));
1437 }
1438
1439 outputs.push_back(std::move(out));
1440
1441 // Fee calculation
1442 if (MoneyRange(psbtx.tx->vout[i].nValue) && MoneyRange(output_value + psbtx.tx->vout[i].nValue)) {
1443 output_value += psbtx.tx->vout[i].nValue;
1444 } else {
1445 // Hack to just not show fee later
1446 have_all_utxos = false;
1447 }
1448 }
1449 result.pushKV("outputs", std::move(outputs));
1450 if (have_all_utxos) {
1451 result.pushKV("fee", ValueFromAmount(total_in - output_value));
1452 }
1453
1454 return result;
1455},
1456 };
1457}
1458
1460{
1461 return RPCHelpMan{"combinepsbt",
1462 "\nCombine multiple partially signed Bitcoin transactions into one transaction.\n"
1463 "Implements the Combiner role.\n",
1464 {
1465 {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1466 {
1467 {"psbt", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A base64 string of a PSBT"},
1468 },
1469 },
1470 },
1471 RPCResult{
1472 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1473 },
1475 HelpExampleCli("combinepsbt", R"('["mybase64_1", "mybase64_2", "mybase64_3"]')")
1476 },
1477 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1478{
1479 // Unserialize the transactions
1480 std::vector<PartiallySignedTransaction> psbtxs;
1481 UniValue txs = request.params[0].get_array();
1482 if (txs.empty()) {
1483 throw JSONRPCError(RPC_INVALID_PARAMETER, "Parameter 'txs' cannot be empty");
1484 }
1485 for (unsigned int i = 0; i < txs.size(); ++i) {
1487 std::string error;
1488 if (!DecodeBase64PSBT(psbtx, txs[i].get_str(), error)) {
1489 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1490 }
1491 psbtxs.push_back(psbtx);
1492 }
1493
1494 PartiallySignedTransaction merged_psbt;
1495 if (!CombinePSBTs(merged_psbt, psbtxs)) {
1496 throw JSONRPCError(RPC_INVALID_PARAMETER, "PSBTs not compatible (different transactions)");
1497 }
1498
1499 DataStream ssTx{};
1500 ssTx << merged_psbt;
1501 return EncodeBase64(ssTx);
1502},
1503 };
1504}
1505
1507{
1508 return RPCHelpMan{"finalizepsbt",
1509 "Finalize the inputs of a PSBT. If the transaction is fully signed, it will produce a\n"
1510 "network serialized transaction which can be broadcast with sendrawtransaction. Otherwise a PSBT will be\n"
1511 "created which has the final_scriptSig and final_scriptWitness fields filled for inputs that are complete.\n"
1512 "Implements the Finalizer and Extractor roles.\n",
1513 {
1514 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1515 {"extract", RPCArg::Type::BOOL, RPCArg::Default{true}, "If true and the transaction is complete,\n"
1516 " extract and return the complete transaction in normal network serialization instead of the PSBT."},
1517 },
1518 RPCResult{
1519 RPCResult::Type::OBJ, "", "",
1520 {
1521 {RPCResult::Type::STR, "psbt", /*optional=*/true, "The base64-encoded partially signed transaction if not extracted"},
1522 {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if extracted"},
1523 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
1524 }
1525 },
1527 HelpExampleCli("finalizepsbt", "\"psbt\"")
1528 },
1529 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1530{
1531 // Unserialize the transactions
1533 std::string error;
1534 if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1535 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1536 }
1537
1538 bool extract = request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool());
1539
1541 bool complete = FinalizeAndExtractPSBT(psbtx, mtx);
1542
1543 UniValue result(UniValue::VOBJ);
1544 DataStream ssTx{};
1545 std::string result_str;
1546
1547 if (complete && extract) {
1548 ssTx << TX_WITH_WITNESS(mtx);
1549 result_str = HexStr(ssTx);
1550 result.pushKV("hex", result_str);
1551 } else {
1552 ssTx << psbtx;
1553 result_str = EncodeBase64(ssTx.str());
1554 result.pushKV("psbt", result_str);
1555 }
1556 result.pushKV("complete", complete);
1557
1558 return result;
1559},
1560 };
1561}
1562
1564{
1565 return RPCHelpMan{"createpsbt",
1566 "\nCreates a transaction in the Partially Signed Transaction format.\n"
1567 "Implements the Creator role.\n",
1568 CreateTxDoc(),
1569 RPCResult{
1570 RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1571 },
1573 HelpExampleCli("createpsbt", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
1574 },
1575 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1576{
1577
1578 std::optional<bool> rbf;
1579 if (!request.params[3].isNull()) {
1580 rbf = request.params[3].get_bool();
1581 }
1582 CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf);
1583
1584 // Make a blank psbt
1586 psbtx.tx = rawTx;
1587 for (unsigned int i = 0; i < rawTx.vin.size(); ++i) {
1588 psbtx.inputs.emplace_back();
1589 }
1590 for (unsigned int i = 0; i < rawTx.vout.size(); ++i) {
1591 psbtx.outputs.emplace_back();
1592 }
1593
1594 // Serialize the PSBT
1595 DataStream ssTx{};
1596 ssTx << psbtx;
1597
1598 return EncodeBase64(ssTx);
1599},
1600 };
1601}
1602
1604{
1605 return RPCHelpMan{"converttopsbt",
1606 "\nConverts a network serialized transaction to a PSBT. This should be used only with createrawtransaction and fundrawtransaction\n"
1607 "createpsbt and walletcreatefundedpsbt should be used for new applications.\n",
1608 {
1609 {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of a raw transaction"},
1610 {"permitsigdata", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, any signatures in the input will be discarded and conversion\n"
1611 " will continue. If false, RPC will fail if any signatures are present."},
1612 {"iswitness", RPCArg::Type::BOOL, RPCArg::DefaultHint{"depends on heuristic tests"}, "Whether the transaction hex is a serialized witness transaction.\n"
1613 "If iswitness is not present, heuristic tests will be used in decoding.\n"
1614 "If true, only witness deserialization will be tried.\n"
1615 "If false, only non-witness deserialization will be tried.\n"
1616 "This boolean should reflect whether the transaction has inputs\n"
1617 "(e.g. fully valid, or on-chain transactions), if known by the caller."
1618 },
1619 },
1620 RPCResult{
1621 RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1622 },
1624 "\nCreate a transaction\n"
1625 + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"") +
1626 "\nConvert the transaction to a PSBT\n"
1627 + HelpExampleCli("converttopsbt", "\"rawtransaction\"")
1628 },
1629 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1630{
1631 // parse hex string from parameter
1633 bool permitsigdata = request.params[1].isNull() ? false : request.params[1].get_bool();
1634 bool witness_specified = !request.params[2].isNull();
1635 bool iswitness = witness_specified ? request.params[2].get_bool() : false;
1636 const bool try_witness = witness_specified ? iswitness : true;
1637 const bool try_no_witness = witness_specified ? !iswitness : true;
1638 if (!DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
1639 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
1640 }
1641
1642 // Remove all scriptSigs and scriptWitnesses from inputs
1643 for (CTxIn& input : tx.vin) {
1644 if ((!input.scriptSig.empty() || !input.scriptWitness.IsNull()) && !permitsigdata) {
1645 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Inputs must not have scriptSigs and scriptWitnesses");
1646 }
1647 input.scriptSig.clear();
1648 input.scriptWitness.SetNull();
1649 }
1650
1651 // Make a blank psbt
1653 psbtx.tx = tx;
1654 for (unsigned int i = 0; i < tx.vin.size(); ++i) {
1655 psbtx.inputs.emplace_back();
1656 }
1657 for (unsigned int i = 0; i < tx.vout.size(); ++i) {
1658 psbtx.outputs.emplace_back();
1659 }
1660
1661 // Serialize the PSBT
1662 DataStream ssTx{};
1663 ssTx << psbtx;
1664
1665 return EncodeBase64(ssTx);
1666},
1667 };
1668}
1669
1671{
1672 return RPCHelpMan{"utxoupdatepsbt",
1673 "\nUpdates all segwit inputs and outputs in a PSBT with data from output descriptors, the UTXO set, txindex, or the mempool.\n",
1674 {
1675 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1676 {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "An array of either strings or objects", {
1677 {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
1678 {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
1679 {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
1680 {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
1681 }},
1682 }},
1683 },
1684 RPCResult {
1685 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction with inputs updated"
1686 },
1687 RPCExamples {
1688 HelpExampleCli("utxoupdatepsbt", "\"psbt\"")
1689 },
1690 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1691{
1692 // Parse descriptors, if any.
1693 FlatSigningProvider provider;
1694 if (!request.params[1].isNull()) {
1695 auto descs = request.params[1].get_array();
1696 for (size_t i = 0; i < descs.size(); ++i) {
1697 EvalDescriptorStringOrObject(descs[i], provider);
1698 }
1699 }
1700
1701 // We don't actually need private keys further on; hide them as a precaution.
1703 request.params[0].get_str(),
1704 request.context,
1705 HidingSigningProvider(&provider, /*hide_secret=*/true, /*hide_origin=*/false),
1706 /*sighash_type=*/SIGHASH_ALL,
1707 /*finalize=*/false);
1708
1709 DataStream ssTx{};
1710 ssTx << psbtx;
1711 return EncodeBase64(ssTx);
1712},
1713 };
1714}
1715
1717{
1718 return RPCHelpMan{"joinpsbts",
1719 "\nJoins multiple distinct PSBTs with different inputs and outputs into one PSBT with inputs and outputs from all of the PSBTs\n"
1720 "No input in any of the PSBTs can be in more than one of the PSBTs.\n",
1721 {
1722 {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1723 {
1724 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1725 }}
1726 },
1727 RPCResult {
1728 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1729 },
1730 RPCExamples {
1731 HelpExampleCli("joinpsbts", "\"psbt\"")
1732 },
1733 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1734{
1735 // Unserialize the transactions
1736 std::vector<PartiallySignedTransaction> psbtxs;
1737 UniValue txs = request.params[0].get_array();
1738
1739 if (txs.size() <= 1) {
1740 throw JSONRPCError(RPC_INVALID_PARAMETER, "At least two PSBTs are required to join PSBTs.");
1741 }
1742
1743 uint32_t best_version = 1;
1744 uint32_t best_locktime = 0xffffffff;
1745 for (unsigned int i = 0; i < txs.size(); ++i) {
1747 std::string error;
1748 if (!DecodeBase64PSBT(psbtx, txs[i].get_str(), error)) {
1749 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1750 }
1751 psbtxs.push_back(psbtx);
1752 // Choose the highest version number
1753 if (psbtx.tx->version > best_version) {
1754 best_version = psbtx.tx->version;
1755 }
1756 // Choose the lowest lock time
1757 if (psbtx.tx->nLockTime < best_locktime) {
1758 best_locktime = psbtx.tx->nLockTime;
1759 }
1760 }
1761
1762 // Create a blank psbt where everything will be added
1763 PartiallySignedTransaction merged_psbt;
1764 merged_psbt.tx = CMutableTransaction();
1765 merged_psbt.tx->version = best_version;
1766 merged_psbt.tx->nLockTime = best_locktime;
1767
1768 // Merge
1769 for (auto& psbt : psbtxs) {
1770 for (unsigned int i = 0; i < psbt.tx->vin.size(); ++i) {
1771 if (!merged_psbt.AddInput(psbt.tx->vin[i], psbt.inputs[i])) {
1772 throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Input %s:%d exists in multiple PSBTs", psbt.tx->vin[i].prevout.hash.ToString(), psbt.tx->vin[i].prevout.n));
1773 }
1774 }
1775 for (unsigned int i = 0; i < psbt.tx->vout.size(); ++i) {
1776 merged_psbt.AddOutput(psbt.tx->vout[i], psbt.outputs[i]);
1777 }
1778 for (auto& xpub_pair : psbt.m_xpubs) {
1779 if (merged_psbt.m_xpubs.count(xpub_pair.first) == 0) {
1780 merged_psbt.m_xpubs[xpub_pair.first] = xpub_pair.second;
1781 } else {
1782 merged_psbt.m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
1783 }
1784 }
1785 merged_psbt.unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
1786 }
1787
1788 // Generate list of shuffled indices for shuffling inputs and outputs of the merged PSBT
1789 std::vector<int> input_indices(merged_psbt.inputs.size());
1790 std::iota(input_indices.begin(), input_indices.end(), 0);
1791 std::vector<int> output_indices(merged_psbt.outputs.size());
1792 std::iota(output_indices.begin(), output_indices.end(), 0);
1793
1794 // Shuffle input and output indices lists
1795 std::shuffle(input_indices.begin(), input_indices.end(), FastRandomContext());
1796 std::shuffle(output_indices.begin(), output_indices.end(), FastRandomContext());
1797
1798 PartiallySignedTransaction shuffled_psbt;
1799 shuffled_psbt.tx = CMutableTransaction();
1800 shuffled_psbt.tx->version = merged_psbt.tx->version;
1801 shuffled_psbt.tx->nLockTime = merged_psbt.tx->nLockTime;
1802 for (int i : input_indices) {
1803 shuffled_psbt.AddInput(merged_psbt.tx->vin[i], merged_psbt.inputs[i]);
1804 }
1805 for (int i : output_indices) {
1806 shuffled_psbt.AddOutput(merged_psbt.tx->vout[i], merged_psbt.outputs[i]);
1807 }
1808 shuffled_psbt.unknown.insert(merged_psbt.unknown.begin(), merged_psbt.unknown.end());
1809
1810 DataStream ssTx{};
1811 ssTx << shuffled_psbt;
1812 return EncodeBase64(ssTx);
1813},
1814 };
1815}
1816
1818{
1819 return RPCHelpMan{"analyzepsbt",
1820 "\nAnalyzes and provides information about the current status of a PSBT and its inputs\n",
1821 {
1822 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1823 },
1824 RPCResult {
1825 RPCResult::Type::OBJ, "", "",
1826 {
1827 {RPCResult::Type::ARR, "inputs", /*optional=*/true, "",
1828 {
1829 {RPCResult::Type::OBJ, "", "",
1830 {
1831 {RPCResult::Type::BOOL, "has_utxo", "Whether a UTXO is provided"},
1832 {RPCResult::Type::BOOL, "is_final", "Whether the input is finalized"},
1833 {RPCResult::Type::OBJ, "missing", /*optional=*/true, "Things that are missing that are required to complete this input",
1834 {
1835 {RPCResult::Type::ARR, "pubkeys", /*optional=*/true, "",
1836 {
1837 {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose BIP 32 derivation path is missing"},
1838 }},
1839 {RPCResult::Type::ARR, "signatures", /*optional=*/true, "",
1840 {
1841 {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose signature is missing"},
1842 }},
1843 {RPCResult::Type::STR_HEX, "redeemscript", /*optional=*/true, "Hash160 of the redeem script that is missing"},
1844 {RPCResult::Type::STR_HEX, "witnessscript", /*optional=*/true, "SHA256 of the witness script that is missing"},
1845 }},
1846 {RPCResult::Type::STR, "next", /*optional=*/true, "Role of the next person that this input needs to go to"},
1847 }},
1848 }},
1849 {RPCResult::Type::NUM, "estimated_vsize", /*optional=*/true, "Estimated vsize of the final signed transaction"},
1850 {RPCResult::Type::STR_AMOUNT, "estimated_feerate", /*optional=*/true, "Estimated feerate of the final signed transaction in " + CURRENCY_UNIT + "/kvB. Shown only if all UTXO slots in the PSBT have been filled"},
1851 {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid. Shown only if all UTXO slots in the PSBT have been filled"},
1852 {RPCResult::Type::STR, "next", "Role of the next person that this psbt needs to go to"},
1853 {RPCResult::Type::STR, "error", /*optional=*/true, "Error message (if there is one)"},
1854 }
1855 },
1856 RPCExamples {
1857 HelpExampleCli("analyzepsbt", "\"psbt\"")
1858 },
1859 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1860{
1861 // Unserialize the transaction
1863 std::string error;
1864 if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1865 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1866 }
1867
1868 PSBTAnalysis psbta = AnalyzePSBT(psbtx);
1869
1870 UniValue result(UniValue::VOBJ);
1871 UniValue inputs_result(UniValue::VARR);
1872 for (const auto& input : psbta.inputs) {
1873 UniValue input_univ(UniValue::VOBJ);
1874 UniValue missing(UniValue::VOBJ);
1875
1876 input_univ.pushKV("has_utxo", input.has_utxo);
1877 input_univ.pushKV("is_final", input.is_final);
1878 input_univ.pushKV("next", PSBTRoleName(input.next));
1879
1880 if (!input.missing_pubkeys.empty()) {
1881 UniValue missing_pubkeys_univ(UniValue::VARR);
1882 for (const CKeyID& pubkey : input.missing_pubkeys) {
1883 missing_pubkeys_univ.push_back(HexStr(pubkey));
1884 }
1885 missing.pushKV("pubkeys", std::move(missing_pubkeys_univ));
1886 }
1887 if (!input.missing_redeem_script.IsNull()) {
1888 missing.pushKV("redeemscript", HexStr(input.missing_redeem_script));
1889 }
1890 if (!input.missing_witness_script.IsNull()) {
1891 missing.pushKV("witnessscript", HexStr(input.missing_witness_script));
1892 }
1893 if (!input.missing_sigs.empty()) {
1894 UniValue missing_sigs_univ(UniValue::VARR);
1895 for (const CKeyID& pubkey : input.missing_sigs) {
1896 missing_sigs_univ.push_back(HexStr(pubkey));
1897 }
1898 missing.pushKV("signatures", std::move(missing_sigs_univ));
1899 }
1900 if (!missing.getKeys().empty()) {
1901 input_univ.pushKV("missing", std::move(missing));
1902 }
1903 inputs_result.push_back(std::move(input_univ));
1904 }
1905 if (!inputs_result.empty()) result.pushKV("inputs", std::move(inputs_result));
1906
1907 if (psbta.estimated_vsize != std::nullopt) {
1908 result.pushKV("estimated_vsize", (int)*psbta.estimated_vsize);
1909 }
1910 if (psbta.estimated_feerate != std::nullopt) {
1911 result.pushKV("estimated_feerate", ValueFromAmount(psbta.estimated_feerate->GetFeePerK()));
1912 }
1913 if (psbta.fee != std::nullopt) {
1914 result.pushKV("fee", ValueFromAmount(*psbta.fee));
1915 }
1916 result.pushKV("next", PSBTRoleName(psbta.next));
1917 if (!psbta.error.empty()) {
1918 result.pushKV("error", psbta.error);
1919 }
1920
1921 return result;
1922},
1923 };
1924}
1925
1927{
1928 return RPCHelpMan{"descriptorprocesspsbt",
1929 "\nUpdate all segwit inputs in a PSBT with information from output descriptors, the UTXO set or the mempool. \n"
1930 "Then, sign the inputs we are able to with information from the output descriptors. ",
1931 {
1932 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction base64 string"},
1933 {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::NO, "An array of either strings or objects", {
1934 {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
1935 {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
1936 {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
1937 {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
1938 }},
1939 }},
1940 {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type to sign with if not specified by the PSBT. Must be one of\n"
1941 " \"DEFAULT\"\n"
1942 " \"ALL\"\n"
1943 " \"NONE\"\n"
1944 " \"SINGLE\"\n"
1945 " \"ALL|ANYONECANPAY\"\n"
1946 " \"NONE|ANYONECANPAY\"\n"
1947 " \"SINGLE|ANYONECANPAY\""},
1948 {"bip32derivs", RPCArg::Type::BOOL, RPCArg::Default{true}, "Include BIP 32 derivation paths for public keys if we know them"},
1949 {"finalize", RPCArg::Type::BOOL, RPCArg::Default{true}, "Also finalize inputs if possible"},
1950 },
1951 RPCResult{
1952 RPCResult::Type::OBJ, "", "",
1953 {
1954 {RPCResult::Type::STR, "psbt", "The base64-encoded partially signed transaction"},
1955 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
1956 {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if complete"},
1957 }
1958 },
1960 HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[\\\"descriptor1\\\", \\\"descriptor2\\\"]\"") +
1961 HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[{\\\"desc\\\":\\\"mydescriptor\\\", \\\"range\\\":21}]\"")
1962 },
1963 [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1964{
1965 // Add descriptor information to a signing provider
1966 FlatSigningProvider provider;
1967
1968 auto descs = request.params[1].get_array();
1969 for (size_t i = 0; i < descs.size(); ++i) {
1970 EvalDescriptorStringOrObject(descs[i], provider, /*expand_priv=*/true);
1971 }
1972
1973 int sighash_type = ParseSighashString(request.params[2]);
1974 bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
1975 bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
1976
1978 request.params[0].get_str(),
1979 request.context,
1980 HidingSigningProvider(&provider, /*hide_secret=*/false, !bip32derivs),
1981 sighash_type,
1982 finalize);
1983
1984 // Check whether or not all of the inputs are now signed
1985 bool complete = true;
1986 for (const auto& input : psbtx.inputs) {
1987 complete &= PSBTInputSigned(input);
1988 }
1989
1990 DataStream ssTx{};
1991 ssTx << psbtx;
1992
1993 UniValue result(UniValue::VOBJ);
1994
1995 result.pushKV("psbt", EncodeBase64(ssTx));
1996 result.pushKV("complete", complete);
1997 if (complete) {
1999 PartiallySignedTransaction psbtx_copy = psbtx;
2000 CHECK_NONFATAL(FinalizeAndExtractPSBT(psbtx_copy, mtx));
2001 DataStream ssTx_final;
2002 ssTx_final << TX_WITH_WITNESS(mtx);
2003 result.pushKV("hex", HexStr(ssTx_final));
2004 }
2005 return result;
2006},
2007 };
2008}
2009
2011{
2012 static const CRPCCommand commands[]{
2013 {"rawtransactions", &getrawtransaction},
2014 {"rawtransactions", &createrawtransaction},
2015 {"rawtransactions", &decoderawtransaction},
2016 {"rawtransactions", &decodescript},
2017 {"rawtransactions", &combinerawtransaction},
2018 {"rawtransactions", &signrawtransactionwithkey},
2019 {"rawtransactions", &decodepsbt},
2020 {"rawtransactions", &combinepsbt},
2021 {"rawtransactions", &finalizepsbt},
2022 {"rawtransactions", &createpsbt},
2023 {"rawtransactions", &converttopsbt},
2024 {"rawtransactions", &utxoupdatepsbt},
2025 {"rawtransactions", &descriptorprocesspsbt},
2026 {"rawtransactions", &joinpsbts},
2027 {"rawtransactions", &analyzepsbt},
2028 };
2029 for (const auto& c : commands) {
2030 t.appendCommand(c.name, &c);
2031 }
2032}
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
bool MoneyRange(const CAmount &nValue)
Definition amount.h:27
int64_t CAmount
Amount in satoshis (Can be negative)
Definition amount.h:12
std::string EncodeBase58Check(Span< const unsigned char > input)
Encode a byte span into a base58-encoded string, including checksum.
Definition base58.cpp:137
std::string WriteHDKeypath(const std::vector< uint32_t > &keypath, bool apostrophe)
Write HD keypaths as strings.
Definition bip32.cpp:64
@ BLOCK_HAVE_DATA
full block available in blk*.dat
Definition chain.h:121
#define CHECK_NONFATAL(condition)
Identity function.
Definition check.h:73
#define NONFATAL_UNREACHABLE()
NONFATAL_UNREACHABLE() is a macro that is used to mark unreachable code.
Definition check.h:94
uint256 hashMerkleRoot
Definition block.h:27
Definition block.h:69
std::vector< CTransactionRef > vtx
Definition block.h:72
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition chain.h:141
int64_t GetBlockTime() const
Definition chain.h:266
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition chain.h:153
Undo information for a CBlock.
Definition undo.h:63
std::vector< CTxUndo > vtxundo
Definition undo.h:65
int Height() const
Return the maximal height in the chain.
Definition chain.h:462
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
Definition chain.h:447
const CBlock & GenesisBlock() const
Definition chainparams.h:98
void SetBackend(CCoinsView &viewIn)
Definition coins.cpp:29
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition coins.h:360
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
Definition coins.cpp:156
Abstract view on the open txout dataset.
Definition coins.h:304
CCoinsView that brings transactions from a mempool into view.
Definition txmempool.h:835
An encapsulated private key.
Definition key.h:35
bool IsValid() const
Check whether this private key is valid.
Definition key.h:123
CPubKey GetPubKey() const
Compute the public key from a private key.
Definition key.cpp:182
A reference to a CKey: the Hash160 of its serialized public key.
Definition pubkey.h:24
An encapsulated public key.
Definition pubkey.h:34
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Definition pubkey.h:164
RPC command dispatcher.
Definition server.h:133
Serialized script, used inside transaction inputs and outputs.
Definition script.h:414
void clear()
Definition script.h:565
A reference to a CScript: the Hash160 of its serialization.
Definition script.h:591
The basic transaction that is broadcasted on the network and contained in blocks.
An input of a transaction.
Definition transaction.h:67
CScript scriptSig
Definition transaction.h:70
CScriptWitness scriptWitness
Only serialized through CTransaction.
Definition transaction.h:72
COutPoint prevout
Definition transaction.h:69
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition txmempool.h:304
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it.
Definition txmempool.h:390
An output of a transaction.
CScript scriptPubKey
CAmount nValue
bool IsNull() const
Undo information for a CTransaction.
Definition undo.h:53
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Definition validation.h:513
CChain m_chain
The current chain of blockheaders we consult and build on.
Definition validation.h:593
node::BlockManager & m_blockman
Reference to a BlockManager instance which itself is shared across all Chainstate instances.
Definition validation.h:548
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition validation.h:871
SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(Chainstate ActiveChainstate)() const
Once the background validation chainstate has reached the height which is the base of the UTXO snapsh...
const CChainParams & GetParams() const
Definition validation.h:981
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
A UTXO entry.
Definition coins.h:33
CTxOut out
unspent transaction output
Definition coins.h:36
bool IsSpent() const
Either this coin never existed (see e.g.
Definition coins.h:81
Double ended buffer combining vector and stream-like interfaces.
Definition streams.h:147
Fast randomness source.
Definition random.h:377
A signature creator for transactions.
Definition sign.h:40
A Span is an object that can refer to a contiguous sequence of objects.
Definition span.h:98
void push_back(UniValue val)
Definition univalue.cpp:104
size_t size() const
Definition univalue.h:71
const std::vector< std::string > & getKeys() const
bool empty() const
Definition univalue.h:69
const UniValue & get_array() const
void pushKV(std::string key, UniValue val)
Definition univalue.cpp:126
bool IsNull() const
Test whether this is the 0 key (the result of default construction).
Definition pubkey.h:254
constexpr bool IsNull() const
Definition uint256.h:46
std::string GetHex() const
Definition uint256.cpp:11
bool ReadBlockFromDisk(CBlock &block, const FlatFilePos &pos) const
Functions for disk access for blocks.
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool UndoReadFromDisk(CBlockUndo &blockundo, const CBlockIndex &index) const
bool empty() const
Definition prevector.h:300
160-bit opaque blob.
Definition uint256.h:166
256-bit opaque blob.
Definition uint256.h:178
std::string EncodeHexTx(const CTransaction &tx)
std::string SighashToStr(unsigned char sighash_type)
void TxToUniv(const CTransaction &tx, const uint256 &block_hash, UniValue &entry, bool include_hex=true, const CTxUndo *txundo=nullptr, TxVerbosity verbosity=TxVerbosity::SHOW_DETAILS)
TxVerbosity
Verbose level for block's transaction.
Definition core_io.h:27
@ SHOW_DETAILS_AND_PREVOUT
The same as previous option with information about prevouts if available.
@ SHOW_DETAILS
Include TXID, inputs, outputs, and other common block's transaction information.
std::string ScriptToAsmStr(const CScript &script, const bool fAttemptSighashDecode=false)
Create the assembly string representation of a CScript object.
void ScriptToUniv(const CScript &script, UniValue &out, bool include_hex=true, bool include_address=false, const SigningProvider *provider=nullptr)
UniValue ValueFromAmount(const CAmount amount)
bool DecodeHexTx(CMutableTransaction &tx, const std::string &hex_tx, bool try_no_witness=false, bool try_witness=true)
static uint32_t ReadBE32(const unsigned char *ptr)
Definition common.h:59
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition cs_main.cpp:8
const std::string CURRENCY_UNIT
Definition feerate.h:17
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
Definition hash.h:92
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition hex_base.cpp:29
@ SIGHASH_ALL
Definition interpreter.h:30
std::string EncodeDestination(const CTxDestination &dest)
Definition key_io.cpp:291
CKey DecodeSecret(const std::string &str)
Definition key_io.cpp:213
PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
Provides helpful miscellaneous information about where a PSBT is in the signing workflow.
Definition psbt.cpp:16
void FindCoins(const NodeContext &node, std::map< COutPoint, Coin > &coins)
Look up unspent output information.
Definition coin.cpp:12
CTransactionRef GetTransaction(const CBlockIndex *const block_index, const CTxMemPool *const mempool, const uint256 &hash, uint256 &hashBlock, const BlockManager &blockman)
Return transaction with a given hash.
is a home for public enum and struct type definitions that are used by internally by node code,...
static constexpr TransactionSerParams TX_WITH_WITNESS
std::shared_ptr< const CTransaction > CTransactionRef
bool DecodeBase64PSBT(PartiallySignedTransaction &psbt, const std::string &base64_tx, std::string &error)
Decode a base64ed PSBT into a PartiallySignedTransaction.
Definition psbt.cpp:536
void UpdatePSBTOutput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index)
Updates a PSBTOutput with information from provider.
Definition psbt.cpp:338
std::string PSBTRoleName(PSBTRole role)
Definition psbt.cpp:524
bool CombinePSBTs(PartiallySignedTransaction &out, const std::vector< PartiallySignedTransaction > &psbtxs)
Combines PSBTs with the same underlying transaction, resulting in a single PSBT with all partial sign...
Definition psbt.cpp:511
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized.
Definition psbt.cpp:495
void RemoveUnnecessaryTransactions(PartiallySignedTransaction &psbtx, const int &sighash_type)
Reduces the size of the PSBT by dropping unnecessary non_witness_utxos (i.e.
Definition psbt.cpp:448
bool SignPSBTInput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index, const PrecomputedTransactionData *txdata, int sighash, SignatureData *out_sigdata, bool finalize)
Signs a PSBTInput, verifying that all provided data matches what is being signed.
Definition psbt.cpp:375
bool PSBTInputSigned(const PSBTInput &input)
Checks whether a PSBTInput is already signed by checking for non-null finalized fields.
Definition psbt.cpp:293
PrecomputedTransactionData PrecomputePSBTData(const PartiallySignedTransaction &psbt)
Compute a PrecomputedTransactionData object from a psbt.
Definition psbt.cpp:358
const unsigned int BIP32_EXTKEY_WITH_VERSION_SIZE
Definition pubkey.h:20
static RPCHelpMan getrawtransaction()
static RPCHelpMan utxoupdatepsbt()
const RPCResult decodepsbt_inputs
static void TxToJSON(const CTransaction &tx, const uint256 hashBlock, UniValue &entry, Chainstate &active_chainstate, const CTxUndo *txundo=nullptr, TxVerbosity verbosity=TxVerbosity::SHOW_DETAILS)
static RPCHelpMan converttopsbt()
const RPCResult decodepsbt_outputs
static std::vector< RPCArg > CreateTxDoc()
static RPCHelpMan analyzepsbt()
static RPCHelpMan decoderawtransaction()
RPCHelpMan descriptorprocesspsbt()
static RPCHelpMan combinepsbt()
static RPCHelpMan decodepsbt()
PartiallySignedTransaction ProcessPSBT(const std::string &psbt_string, const std::any &context, const HidingSigningProvider &provider, int sighash_type, bool finalize)
static RPCHelpMan decodescript()
static RPCHelpMan createpsbt()
static RPCHelpMan joinpsbts()
static std::vector< RPCResult > DecodeTxDoc(const std::string &txid_field_doc)
static RPCHelpMan combinerawtransaction()
static RPCHelpMan signrawtransactionwithkey()
static RPCHelpMan createrawtransaction()
static RPCHelpMan finalizepsbt()
void RegisterRawTransactionRPCCommands(CRPCTable &t)
static std::vector< RPCResult > ScriptPubKeyDoc()
CMutableTransaction ConstructTransaction(const UniValue &inputs_in, const UniValue &outputs_in, const UniValue &locktime, std::optional< bool > rbf)
Create a transaction from univalue parameters.
void SignTransaction(CMutableTransaction &mtx, const SigningProvider *keystore, const std::map< COutPoint, Coin > &coins, const UniValue &hashType, UniValue &result)
Sign a transaction with the given keystore and previous transactions.
void ParsePrevouts(const UniValue &prevTxsUnival, FlatSigningProvider *keystore, std::map< COutPoint, Coin > &coins)
Parse a prevtxs UniValue array and get the map of coins from it.
UniValue JSONRPCError(int code, const std::string &message)
Definition request.cpp:70
@ RPC_MISC_ERROR
General application defined errors.
Definition protocol.h:40
@ RPC_INVALID_PARAMETER
Invalid, missing or duplicate parameter.
Definition protocol.h:44
@ RPC_VERIFY_ERROR
General error during transaction or block submission.
Definition protocol.h:47
@ RPC_DESERIALIZATION_ERROR
Error parsing or validating structure in raw format.
Definition protocol.h:46
@ RPC_INVALID_ADDRESS_OR_KEY
Invalid address or key.
Definition protocol.h:42
std::vector< CScript > EvalDescriptorStringOrObject(const UniValue &scanobject, FlatSigningProvider &provider, const bool expand_priv)
Evaluate a descriptor given as a string, or as a {"desc":...,"range":...} object, with default range ...
Definition util.cpp:1329
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
Definition util.cpp:168
std::vector< unsigned char > ParseHexV(const UniValue &v, std::string_view name)
Definition util.cpp:115
int ParseSighashString(const UniValue &sighash)
Returns a sighash value corresponding to the passed in argument.
Definition util.cpp:363
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
Definition util.cpp:186
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency.
Definition util.cpp:43
std::string GetAllOutputTypes()
Gets all existing output types formatted for RPC help sections.
Definition util.cpp:46
uint256 ParseHashV(const UniValue &v, std::string_view name)
Utilities: convert hex-encoded Values (throws error if not hex).
Definition util.cpp:102
#define extract(n)
Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits.
bool IsOpSuccess(const opcodetype &opcode)
Test for OP_SUCCESSx opcodes as defined by BIP342.
Definition script.cpp:358
opcodetype
Script opcodes.
Definition script.h:73
@ OP_CHECKSIGADD
Definition script.h:209
NodeContext & EnsureAnyNodeContext(const std::any &context)
CTxMemPool & EnsureMemPool(const NodeContext &node)
ChainstateManager & EnsureChainman(const NodeContext &node)
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
Definition sign.cpp:502
void UpdateInput(CTxIn &input, const SignatureData &data)
Definition sign.cpp:675
bool IsSegWitOutput(const SigningProvider &provider, const CScript &script)
Check whether a scriptPubKey is known to be segwit.
Definition sign.cpp:768
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
Definition sign.cpp:610
const SigningProvider & DUMMY_SIGNING_PROVIDER
TxoutType Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char > > &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
Definition solver.cpp:141
TxoutType
Definition solver.h:22
@ WITNESS_V1_TAPROOT
@ WITNESS_UNKNOWN
Only for Witness versions not already defined above.
@ ANCHOR
anyone can spend script
@ WITNESS_V0_SCRIPTHASH
@ NULL_DATA
unspendable OP_RETURN script that carries data
@ WITNESS_V0_KEYHASH
A mutable version of CTransaction.
std::vector< CTxOut > vout
std::vector< CTxIn > vin
std::vector< std::vector< unsigned char > > stack
Definition script.h:577
bool IsNull() const
Definition script.h:582
void SetNull()
Definition script.h:584
std::map< CKeyID, CPubKey > pubkeys
std::map< CKeyID, CKey > keys
std::map< CScriptID, CScript > scripts
A structure for PSBTs which contain per-input information.
Definition psbt.h:198
std::vector< unsigned char > m_tap_key_sig
Definition psbt.h:213
std::map< CPubKey, KeyOriginInfo > hd_keypaths
Definition psbt.h:205
std::map< uint256, std::vector< unsigned char > > hash256_preimages
Definition psbt.h:210
CScriptWitness final_script_witness
Definition psbt.h:204
std::map< std::pair< std::vector< unsigned char >, int >, std::set< std::vector< unsigned char >, ShortestVectorFirstComparator > > m_tap_scripts
Definition psbt.h:215
CTransactionRef non_witness_utxo
Definition psbt.h:199
std::map< CKeyID, SigPair > partial_sigs
Definition psbt.h:206
std::optional< int > sighash_type
Definition psbt.h:222
std::map< std::pair< XOnlyPubKey, uint256 >, std::vector< unsigned char > > m_tap_script_sigs
Definition psbt.h:214
uint256 m_tap_merkle_root
Definition psbt.h:218
std::map< uint256, std::vector< unsigned char > > sha256_preimages
Definition psbt.h:208
std::map< uint160, std::vector< unsigned char > > hash160_preimages
Definition psbt.h:209
std::set< PSBTProprietary > m_proprietary
Definition psbt.h:221
CScript redeem_script
Definition psbt.h:201
CScript final_script_sig
Definition psbt.h:203
XOnlyPubKey m_tap_internal_key
Definition psbt.h:217
std::map< XOnlyPubKey, std::pair< std::set< uint256 >, KeyOriginInfo > > m_tap_bip32_paths
Definition psbt.h:216
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition psbt.h:220
std::map< uint160, std::vector< unsigned char > > ripemd160_preimages
Definition psbt.h:207
CTxOut witness_utxo
Definition psbt.h:200
CScript witness_script
Definition psbt.h:202
A structure for PSBTs which contains per output information.
Definition psbt.h:715
XOnlyPubKey m_tap_internal_key
Definition psbt.h:719
std::map< XOnlyPubKey, std::pair< std::set< uint256 >, KeyOriginInfo > > m_tap_bip32_paths
Definition psbt.h:721
CScript witness_script
Definition psbt.h:717
std::set< PSBTProprietary > m_proprietary
Definition psbt.h:723
CScript redeem_script
Definition psbt.h:716
std::map< CPubKey, KeyOriginInfo > hd_keypaths
Definition psbt.h:718
std::vector< std::tuple< uint8_t, uint8_t, std::vector< unsigned char > > > m_tap_tree
Definition psbt.h:720
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition psbt.h:722
A version of CTransaction with the PSBT format.
Definition psbt.h:951
uint32_t GetVersion() const
Definition psbt.cpp:562
std::map< KeyOriginInfo, std::set< CExtPubKey > > m_xpubs
Definition psbt.h:955
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition psbt.h:958
bool AddOutput(const CTxOut &txout, const PSBTOutput &psbtout)
Definition psbt.cpp:62
std::vector< PSBTInput > inputs
Definition psbt.h:956
std::optional< CMutableTransaction > tx
Definition psbt.h:952
bool AddInput(const CTxIn &txin, PSBTInput &psbtin)
Definition psbt.cpp:49
std::vector< PSBTOutput > outputs
Definition psbt.h:957
std::set< PSBTProprietary > m_proprietary
Definition psbt.h:960
@ RANGE
Special type that is a NUM or [NUM,NUM].
@ OBJ_USER_KEYS
Special type where the user must set the keys e.g. to define multiple addresses; as opposed to e....
@ STR_HEX
Special type that is a STR with only hex chars.
@ AMOUNT
Special type representing a floating point amount (can be either NUM or STR)
std::string DefaultHint
Hint for default value.
Definition util.h:206
@ OMITTED
Optional argument for which the default value is omitted from help text for one of two reasons:
@ NO
Required arg.
@ ELISION
Special type to denote elision (...)
@ NUM_TIME
Special numeric to denote unix epoch time.
@ OBJ_DYN
Special dictionary with keys that are not literals.
@ STR_HEX
Special string with only hex chars.
@ STR_AMOUNT
Special string to represent a floating point amount.
void MergeSignatureData(SignatureData sigdata)
Definition sign.cpp:681
NodeContext struct containing references to chain state and connection state.
Definition context.h:55
Holds the results of AnalyzePSBT (miscellaneous information about a PSBT)
Definition psbt.h:30
std::vector< PSBTInputAnalysis > inputs
More information about the individual inputs of the transaction.
Definition psbt.h:34
std::string error
Error message.
Definition psbt.h:36
std::optional< CAmount > fee
Amount of fee being paid by the transaction.
Definition psbt.h:33
std::optional< size_t > estimated_vsize
Estimated weight of the transaction.
Definition psbt.h:31
std::optional< CFeeRate > estimated_feerate
Estimated feerate (fee / weight) of the transaction.
Definition psbt.h:32
PSBTRole next
Which of the BIP 174 roles needs to handle the transaction next.
Definition psbt.h:35
#define LOCK2(cs1, cs2)
Definition sync.h:258
#define LOCK(cs)
Definition sync.h:257
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition sync.h:301
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
std::unique_ptr< TxIndex > g_txindex
The global transaction index, used in GetTransaction. May be null.
Definition txindex.cpp:16
std::string EncodeBase64(Span< const unsigned char > input)
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.
Definition vector.h:34