Bitcoin Core  27.99.0
P2P Digital Currency
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>
10 #include <consensus/validation.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>
23 #include <primitives/transaction.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>
33 #include <script/signingprovider.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 
50 using node::AnalyzePSBT;
51 using node::FindCoins;
53 using node::NodeContext;
54 using node::PSBTAnalysis;
55 
56 static 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()) {
69  LOCK(cs_main);
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 
85 static 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 
96 static 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 
137 static 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.
177 PartiallySignedTransaction 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 
203  CTransactionRef tx;
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, "", "",
288  Cat<std::vector<RPCResult>>(
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  },
320  RPCExamples{
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  },
438  RPCExamples{
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  },
475  RPCExamples{
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  },
527  RPCExamples{
528  HelpExampleCli("decodescript", "\"hexstring\"")
529  + HelpExampleRpc("decodescript", "\"hexstring\"")
530  },
531  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
532 {
534  CScript script;
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) {
548  case TxoutType::MULTISIG:
550  case TxoutType::PUBKEY:
554  // Can be wrapped if the checks below pass
555  break;
560  // Should not be wrapped
561  return false;
562  } // no default case, so the compiler can warn about missing cases
563  if (!script.HasValidOps() || script.IsUnspendable()) {
564  return false;
565  }
566  for (CScript::const_iterator it{script.begin()}; it != script.end();) {
567  opcodetype op;
568  CHECK_NONFATAL(script.GetOp(it, op));
569  if (op == OP_CHECKSIGADD || IsOpSuccess(op)) {
570  return false;
571  }
572  }
573  return true;
574  }()};
575 
576  if (can_wrap) {
578  // P2SH and witness programs cannot be wrapped in P2WSH, if this script
579  // is a witness program, don't return addresses for a segwit programs.
580  const bool can_wrap_P2WSH{[&] {
581  switch (which_type) {
582  case TxoutType::MULTISIG:
583  case TxoutType::PUBKEY:
584  // Uncompressed pubkeys cannot be used with segwit checksigs.
585  // If the script contains an uncompressed pubkey, skip encoding of a segwit program.
586  for (const auto& solution : solutions_data) {
587  if ((solution.size() != 1) && !CPubKey(solution).IsCompressed()) {
588  return false;
589  }
590  }
591  return true;
594  // Can be P2WSH wrapped
595  return true;
602  // Should not be wrapped
603  return false;
604  } // no default case, so the compiler can warn about missing cases
606  }()};
607  if (can_wrap_P2WSH) {
609  CScript segwitScr;
610  FlatSigningProvider provider;
611  if (which_type == TxoutType::PUBKEY) {
612  segwitScr = GetScriptForDestination(WitnessV0KeyHash(Hash160(solutions_data[0])));
613  } else if (which_type == TxoutType::PUBKEYHASH) {
614  segwitScr = GetScriptForDestination(WitnessV0KeyHash(uint160{solutions_data[0]}));
615  } else {
616  // Scripts that are not fit for P2WPKH are encoded as P2WSH.
617  provider.scripts[CScriptID(script)] = script;
619  }
620  ScriptToUniv(segwitScr, /*out=*/sr, /*include_hex=*/true, /*include_address=*/true, /*provider=*/&provider);
621  sr.pushKV("p2sh-segwit", EncodeDestination(ScriptHash(segwitScr)));
622  r.pushKV("segwit", std::move(sr));
623  }
624  }
625 
626  return r;
627 },
628  };
629 }
630 
632 {
633  return RPCHelpMan{"combinerawtransaction",
634  "\nCombine multiple partially signed transactions into one transaction.\n"
635  "The combined transaction may be another partially signed transaction or a \n"
636  "fully signed transaction.",
637  {
638  {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The hex strings of partially signed transactions",
639  {
640  {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "A hex-encoded raw transaction"},
641  },
642  },
643  },
644  RPCResult{
645  RPCResult::Type::STR, "", "The hex-encoded raw transaction with signature(s)"
646  },
647  RPCExamples{
648  HelpExampleCli("combinerawtransaction", R"('["myhex1", "myhex2", "myhex3"]')")
649  },
650  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
651 {
652 
653  UniValue txs = request.params[0].get_array();
654  std::vector<CMutableTransaction> txVariants(txs.size());
655 
656  for (unsigned int idx = 0; idx < txs.size(); idx++) {
657  if (!DecodeHexTx(txVariants[idx], txs[idx].get_str())) {
658  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed for tx %d. Make sure the tx has at least one input.", idx));
659  }
660  }
661 
662  if (txVariants.empty()) {
663  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transactions");
664  }
665 
666  // mergedTx will end up with all the signatures; it
667  // starts as a clone of the rawtx:
668  CMutableTransaction mergedTx(txVariants[0]);
669 
670  // Fetch previous transactions (inputs):
671  CCoinsView viewDummy;
672  CCoinsViewCache view(&viewDummy);
673  {
674  NodeContext& node = EnsureAnyNodeContext(request.context);
675  const CTxMemPool& mempool = EnsureMemPool(node);
677  LOCK2(cs_main, mempool.cs);
678  CCoinsViewCache &viewChain = chainman.ActiveChainstate().CoinsTip();
679  CCoinsViewMemPool viewMempool(&viewChain, mempool);
680  view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view
681 
682  for (const CTxIn& txin : mergedTx.vin) {
683  view.AccessCoin(txin.prevout); // Load entries from viewChain into view; can fail.
684  }
685 
686  view.SetBackend(viewDummy); // switch back to avoid locking mempool for too long
687  }
688 
689  // Use CTransaction for the constant parts of the
690  // transaction to avoid rehashing.
691  const CTransaction txConst(mergedTx);
692  // Sign what we can:
693  for (unsigned int i = 0; i < mergedTx.vin.size(); i++) {
694  CTxIn& txin = mergedTx.vin[i];
695  const Coin& coin = view.AccessCoin(txin.prevout);
696  if (coin.IsSpent()) {
697  throw JSONRPCError(RPC_VERIFY_ERROR, "Input not found or already spent");
698  }
699  SignatureData sigdata;
700 
701  // ... and merge in other signatures:
702  for (const CMutableTransaction& txv : txVariants) {
703  if (txv.vin.size() > i) {
704  sigdata.MergeSignatureData(DataFromTransaction(txv, i, coin.out));
705  }
706  }
708 
709  UpdateInput(txin, sigdata);
710  }
711 
712  return EncodeHexTx(CTransaction(mergedTx));
713 },
714  };
715 }
716 
718 {
719  return RPCHelpMan{"signrawtransactionwithkey",
720  "\nSign inputs for raw transaction (serialized, hex-encoded).\n"
721  "The second argument is an array of base58-encoded private\n"
722  "keys that will be the only keys used to sign the transaction.\n"
723  "The third optional argument (may be null) is an array of previous transaction outputs that\n"
724  "this transaction depends on but may not yet be in the block chain.\n",
725  {
726  {"hexstring", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction hex string"},
727  {"privkeys", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base58-encoded private keys for signing",
728  {
729  {"privatekey", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "private key in base58-encoding"},
730  },
731  },
732  {"prevtxs", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The previous dependent transaction outputs",
733  {
735  {
736  {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
737  {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
738  {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "script key"},
739  {"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"},
740  {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"},
741  {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "(required for Segwit inputs) the amount spent"},
742  },
743  },
744  },
745  },
746  {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type. Must be one of:\n"
747  " \"DEFAULT\"\n"
748  " \"ALL\"\n"
749  " \"NONE\"\n"
750  " \"SINGLE\"\n"
751  " \"ALL|ANYONECANPAY\"\n"
752  " \"NONE|ANYONECANPAY\"\n"
753  " \"SINGLE|ANYONECANPAY\"\n"
754  },
755  },
756  RPCResult{
757  RPCResult::Type::OBJ, "", "",
758  {
759  {RPCResult::Type::STR_HEX, "hex", "The hex-encoded raw transaction with signature(s)"},
760  {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
761  {RPCResult::Type::ARR, "errors", /*optional=*/true, "Script verification errors (if there are any)",
762  {
763  {RPCResult::Type::OBJ, "", "",
764  {
765  {RPCResult::Type::STR_HEX, "txid", "The hash of the referenced, previous transaction"},
766  {RPCResult::Type::NUM, "vout", "The index of the output to spent and used as input"},
767  {RPCResult::Type::ARR, "witness", "",
768  {
769  {RPCResult::Type::STR_HEX, "witness", ""},
770  }},
771  {RPCResult::Type::STR_HEX, "scriptSig", "The hex-encoded signature script"},
772  {RPCResult::Type::NUM, "sequence", "Script sequence number"},
773  {RPCResult::Type::STR, "error", "Verification or signing error related to the input"},
774  }},
775  }},
776  }
777  },
778  RPCExamples{
779  HelpExampleCli("signrawtransactionwithkey", "\"myhex\" \"[\\\"key1\\\",\\\"key2\\\"]\"")
780  + HelpExampleRpc("signrawtransactionwithkey", "\"myhex\", \"[\\\"key1\\\",\\\"key2\\\"]\"")
781  },
782  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
783 {
785  if (!DecodeHexTx(mtx, request.params[0].get_str())) {
786  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed. Make sure the tx has at least one input.");
787  }
788 
789  FlatSigningProvider keystore;
790  const UniValue& keys = request.params[1].get_array();
791  for (unsigned int idx = 0; idx < keys.size(); ++idx) {
792  UniValue k = keys[idx];
793  CKey key = DecodeSecret(k.get_str());
794  if (!key.IsValid()) {
795  throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
796  }
797 
798  CPubKey pubkey = key.GetPubKey();
799  CKeyID key_id = pubkey.GetID();
800  keystore.pubkeys.emplace(key_id, pubkey);
801  keystore.keys.emplace(key_id, key);
802  }
803 
804  // Fetch previous transactions (inputs):
805  std::map<COutPoint, Coin> coins;
806  for (const CTxIn& txin : mtx.vin) {
807  coins[txin.prevout]; // Create empty map entry keyed by prevout.
808  }
809  NodeContext& node = EnsureAnyNodeContext(request.context);
810  FindCoins(node, coins);
811 
812  // Parse the prevtxs array
813  ParsePrevouts(request.params[2], &keystore, coins);
814 
815  UniValue result(UniValue::VOBJ);
816  SignTransaction(mtx, &keystore, coins, request.params[3], result);
817  return result;
818 },
819  };
820 }
821 
823  RPCResult::Type::ARR, "inputs", "",
824  {
825  {RPCResult::Type::OBJ, "", "",
826  {
827  {RPCResult::Type::OBJ, "non_witness_utxo", /*optional=*/true, "Decoded network transaction for non-witness UTXOs",
828  {
829  {RPCResult::Type::ELISION, "",""},
830  }},
831  {RPCResult::Type::OBJ, "witness_utxo", /*optional=*/true, "Transaction output for witness UTXOs",
832  {
833  {RPCResult::Type::NUM, "amount", "The value in " + CURRENCY_UNIT},
834  {RPCResult::Type::OBJ, "scriptPubKey", "",
835  {
836  {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
837  {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
838  {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
839  {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
840  {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
841  }},
842  }},
843  {RPCResult::Type::OBJ_DYN, "partial_signatures", /*optional=*/true, "",
844  {
845  {RPCResult::Type::STR, "pubkey", "The public key and signature that corresponds to it."},
846  }},
847  {RPCResult::Type::STR, "sighash", /*optional=*/true, "The sighash type to be used"},
848  {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
849  {
850  {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
851  {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
852  {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
853  }},
854  {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
855  {
856  {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
857  {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
858  {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
859  }},
860  {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
861  {
862  {RPCResult::Type::OBJ, "", "",
863  {
864  {RPCResult::Type::STR, "pubkey", "The public key with the derivation path as the value."},
865  {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
866  {RPCResult::Type::STR, "path", "The path"},
867  }},
868  }},
869  {RPCResult::Type::OBJ, "final_scriptSig", /*optional=*/true, "",
870  {
871  {RPCResult::Type::STR, "asm", "Disassembly of the final signature script"},
872  {RPCResult::Type::STR_HEX, "hex", "The raw final signature script bytes, hex-encoded"},
873  }},
874  {RPCResult::Type::ARR, "final_scriptwitness", /*optional=*/true, "",
875  {
876  {RPCResult::Type::STR_HEX, "", "hex-encoded witness data (if any)"},
877  }},
878  {RPCResult::Type::OBJ_DYN, "ripemd160_preimages", /*optional=*/ true, "",
879  {
880  {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
881  }},
882  {RPCResult::Type::OBJ_DYN, "sha256_preimages", /*optional=*/ true, "",
883  {
884  {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
885  }},
886  {RPCResult::Type::OBJ_DYN, "hash160_preimages", /*optional=*/ true, "",
887  {
888  {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
889  }},
890  {RPCResult::Type::OBJ_DYN, "hash256_preimages", /*optional=*/ true, "",
891  {
892  {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
893  }},
894  {RPCResult::Type::STR_HEX, "taproot_key_path_sig", /*optional=*/ true, "hex-encoded signature for the Taproot key path spend"},
895  {RPCResult::Type::ARR, "taproot_script_path_sigs", /*optional=*/ true, "",
896  {
897  {RPCResult::Type::OBJ, "signature", /*optional=*/ true, "The signature for the pubkey and leaf hash combination",
898  {
899  {RPCResult::Type::STR, "pubkey", "The x-only pubkey for this signature"},
900  {RPCResult::Type::STR, "leaf_hash", "The leaf hash for this signature"},
901  {RPCResult::Type::STR, "sig", "The signature itself"},
902  }},
903  }},
904  {RPCResult::Type::ARR, "taproot_scripts", /*optional=*/ true, "",
905  {
906  {RPCResult::Type::OBJ, "", "",
907  {
908  {RPCResult::Type::STR_HEX, "script", "A leaf script"},
909  {RPCResult::Type::NUM, "leaf_ver", "The version number for the leaf script"},
910  {RPCResult::Type::ARR, "control_blocks", "The control blocks for this script",
911  {
912  {RPCResult::Type::STR_HEX, "control_block", "A hex-encoded control block for this script"},
913  }},
914  }},
915  }},
916  {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
917  {
918  {RPCResult::Type::OBJ, "", "",
919  {
920  {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
921  {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
922  {RPCResult::Type::STR, "path", "The path"},
923  {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
924  {
925  {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
926  }},
927  }},
928  }},
929  {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
930  {RPCResult::Type::STR_HEX, "taproot_merkle_root", /*optional=*/ true, "The hex-encoded Taproot merkle root"},
931  {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/ true, "The unknown input fields",
932  {
933  {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
934  }},
935  {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The input proprietary map",
936  {
937  {RPCResult::Type::OBJ, "", "",
938  {
939  {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
940  {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
941  {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
942  {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
943  }},
944  }},
945  }},
946  }
947 };
948 
950  RPCResult::Type::ARR, "outputs", "",
951  {
952  {RPCResult::Type::OBJ, "", "",
953  {
954  {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
955  {
956  {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
957  {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
958  {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
959  }},
960  {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
961  {
962  {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
963  {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
964  {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
965  }},
966  {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
967  {
968  {RPCResult::Type::OBJ, "", "",
969  {
970  {RPCResult::Type::STR, "pubkey", "The public key this path corresponds to"},
971  {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
972  {RPCResult::Type::STR, "path", "The path"},
973  }},
974  }},
975  {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
976  {RPCResult::Type::ARR, "taproot_tree", /*optional=*/ true, "The tuples that make up the Taproot tree, in depth first search order",
977  {
978  {RPCResult::Type::OBJ, "tuple", /*optional=*/ true, "A single leaf script in the taproot tree",
979  {
980  {RPCResult::Type::NUM, "depth", "The depth of this element in the tree"},
981  {RPCResult::Type::NUM, "leaf_ver", "The version of this leaf"},
982  {RPCResult::Type::STR, "script", "The hex-encoded script itself"},
983  }},
984  }},
985  {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
986  {
987  {RPCResult::Type::OBJ, "", "",
988  {
989  {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
990  {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
991  {RPCResult::Type::STR, "path", "The path"},
992  {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
993  {
994  {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
995  }},
996  }},
997  }},
998  {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown output fields",
999  {
1000  {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1001  }},
1002  {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The output proprietary map",
1003  {
1004  {RPCResult::Type::OBJ, "", "",
1005  {
1006  {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1007  {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1008  {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1009  {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1010  }},
1011  }},
1012  }},
1013  }
1014 };
1015 
1017 {
1018  return RPCHelpMan{
1019  "decodepsbt",
1020  "Return a JSON object representing the serialized, base64-encoded partially signed Bitcoin transaction.",
1021  {
1022  {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The PSBT base64 string"},
1023  },
1024  RPCResult{
1025  RPCResult::Type::OBJ, "", "",
1026  {
1027  {RPCResult::Type::OBJ, "tx", "The decoded network-serialized unsigned transaction.",
1028  {
1029  {RPCResult::Type::ELISION, "", "The layout is the same as the output of decoderawtransaction."},
1030  }},
1031  {RPCResult::Type::ARR, "global_xpubs", "",
1032  {
1033  {RPCResult::Type::OBJ, "", "",
1034  {
1035  {RPCResult::Type::STR, "xpub", "The extended public key this path corresponds to"},
1036  {RPCResult::Type::STR_HEX, "master_fingerprint", "The fingerprint of the master key"},
1037  {RPCResult::Type::STR, "path", "The path"},
1038  }},
1039  }},
1040  {RPCResult::Type::NUM, "psbt_version", "The PSBT version number. Not to be confused with the unsigned transaction version"},
1041  {RPCResult::Type::ARR, "proprietary", "The global proprietary map",
1042  {
1043  {RPCResult::Type::OBJ, "", "",
1044  {
1045  {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1046  {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1047  {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1048  {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1049  }},
1050  }},
1051  {RPCResult::Type::OBJ_DYN, "unknown", "The unknown global fields",
1052  {
1053  {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1054  }},
1057  {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid if all UTXOs slots in the PSBT have been filled."},
1058  }
1059  },
1060  RPCExamples{
1061  HelpExampleCli("decodepsbt", "\"psbt\"")
1062  },
1063  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1064 {
1065  // Unserialize the transactions
1067  std::string error;
1068  if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1069  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1070  }
1071 
1072  UniValue result(UniValue::VOBJ);
1073 
1074  // Add the decoded tx
1075  UniValue tx_univ(UniValue::VOBJ);
1076  TxToUniv(CTransaction(*psbtx.tx), /*block_hash=*/uint256(), /*entry=*/tx_univ, /*include_hex=*/false);
1077  result.pushKV("tx", std::move(tx_univ));
1078 
1079  // Add the global xpubs
1080  UniValue global_xpubs(UniValue::VARR);
1081  for (std::pair<KeyOriginInfo, std::set<CExtPubKey>> xpub_pair : psbtx.m_xpubs) {
1082  for (auto& xpub : xpub_pair.second) {
1083  std::vector<unsigned char> ser_xpub;
1084  ser_xpub.assign(BIP32_EXTKEY_WITH_VERSION_SIZE, 0);
1085  xpub.EncodeWithVersion(ser_xpub.data());
1086 
1087  UniValue keypath(UniValue::VOBJ);
1088  keypath.pushKV("xpub", EncodeBase58Check(ser_xpub));
1089  keypath.pushKV("master_fingerprint", HexStr(Span<unsigned char>(xpub_pair.first.fingerprint, xpub_pair.first.fingerprint + 4)));
1090  keypath.pushKV("path", WriteHDKeypath(xpub_pair.first.path));
1091  global_xpubs.push_back(std::move(keypath));
1092  }
1093  }
1094  result.pushKV("global_xpubs", std::move(global_xpubs));
1095 
1096  // PSBT version
1097  result.pushKV("psbt_version", static_cast<uint64_t>(psbtx.GetVersion()));
1098 
1099  // Proprietary
1100  UniValue proprietary(UniValue::VARR);
1101  for (const auto& entry : psbtx.m_proprietary) {
1102  UniValue this_prop(UniValue::VOBJ);
1103  this_prop.pushKV("identifier", HexStr(entry.identifier));
1104  this_prop.pushKV("subtype", entry.subtype);
1105  this_prop.pushKV("key", HexStr(entry.key));
1106  this_prop.pushKV("value", HexStr(entry.value));
1107  proprietary.push_back(std::move(this_prop));
1108  }
1109  result.pushKV("proprietary", std::move(proprietary));
1110 
1111  // Unknown data
1112  UniValue unknowns(UniValue::VOBJ);
1113  for (auto entry : psbtx.unknown) {
1114  unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1115  }
1116  result.pushKV("unknown", std::move(unknowns));
1117 
1118  // inputs
1119  CAmount total_in = 0;
1120  bool have_all_utxos = true;
1121  UniValue inputs(UniValue::VARR);
1122  for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
1123  const PSBTInput& input = psbtx.inputs[i];
1125  // UTXOs
1126  bool have_a_utxo = false;
1127  CTxOut txout;
1128  if (!input.witness_utxo.IsNull()) {
1129  txout = input.witness_utxo;
1130 
1132  ScriptToUniv(txout.scriptPubKey, /*out=*/o, /*include_hex=*/true, /*include_address=*/true);
1133 
1135  out.pushKV("amount", ValueFromAmount(txout.nValue));
1136  out.pushKV("scriptPubKey", std::move(o));
1137 
1138  in.pushKV("witness_utxo", std::move(out));
1139 
1140  have_a_utxo = true;
1141  }
1142  if (input.non_witness_utxo) {
1143  txout = input.non_witness_utxo->vout[psbtx.tx->vin[i].prevout.n];
1144 
1145  UniValue non_wit(UniValue::VOBJ);
1146  TxToUniv(*input.non_witness_utxo, /*block_hash=*/uint256(), /*entry=*/non_wit, /*include_hex=*/false);
1147  in.pushKV("non_witness_utxo", std::move(non_wit));
1148 
1149  have_a_utxo = true;
1150  }
1151  if (have_a_utxo) {
1152  if (MoneyRange(txout.nValue) && MoneyRange(total_in + txout.nValue)) {
1153  total_in += txout.nValue;
1154  } else {
1155  // Hack to just not show fee later
1156  have_all_utxos = false;
1157  }
1158  } else {
1159  have_all_utxos = false;
1160  }
1161 
1162  // Partial sigs
1163  if (!input.partial_sigs.empty()) {
1164  UniValue partial_sigs(UniValue::VOBJ);
1165  for (const auto& sig : input.partial_sigs) {
1166  partial_sigs.pushKV(HexStr(sig.second.first), HexStr(sig.second.second));
1167  }
1168  in.pushKV("partial_signatures", std::move(partial_sigs));
1169  }
1170 
1171  // Sighash
1172  if (input.sighash_type != std::nullopt) {
1173  in.pushKV("sighash", SighashToStr((unsigned char)*input.sighash_type));
1174  }
1175 
1176  // Redeem script and witness script
1177  if (!input.redeem_script.empty()) {
1179  ScriptToUniv(input.redeem_script, /*out=*/r);
1180  in.pushKV("redeem_script", std::move(r));
1181  }
1182  if (!input.witness_script.empty()) {
1184  ScriptToUniv(input.witness_script, /*out=*/r);
1185  in.pushKV("witness_script", std::move(r));
1186  }
1187 
1188  // keypaths
1189  if (!input.hd_keypaths.empty()) {
1190  UniValue keypaths(UniValue::VARR);
1191  for (auto entry : input.hd_keypaths) {
1192  UniValue keypath(UniValue::VOBJ);
1193  keypath.pushKV("pubkey", HexStr(entry.first));
1194 
1195  keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1196  keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1197  keypaths.push_back(std::move(keypath));
1198  }
1199  in.pushKV("bip32_derivs", std::move(keypaths));
1200  }
1201 
1202  // Final scriptSig and scriptwitness
1203  if (!input.final_script_sig.empty()) {
1204  UniValue scriptsig(UniValue::VOBJ);
1205  scriptsig.pushKV("asm", ScriptToAsmStr(input.final_script_sig, true));
1206  scriptsig.pushKV("hex", HexStr(input.final_script_sig));
1207  in.pushKV("final_scriptSig", std::move(scriptsig));
1208  }
1209  if (!input.final_script_witness.IsNull()) {
1210  UniValue txinwitness(UniValue::VARR);
1211  for (const auto& item : input.final_script_witness.stack) {
1212  txinwitness.push_back(HexStr(item));
1213  }
1214  in.pushKV("final_scriptwitness", std::move(txinwitness));
1215  }
1216 
1217  // Ripemd160 hash preimages
1218  if (!input.ripemd160_preimages.empty()) {
1219  UniValue ripemd160_preimages(UniValue::VOBJ);
1220  for (const auto& [hash, preimage] : input.ripemd160_preimages) {
1221  ripemd160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1222  }
1223  in.pushKV("ripemd160_preimages", std::move(ripemd160_preimages));
1224  }
1225 
1226  // Sha256 hash preimages
1227  if (!input.sha256_preimages.empty()) {
1228  UniValue sha256_preimages(UniValue::VOBJ);
1229  for (const auto& [hash, preimage] : input.sha256_preimages) {
1230  sha256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1231  }
1232  in.pushKV("sha256_preimages", std::move(sha256_preimages));
1233  }
1234 
1235  // Hash160 hash preimages
1236  if (!input.hash160_preimages.empty()) {
1237  UniValue hash160_preimages(UniValue::VOBJ);
1238  for (const auto& [hash, preimage] : input.hash160_preimages) {
1239  hash160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1240  }
1241  in.pushKV("hash160_preimages", std::move(hash160_preimages));
1242  }
1243 
1244  // Hash256 hash preimages
1245  if (!input.hash256_preimages.empty()) {
1246  UniValue hash256_preimages(UniValue::VOBJ);
1247  for (const auto& [hash, preimage] : input.hash256_preimages) {
1248  hash256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1249  }
1250  in.pushKV("hash256_preimages", std::move(hash256_preimages));
1251  }
1252 
1253  // Taproot key path signature
1254  if (!input.m_tap_key_sig.empty()) {
1255  in.pushKV("taproot_key_path_sig", HexStr(input.m_tap_key_sig));
1256  }
1257 
1258  // Taproot script path signatures
1259  if (!input.m_tap_script_sigs.empty()) {
1260  UniValue script_sigs(UniValue::VARR);
1261  for (const auto& [pubkey_leaf, sig] : input.m_tap_script_sigs) {
1262  const auto& [xonly, leaf_hash] = pubkey_leaf;
1263  UniValue sigobj(UniValue::VOBJ);
1264  sigobj.pushKV("pubkey", HexStr(xonly));
1265  sigobj.pushKV("leaf_hash", HexStr(leaf_hash));
1266  sigobj.pushKV("sig", HexStr(sig));
1267  script_sigs.push_back(std::move(sigobj));
1268  }
1269  in.pushKV("taproot_script_path_sigs", std::move(script_sigs));
1270  }
1271 
1272  // Taproot leaf scripts
1273  if (!input.m_tap_scripts.empty()) {
1274  UniValue tap_scripts(UniValue::VARR);
1275  for (const auto& [leaf, control_blocks] : input.m_tap_scripts) {
1276  const auto& [script, leaf_ver] = leaf;
1277  UniValue script_info(UniValue::VOBJ);
1278  script_info.pushKV("script", HexStr(script));
1279  script_info.pushKV("leaf_ver", leaf_ver);
1280  UniValue control_blocks_univ(UniValue::VARR);
1281  for (const auto& control_block : control_blocks) {
1282  control_blocks_univ.push_back(HexStr(control_block));
1283  }
1284  script_info.pushKV("control_blocks", std::move(control_blocks_univ));
1285  tap_scripts.push_back(std::move(script_info));
1286  }
1287  in.pushKV("taproot_scripts", std::move(tap_scripts));
1288  }
1289 
1290  // Taproot bip32 keypaths
1291  if (!input.m_tap_bip32_paths.empty()) {
1292  UniValue keypaths(UniValue::VARR);
1293  for (const auto& [xonly, leaf_origin] : input.m_tap_bip32_paths) {
1294  const auto& [leaf_hashes, origin] = leaf_origin;
1295  UniValue path_obj(UniValue::VOBJ);
1296  path_obj.pushKV("pubkey", HexStr(xonly));
1297  path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1298  path_obj.pushKV("path", WriteHDKeypath(origin.path));
1299  UniValue leaf_hashes_arr(UniValue::VARR);
1300  for (const auto& leaf_hash : leaf_hashes) {
1301  leaf_hashes_arr.push_back(HexStr(leaf_hash));
1302  }
1303  path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1304  keypaths.push_back(std::move(path_obj));
1305  }
1306  in.pushKV("taproot_bip32_derivs", std::move(keypaths));
1307  }
1308 
1309  // Taproot internal key
1310  if (!input.m_tap_internal_key.IsNull()) {
1311  in.pushKV("taproot_internal_key", HexStr(input.m_tap_internal_key));
1312  }
1313 
1314  // Write taproot merkle root
1315  if (!input.m_tap_merkle_root.IsNull()) {
1316  in.pushKV("taproot_merkle_root", HexStr(input.m_tap_merkle_root));
1317  }
1318 
1319  // Proprietary
1320  if (!input.m_proprietary.empty()) {
1321  UniValue proprietary(UniValue::VARR);
1322  for (const auto& entry : input.m_proprietary) {
1323  UniValue this_prop(UniValue::VOBJ);
1324  this_prop.pushKV("identifier", HexStr(entry.identifier));
1325  this_prop.pushKV("subtype", entry.subtype);
1326  this_prop.pushKV("key", HexStr(entry.key));
1327  this_prop.pushKV("value", HexStr(entry.value));
1328  proprietary.push_back(std::move(this_prop));
1329  }
1330  in.pushKV("proprietary", std::move(proprietary));
1331  }
1332 
1333  // Unknown data
1334  if (input.unknown.size() > 0) {
1335  UniValue unknowns(UniValue::VOBJ);
1336  for (auto entry : input.unknown) {
1337  unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1338  }
1339  in.pushKV("unknown", std::move(unknowns));
1340  }
1341 
1342  inputs.push_back(std::move(in));
1343  }
1344  result.pushKV("inputs", std::move(inputs));
1345 
1346  // outputs
1347  CAmount output_value = 0;
1348  UniValue outputs(UniValue::VARR);
1349  for (unsigned int i = 0; i < psbtx.outputs.size(); ++i) {
1350  const PSBTOutput& output = psbtx.outputs[i];
1352  // Redeem script and witness script
1353  if (!output.redeem_script.empty()) {
1355  ScriptToUniv(output.redeem_script, /*out=*/r);
1356  out.pushKV("redeem_script", std::move(r));
1357  }
1358  if (!output.witness_script.empty()) {
1360  ScriptToUniv(output.witness_script, /*out=*/r);
1361  out.pushKV("witness_script", std::move(r));
1362  }
1363 
1364  // keypaths
1365  if (!output.hd_keypaths.empty()) {
1366  UniValue keypaths(UniValue::VARR);
1367  for (auto entry : output.hd_keypaths) {
1368  UniValue keypath(UniValue::VOBJ);
1369  keypath.pushKV("pubkey", HexStr(entry.first));
1370  keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1371  keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1372  keypaths.push_back(std::move(keypath));
1373  }
1374  out.pushKV("bip32_derivs", std::move(keypaths));
1375  }
1376 
1377  // Taproot internal key
1378  if (!output.m_tap_internal_key.IsNull()) {
1379  out.pushKV("taproot_internal_key", HexStr(output.m_tap_internal_key));
1380  }
1381 
1382  // Taproot tree
1383  if (!output.m_tap_tree.empty()) {
1384  UniValue tree(UniValue::VARR);
1385  for (const auto& [depth, leaf_ver, script] : output.m_tap_tree) {
1386  UniValue elem(UniValue::VOBJ);
1387  elem.pushKV("depth", (int)depth);
1388  elem.pushKV("leaf_ver", (int)leaf_ver);
1389  elem.pushKV("script", HexStr(script));
1390  tree.push_back(std::move(elem));
1391  }
1392  out.pushKV("taproot_tree", std::move(tree));
1393  }
1394 
1395  // Taproot bip32 keypaths
1396  if (!output.m_tap_bip32_paths.empty()) {
1397  UniValue keypaths(UniValue::VARR);
1398  for (const auto& [xonly, leaf_origin] : output.m_tap_bip32_paths) {
1399  const auto& [leaf_hashes, origin] = leaf_origin;
1400  UniValue path_obj(UniValue::VOBJ);
1401  path_obj.pushKV("pubkey", HexStr(xonly));
1402  path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1403  path_obj.pushKV("path", WriteHDKeypath(origin.path));
1404  UniValue leaf_hashes_arr(UniValue::VARR);
1405  for (const auto& leaf_hash : leaf_hashes) {
1406  leaf_hashes_arr.push_back(HexStr(leaf_hash));
1407  }
1408  path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1409  keypaths.push_back(std::move(path_obj));
1410  }
1411  out.pushKV("taproot_bip32_derivs", std::move(keypaths));
1412  }
1413 
1414  // Proprietary
1415  if (!output.m_proprietary.empty()) {
1416  UniValue proprietary(UniValue::VARR);
1417  for (const auto& entry : output.m_proprietary) {
1418  UniValue this_prop(UniValue::VOBJ);
1419  this_prop.pushKV("identifier", HexStr(entry.identifier));
1420  this_prop.pushKV("subtype", entry.subtype);
1421  this_prop.pushKV("key", HexStr(entry.key));
1422  this_prop.pushKV("value", HexStr(entry.value));
1423  proprietary.push_back(std::move(this_prop));
1424  }
1425  out.pushKV("proprietary", std::move(proprietary));
1426  }
1427 
1428  // Unknown data
1429  if (output.unknown.size() > 0) {
1430  UniValue unknowns(UniValue::VOBJ);
1431  for (auto entry : output.unknown) {
1432  unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1433  }
1434  out.pushKV("unknown", std::move(unknowns));
1435  }
1436 
1437  outputs.push_back(std::move(out));
1438 
1439  // Fee calculation
1440  if (MoneyRange(psbtx.tx->vout[i].nValue) && MoneyRange(output_value + psbtx.tx->vout[i].nValue)) {
1441  output_value += psbtx.tx->vout[i].nValue;
1442  } else {
1443  // Hack to just not show fee later
1444  have_all_utxos = false;
1445  }
1446  }
1447  result.pushKV("outputs", std::move(outputs));
1448  if (have_all_utxos) {
1449  result.pushKV("fee", ValueFromAmount(total_in - output_value));
1450  }
1451 
1452  return result;
1453 },
1454  };
1455 }
1456 
1458 {
1459  return RPCHelpMan{"combinepsbt",
1460  "\nCombine multiple partially signed Bitcoin transactions into one transaction.\n"
1461  "Implements the Combiner role.\n",
1462  {
1463  {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1464  {
1465  {"psbt", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A base64 string of a PSBT"},
1466  },
1467  },
1468  },
1469  RPCResult{
1470  RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1471  },
1472  RPCExamples{
1473  HelpExampleCli("combinepsbt", R"('["mybase64_1", "mybase64_2", "mybase64_3"]')")
1474  },
1475  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1476 {
1477  // Unserialize the transactions
1478  std::vector<PartiallySignedTransaction> psbtxs;
1479  UniValue txs = request.params[0].get_array();
1480  if (txs.empty()) {
1481  throw JSONRPCError(RPC_INVALID_PARAMETER, "Parameter 'txs' cannot be empty");
1482  }
1483  for (unsigned int i = 0; i < txs.size(); ++i) {
1485  std::string error;
1486  if (!DecodeBase64PSBT(psbtx, txs[i].get_str(), error)) {
1487  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1488  }
1489  psbtxs.push_back(psbtx);
1490  }
1491 
1492  PartiallySignedTransaction merged_psbt;
1493  if (!CombinePSBTs(merged_psbt, psbtxs)) {
1494  throw JSONRPCError(RPC_INVALID_PARAMETER, "PSBTs not compatible (different transactions)");
1495  }
1496 
1497  DataStream ssTx{};
1498  ssTx << merged_psbt;
1499  return EncodeBase64(ssTx);
1500 },
1501  };
1502 }
1503 
1505 {
1506  return RPCHelpMan{"finalizepsbt",
1507  "Finalize the inputs of a PSBT. If the transaction is fully signed, it will produce a\n"
1508  "network serialized transaction which can be broadcast with sendrawtransaction. Otherwise a PSBT will be\n"
1509  "created which has the final_scriptSig and final_scriptWitness fields filled for inputs that are complete.\n"
1510  "Implements the Finalizer and Extractor roles.\n",
1511  {
1512  {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1513  {"extract", RPCArg::Type::BOOL, RPCArg::Default{true}, "If true and the transaction is complete,\n"
1514  " extract and return the complete transaction in normal network serialization instead of the PSBT."},
1515  },
1516  RPCResult{
1517  RPCResult::Type::OBJ, "", "",
1518  {
1519  {RPCResult::Type::STR, "psbt", /*optional=*/true, "The base64-encoded partially signed transaction if not extracted"},
1520  {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if extracted"},
1521  {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
1522  }
1523  },
1524  RPCExamples{
1525  HelpExampleCli("finalizepsbt", "\"psbt\"")
1526  },
1527  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1528 {
1529  // Unserialize the transactions
1531  std::string error;
1532  if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1533  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1534  }
1535 
1536  bool extract = request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool());
1537 
1538  CMutableTransaction mtx;
1539  bool complete = FinalizeAndExtractPSBT(psbtx, mtx);
1540 
1541  UniValue result(UniValue::VOBJ);
1542  DataStream ssTx{};
1543  std::string result_str;
1544 
1545  if (complete && extract) {
1546  ssTx << TX_WITH_WITNESS(mtx);
1547  result_str = HexStr(ssTx);
1548  result.pushKV("hex", result_str);
1549  } else {
1550  ssTx << psbtx;
1551  result_str = EncodeBase64(ssTx.str());
1552  result.pushKV("psbt", result_str);
1553  }
1554  result.pushKV("complete", complete);
1555 
1556  return result;
1557 },
1558  };
1559 }
1560 
1562 {
1563  return RPCHelpMan{"createpsbt",
1564  "\nCreates a transaction in the Partially Signed Transaction format.\n"
1565  "Implements the Creator role.\n",
1566  CreateTxDoc(),
1567  RPCResult{
1568  RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1569  },
1570  RPCExamples{
1571  HelpExampleCli("createpsbt", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
1572  },
1573  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1574 {
1575 
1576  std::optional<bool> rbf;
1577  if (!request.params[3].isNull()) {
1578  rbf = request.params[3].get_bool();
1579  }
1580  CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf);
1581 
1582  // Make a blank psbt
1584  psbtx.tx = rawTx;
1585  for (unsigned int i = 0; i < rawTx.vin.size(); ++i) {
1586  psbtx.inputs.emplace_back();
1587  }
1588  for (unsigned int i = 0; i < rawTx.vout.size(); ++i) {
1589  psbtx.outputs.emplace_back();
1590  }
1591 
1592  // Serialize the PSBT
1593  DataStream ssTx{};
1594  ssTx << psbtx;
1595 
1596  return EncodeBase64(ssTx);
1597 },
1598  };
1599 }
1600 
1602 {
1603  return RPCHelpMan{"converttopsbt",
1604  "\nConverts a network serialized transaction to a PSBT. This should be used only with createrawtransaction and fundrawtransaction\n"
1605  "createpsbt and walletcreatefundedpsbt should be used for new applications.\n",
1606  {
1607  {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of a raw transaction"},
1608  {"permitsigdata", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, any signatures in the input will be discarded and conversion\n"
1609  " will continue. If false, RPC will fail if any signatures are present."},
1610  {"iswitness", RPCArg::Type::BOOL, RPCArg::DefaultHint{"depends on heuristic tests"}, "Whether the transaction hex is a serialized witness transaction.\n"
1611  "If iswitness is not present, heuristic tests will be used in decoding.\n"
1612  "If true, only witness deserialization will be tried.\n"
1613  "If false, only non-witness deserialization will be tried.\n"
1614  "This boolean should reflect whether the transaction has inputs\n"
1615  "(e.g. fully valid, or on-chain transactions), if known by the caller."
1616  },
1617  },
1618  RPCResult{
1619  RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1620  },
1621  RPCExamples{
1622  "\nCreate a transaction\n"
1623  + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"") +
1624  "\nConvert the transaction to a PSBT\n"
1625  + HelpExampleCli("converttopsbt", "\"rawtransaction\"")
1626  },
1627  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1628 {
1629  // parse hex string from parameter
1631  bool permitsigdata = request.params[1].isNull() ? false : request.params[1].get_bool();
1632  bool witness_specified = !request.params[2].isNull();
1633  bool iswitness = witness_specified ? request.params[2].get_bool() : false;
1634  const bool try_witness = witness_specified ? iswitness : true;
1635  const bool try_no_witness = witness_specified ? !iswitness : true;
1636  if (!DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
1637  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
1638  }
1639 
1640  // Remove all scriptSigs and scriptWitnesses from inputs
1641  for (CTxIn& input : tx.vin) {
1642  if ((!input.scriptSig.empty() || !input.scriptWitness.IsNull()) && !permitsigdata) {
1643  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Inputs must not have scriptSigs and scriptWitnesses");
1644  }
1645  input.scriptSig.clear();
1646  input.scriptWitness.SetNull();
1647  }
1648 
1649  // Make a blank psbt
1651  psbtx.tx = tx;
1652  for (unsigned int i = 0; i < tx.vin.size(); ++i) {
1653  psbtx.inputs.emplace_back();
1654  }
1655  for (unsigned int i = 0; i < tx.vout.size(); ++i) {
1656  psbtx.outputs.emplace_back();
1657  }
1658 
1659  // Serialize the PSBT
1660  DataStream ssTx{};
1661  ssTx << psbtx;
1662 
1663  return EncodeBase64(ssTx);
1664 },
1665  };
1666 }
1667 
1669 {
1670  return RPCHelpMan{"utxoupdatepsbt",
1671  "\nUpdates all segwit inputs and outputs in a PSBT with data from output descriptors, the UTXO set, txindex, or the mempool.\n",
1672  {
1673  {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1674  {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "An array of either strings or objects", {
1675  {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
1676  {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
1677  {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
1678  {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
1679  }},
1680  }},
1681  },
1682  RPCResult {
1683  RPCResult::Type::STR, "", "The base64-encoded partially signed transaction with inputs updated"
1684  },
1685  RPCExamples {
1686  HelpExampleCli("utxoupdatepsbt", "\"psbt\"")
1687  },
1688  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1689 {
1690  // Parse descriptors, if any.
1691  FlatSigningProvider provider;
1692  if (!request.params[1].isNull()) {
1693  auto descs = request.params[1].get_array();
1694  for (size_t i = 0; i < descs.size(); ++i) {
1695  EvalDescriptorStringOrObject(descs[i], provider);
1696  }
1697  }
1698 
1699  // We don't actually need private keys further on; hide them as a precaution.
1700  const PartiallySignedTransaction& psbtx = ProcessPSBT(
1701  request.params[0].get_str(),
1702  request.context,
1703  HidingSigningProvider(&provider, /*hide_secret=*/true, /*hide_origin=*/false),
1704  /*sighash_type=*/SIGHASH_ALL,
1705  /*finalize=*/false);
1706 
1707  DataStream ssTx{};
1708  ssTx << psbtx;
1709  return EncodeBase64(ssTx);
1710 },
1711  };
1712 }
1713 
1715 {
1716  return RPCHelpMan{"joinpsbts",
1717  "\nJoins multiple distinct PSBTs with different inputs and outputs into one PSBT with inputs and outputs from all of the PSBTs\n"
1718  "No input in any of the PSBTs can be in more than one of the PSBTs.\n",
1719  {
1720  {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1721  {
1722  {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1723  }}
1724  },
1725  RPCResult {
1726  RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1727  },
1728  RPCExamples {
1729  HelpExampleCli("joinpsbts", "\"psbt\"")
1730  },
1731  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1732 {
1733  // Unserialize the transactions
1734  std::vector<PartiallySignedTransaction> psbtxs;
1735  UniValue txs = request.params[0].get_array();
1736 
1737  if (txs.size() <= 1) {
1738  throw JSONRPCError(RPC_INVALID_PARAMETER, "At least two PSBTs are required to join PSBTs.");
1739  }
1740 
1741  uint32_t best_version = 1;
1742  uint32_t best_locktime = 0xffffffff;
1743  for (unsigned int i = 0; i < txs.size(); ++i) {
1745  std::string error;
1746  if (!DecodeBase64PSBT(psbtx, txs[i].get_str(), error)) {
1747  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1748  }
1749  psbtxs.push_back(psbtx);
1750  // Choose the highest version number
1751  if (psbtx.tx->version > best_version) {
1752  best_version = psbtx.tx->version;
1753  }
1754  // Choose the lowest lock time
1755  if (psbtx.tx->nLockTime < best_locktime) {
1756  best_locktime = psbtx.tx->nLockTime;
1757  }
1758  }
1759 
1760  // Create a blank psbt where everything will be added
1761  PartiallySignedTransaction merged_psbt;
1762  merged_psbt.tx = CMutableTransaction();
1763  merged_psbt.tx->version = best_version;
1764  merged_psbt.tx->nLockTime = best_locktime;
1765 
1766  // Merge
1767  for (auto& psbt : psbtxs) {
1768  for (unsigned int i = 0; i < psbt.tx->vin.size(); ++i) {
1769  if (!merged_psbt.AddInput(psbt.tx->vin[i], psbt.inputs[i])) {
1770  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));
1771  }
1772  }
1773  for (unsigned int i = 0; i < psbt.tx->vout.size(); ++i) {
1774  merged_psbt.AddOutput(psbt.tx->vout[i], psbt.outputs[i]);
1775  }
1776  for (auto& xpub_pair : psbt.m_xpubs) {
1777  if (merged_psbt.m_xpubs.count(xpub_pair.first) == 0) {
1778  merged_psbt.m_xpubs[xpub_pair.first] = xpub_pair.second;
1779  } else {
1780  merged_psbt.m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
1781  }
1782  }
1783  merged_psbt.unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
1784  }
1785 
1786  // Generate list of shuffled indices for shuffling inputs and outputs of the merged PSBT
1787  std::vector<int> input_indices(merged_psbt.inputs.size());
1788  std::iota(input_indices.begin(), input_indices.end(), 0);
1789  std::vector<int> output_indices(merged_psbt.outputs.size());
1790  std::iota(output_indices.begin(), output_indices.end(), 0);
1791 
1792  // Shuffle input and output indices lists
1793  std::shuffle(input_indices.begin(), input_indices.end(), FastRandomContext());
1794  std::shuffle(output_indices.begin(), output_indices.end(), FastRandomContext());
1795 
1796  PartiallySignedTransaction shuffled_psbt;
1797  shuffled_psbt.tx = CMutableTransaction();
1798  shuffled_psbt.tx->version = merged_psbt.tx->version;
1799  shuffled_psbt.tx->nLockTime = merged_psbt.tx->nLockTime;
1800  for (int i : input_indices) {
1801  shuffled_psbt.AddInput(merged_psbt.tx->vin[i], merged_psbt.inputs[i]);
1802  }
1803  for (int i : output_indices) {
1804  shuffled_psbt.AddOutput(merged_psbt.tx->vout[i], merged_psbt.outputs[i]);
1805  }
1806  shuffled_psbt.unknown.insert(merged_psbt.unknown.begin(), merged_psbt.unknown.end());
1807 
1808  DataStream ssTx{};
1809  ssTx << shuffled_psbt;
1810  return EncodeBase64(ssTx);
1811 },
1812  };
1813 }
1814 
1816 {
1817  return RPCHelpMan{"analyzepsbt",
1818  "\nAnalyzes and provides information about the current status of a PSBT and its inputs\n",
1819  {
1820  {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1821  },
1822  RPCResult {
1823  RPCResult::Type::OBJ, "", "",
1824  {
1825  {RPCResult::Type::ARR, "inputs", /*optional=*/true, "",
1826  {
1827  {RPCResult::Type::OBJ, "", "",
1828  {
1829  {RPCResult::Type::BOOL, "has_utxo", "Whether a UTXO is provided"},
1830  {RPCResult::Type::BOOL, "is_final", "Whether the input is finalized"},
1831  {RPCResult::Type::OBJ, "missing", /*optional=*/true, "Things that are missing that are required to complete this input",
1832  {
1833  {RPCResult::Type::ARR, "pubkeys", /*optional=*/true, "",
1834  {
1835  {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose BIP 32 derivation path is missing"},
1836  }},
1837  {RPCResult::Type::ARR, "signatures", /*optional=*/true, "",
1838  {
1839  {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose signature is missing"},
1840  }},
1841  {RPCResult::Type::STR_HEX, "redeemscript", /*optional=*/true, "Hash160 of the redeemScript that is missing"},
1842  {RPCResult::Type::STR_HEX, "witnessscript", /*optional=*/true, "SHA256 of the witnessScript that is missing"},
1843  }},
1844  {RPCResult::Type::STR, "next", /*optional=*/true, "Role of the next person that this input needs to go to"},
1845  }},
1846  }},
1847  {RPCResult::Type::NUM, "estimated_vsize", /*optional=*/true, "Estimated vsize of the final signed transaction"},
1848  {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"},
1849  {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid. Shown only if all UTXO slots in the PSBT have been filled"},
1850  {RPCResult::Type::STR, "next", "Role of the next person that this psbt needs to go to"},
1851  {RPCResult::Type::STR, "error", /*optional=*/true, "Error message (if there is one)"},
1852  }
1853  },
1854  RPCExamples {
1855  HelpExampleCli("analyzepsbt", "\"psbt\"")
1856  },
1857  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1858 {
1859  // Unserialize the transaction
1861  std::string error;
1862  if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1863  throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1864  }
1865 
1866  PSBTAnalysis psbta = AnalyzePSBT(psbtx);
1867 
1868  UniValue result(UniValue::VOBJ);
1869  UniValue inputs_result(UniValue::VARR);
1870  for (const auto& input : psbta.inputs) {
1871  UniValue input_univ(UniValue::VOBJ);
1872  UniValue missing(UniValue::VOBJ);
1873 
1874  input_univ.pushKV("has_utxo", input.has_utxo);
1875  input_univ.pushKV("is_final", input.is_final);
1876  input_univ.pushKV("next", PSBTRoleName(input.next));
1877 
1878  if (!input.missing_pubkeys.empty()) {
1879  UniValue missing_pubkeys_univ(UniValue::VARR);
1880  for (const CKeyID& pubkey : input.missing_pubkeys) {
1881  missing_pubkeys_univ.push_back(HexStr(pubkey));
1882  }
1883  missing.pushKV("pubkeys", std::move(missing_pubkeys_univ));
1884  }
1885  if (!input.missing_redeem_script.IsNull()) {
1886  missing.pushKV("redeemscript", HexStr(input.missing_redeem_script));
1887  }
1888  if (!input.missing_witness_script.IsNull()) {
1889  missing.pushKV("witnessscript", HexStr(input.missing_witness_script));
1890  }
1891  if (!input.missing_sigs.empty()) {
1892  UniValue missing_sigs_univ(UniValue::VARR);
1893  for (const CKeyID& pubkey : input.missing_sigs) {
1894  missing_sigs_univ.push_back(HexStr(pubkey));
1895  }
1896  missing.pushKV("signatures", std::move(missing_sigs_univ));
1897  }
1898  if (!missing.getKeys().empty()) {
1899  input_univ.pushKV("missing", std::move(missing));
1900  }
1901  inputs_result.push_back(std::move(input_univ));
1902  }
1903  if (!inputs_result.empty()) result.pushKV("inputs", std::move(inputs_result));
1904 
1905  if (psbta.estimated_vsize != std::nullopt) {
1906  result.pushKV("estimated_vsize", (int)*psbta.estimated_vsize);
1907  }
1908  if (psbta.estimated_feerate != std::nullopt) {
1909  result.pushKV("estimated_feerate", ValueFromAmount(psbta.estimated_feerate->GetFeePerK()));
1910  }
1911  if (psbta.fee != std::nullopt) {
1912  result.pushKV("fee", ValueFromAmount(*psbta.fee));
1913  }
1914  result.pushKV("next", PSBTRoleName(psbta.next));
1915  if (!psbta.error.empty()) {
1916  result.pushKV("error", psbta.error);
1917  }
1918 
1919  return result;
1920 },
1921  };
1922 }
1923 
1925 {
1926  return RPCHelpMan{"descriptorprocesspsbt",
1927  "\nUpdate all segwit inputs in a PSBT with information from output descriptors, the UTXO set or the mempool. \n"
1928  "Then, sign the inputs we are able to with information from the output descriptors. ",
1929  {
1930  {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction base64 string"},
1931  {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::NO, "An array of either strings or objects", {
1932  {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
1933  {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
1934  {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
1935  {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
1936  }},
1937  }},
1938  {"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"
1939  " \"DEFAULT\"\n"
1940  " \"ALL\"\n"
1941  " \"NONE\"\n"
1942  " \"SINGLE\"\n"
1943  " \"ALL|ANYONECANPAY\"\n"
1944  " \"NONE|ANYONECANPAY\"\n"
1945  " \"SINGLE|ANYONECANPAY\""},
1946  {"bip32derivs", RPCArg::Type::BOOL, RPCArg::Default{true}, "Include BIP 32 derivation paths for public keys if we know them"},
1947  {"finalize", RPCArg::Type::BOOL, RPCArg::Default{true}, "Also finalize inputs if possible"},
1948  },
1949  RPCResult{
1950  RPCResult::Type::OBJ, "", "",
1951  {
1952  {RPCResult::Type::STR, "psbt", "The base64-encoded partially signed transaction"},
1953  {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
1954  {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if complete"},
1955  }
1956  },
1957  RPCExamples{
1958  HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[\\\"descriptor1\\\", \\\"descriptor2\\\"]\"") +
1959  HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[{\\\"desc\\\":\\\"mydescriptor\\\", \\\"range\\\":21}]\"")
1960  },
1961  [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
1962 {
1963  // Add descriptor information to a signing provider
1964  FlatSigningProvider provider;
1965 
1966  auto descs = request.params[1].get_array();
1967  for (size_t i = 0; i < descs.size(); ++i) {
1968  EvalDescriptorStringOrObject(descs[i], provider, /*expand_priv=*/true);
1969  }
1970 
1971  int sighash_type = ParseSighashString(request.params[2]);
1972  bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
1973  bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
1974 
1975  const PartiallySignedTransaction& psbtx = ProcessPSBT(
1976  request.params[0].get_str(),
1977  request.context,
1978  HidingSigningProvider(&provider, /*hide_secret=*/false, !bip32derivs),
1979  sighash_type,
1980  finalize);
1981 
1982  // Check whether or not all of the inputs are now signed
1983  bool complete = true;
1984  for (const auto& input : psbtx.inputs) {
1985  complete &= PSBTInputSigned(input);
1986  }
1987 
1988  DataStream ssTx{};
1989  ssTx << psbtx;
1990 
1991  UniValue result(UniValue::VOBJ);
1992 
1993  result.pushKV("psbt", EncodeBase64(ssTx));
1994  result.pushKV("complete", complete);
1995  if (complete) {
1996  CMutableTransaction mtx;
1997  PartiallySignedTransaction psbtx_copy = psbtx;
1998  CHECK_NONFATAL(FinalizeAndExtractPSBT(psbtx_copy, mtx));
1999  DataStream ssTx_final;
2000  ssTx_final << TX_WITH_WITNESS(mtx);
2001  result.pushKV("hex", HexStr(ssTx_final));
2002  }
2003  return result;
2004 },
2005  };
2006 }
2007 
2009 {
2010  static const CRPCCommand commands[]{
2011  {"rawtransactions", &getrawtransaction},
2012  {"rawtransactions", &createrawtransaction},
2013  {"rawtransactions", &decoderawtransaction},
2014  {"rawtransactions", &decodescript},
2015  {"rawtransactions", &combinerawtransaction},
2016  {"rawtransactions", &signrawtransactionwithkey},
2017  {"rawtransactions", &decodepsbt},
2018  {"rawtransactions", &combinepsbt},
2019  {"rawtransactions", &finalizepsbt},
2020  {"rawtransactions", &createpsbt},
2021  {"rawtransactions", &converttopsbt},
2022  {"rawtransactions", &utxoupdatepsbt},
2023  {"rawtransactions", &descriptorprocesspsbt},
2024  {"rawtransactions", &joinpsbts},
2025  {"rawtransactions", &analyzepsbt},
2026  };
2027  for (const auto& c : commands) {
2028  t.appendCommand(c.name, &c);
2029  }
2030 }
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:267
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:463
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
Definition: chain.h:448
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:229
const Coin & AccessCoin(const COutPoint &output) const
Return a reference to Coin in the cache, or coinEmpty if not found.
Definition: coins.cpp:152
Abstract view on the open txout dataset.
Definition: coins.h:173
CCoinsView that brings transactions from a mempool into view.
Definition: txmempool.h:833
An encapsulated private key.
Definition: key.h:33
bool IsValid() const
Check whether this private key is valid.
Definition: key.h:121
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
Txid hash
Definition: transaction.h:31
An encapsulated public key.
Definition: pubkey.h:34
bool IsCompressed() const
Check whether this is a compressed public key.
Definition: pubkey.h:204
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:557
A reference to a CScript: the Hash160 of its serialization.
Definition: script.h:583
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:296
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:388
An output of a transaction.
Definition: transaction.h:150
CScript scriptPubKey
Definition: transaction.h:153
CAmount nValue
Definition: transaction.h:152
bool IsNull() const
Definition: transaction.h:170
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:543
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition: validation.h:871
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1118
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...
Definition: validation.h:1117
const CChainParams & GetParams() const
Definition: validation.h:981
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
Definition: validation.h:1013
A UTXO entry.
Definition: coins.h:32
CTxOut out
unspent transaction output
Definition: coins.h:35
bool IsSpent() const
Either this coin never existed (see e.g.
Definition: coins.h:80
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
@ VOBJ
Definition: univalue.h:24
@ VARR
Definition: univalue.h:24
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 get_bool() const
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:44
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:115
256-bit opaque blob.
Definition: uint256.h:127
std::string EncodeHexTx(const CTransaction &tx)
Definition: core_write.cpp:143
std::string SighashToStr(unsigned char sighash_type)
Definition: core_write.cpp:84
void TxToUniv(const CTransaction &tx, const uint256 &block_hash, UniValue &entry, bool include_hex=true, const CTxUndo *txundo=nullptr, TxVerbosity verbosity=TxVerbosity::SHOW_DETAILS)
Definition: core_write.cpp:171
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.
Definition: core_write.cpp:98
void ScriptToUniv(const CScript &script, UniValue &out, bool include_hex=true, bool include_address=false, const SigningProvider *provider=nullptr)
Definition: core_write.cpp:150
UniValue ValueFromAmount(const CAmount amount)
Definition: core_write.cpp:26
bool DecodeHexTx(CMutableTransaction &tx, const std::string &hex_tx, bool try_no_witness=false, bool try_witness=true)
Definition: core_read.cpp:196
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:287
CKey DecodeSecret(const std::string &str)
Definition: key_io.cpp:209
Definition: messages.h:20
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
Definition: transaction.h:195
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:423
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 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 RPCHelpMan combinerawtransaction()
static std::vector< RPCResult > ScriptPubKeyDoc()
static RPCHelpMan signrawtransactionwithkey()
static std::vector< RPCResult > DecodeTxDoc(const std::string &txid_field_doc)
static RPCHelpMan createrawtransaction()
static RPCHelpMan finalizepsbt()
void RegisterRawTransactionRPCCommands(CRPCTable &t)
static std::vector< RPCArg > CreateTxDoc()
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::string HelpExampleCli(const std::string &methodname, const std::string &args)
Definition: util.cpp:168
int ParseSighashString(const UniValue &sighash)
Returns a sighash value corresponding to the passed in argument.
Definition: util.cpp:355
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
Definition: util.cpp:186
std::vector< unsigned char > ParseHexV(const UniValue &v, std::string_view name)
Definition: util.cpp:115
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
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:1321
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:341
opcodetype
Script opcodes.
Definition: script.h:73
@ OP_CHECKSIGADD
Definition: script.h:209
NodeContext & EnsureAnyNodeContext(const std::any &context)
Definition: server_util.cpp:21
CTxMemPool & EnsureMemPool(const NodeContext &node)
Definition: server_util.cpp:30
ChainstateManager & EnsureChainman(const NodeContext &node)
Definition: server_util.cpp:70
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:499
void UpdateInput(CTxIn &input, const SignatureData &data)
Definition: sign.cpp:672
bool IsSegWitOutput(const SigningProvider &provider, const CScript &script)
Check whether a scriptPubKey is known to be segwit.
Definition: sign.cpp:765
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
Definition: sign.cpp:607
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:140
TxoutType
Definition: solver.h:22
@ WITNESS_V1_TAPROOT
@ WITNESS_UNKNOWN
Only for Witness versions not already defined above.
@ WITNESS_V0_SCRIPTHASH
@ NULL_DATA
unspendable OP_RETURN script that carries data
@ WITNESS_V0_KEYHASH
A mutable version of CTransaction.
Definition: transaction.h:378
std::vector< CTxOut > vout
Definition: transaction.h:380
std::vector< CTxIn > vin
Definition: transaction.h:379
std::vector< std::vector< unsigned char > > stack
Definition: script.h:569
bool IsNull() const
Definition: script.h:574
void SetNull()
Definition: script.h:576
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.
bool skip_type_check
Definition: util.h:156
@ 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:678
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...
Definition: tinyformat.h:1161
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)