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