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):
627 {
628 NodeContext& node = EnsureAnyNodeContext(request.context);
629 const CTxMemPool& mempool = EnsureMemPool(node);
631 LOCK2(cs_main, mempool.cs);
632 CCoinsViewCache &viewChain = chainman.ActiveChainstate().CoinsTip();
633 CCoinsViewMemPool viewMempool(&viewChain, mempool);
634 view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view
635
636 for (const CTxIn& txin : mergedTx.vin) {
637 view.AccessCoin(txin.prevout); // Load entries from viewChain into view; can fail.
638 }
639
640 view.SetBackend(CoinsViewEmpty::Get()); // switch back to avoid locking mempool for too long
641 }
642
643 // Use CTransaction for the constant parts of the
644 // transaction to avoid rehashing.
645 const CTransaction txConst(mergedTx);
646 // Sign what we can:
647 for (unsigned int i = 0; i < mergedTx.vin.size(); i++) {
648 CTxIn& txin = mergedTx.vin[i];
649 const Coin& coin = view.AccessCoin(txin.prevout);
650 if (coin.IsSpent()) {
651 throw JSONRPCError(RPC_VERIFY_ERROR, "Input not found or already spent");
652 }
653 SignatureData sigdata;
654
655 // ... and merge in other signatures:
656 for (const CMutableTransaction& txv : txVariants) {
657 if (txv.vin.size() > i) {
658 sigdata.MergeSignatureData(DataFromTransaction(txv, i, coin.out));
659 }
660 }
662
663 UpdateInput(txin, sigdata);
664 }
665
666 return EncodeHexTx(CTransaction(mergedTx));
667},
668 };
669}
670
672{
673 return RPCMethod{
674 "signrawtransactionwithkey",
675 "Sign inputs for raw transaction (serialized, hex-encoded).\n"
676 "The second argument is an array of base58-encoded private\n"
677 "keys that will be the only keys used to sign the transaction.\n"
678 "The third optional argument (may be null) is an array of previous transaction outputs that\n"
679 "this transaction depends on but may not yet be in the block chain.\n",
680 {
681 {"hexstring", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction hex string"},
682 {"privkeys", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base58-encoded private keys for signing",
683 {
684 {"privatekey", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "private key in base58-encoding"},
685 },
686 },
687 {"prevtxs", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The previous dependent transaction outputs",
688 {
690 {
691 {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
692 {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
693 {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "output script"},
694 {"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"},
695 {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"},
696 {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "(required for Segwit inputs) the amount spent"},
697 },
698 },
699 },
700 },
701 {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type. Must be one of:\n"
702 " \"DEFAULT\"\n"
703 " \"ALL\"\n"
704 " \"NONE\"\n"
705 " \"SINGLE\"\n"
706 " \"ALL|ANYONECANPAY\"\n"
707 " \"NONE|ANYONECANPAY\"\n"
708 " \"SINGLE|ANYONECANPAY\"\n"
709 },
710 },
711 RPCResult{
712 RPCResult::Type::OBJ, "", "",
713 {
714 {RPCResult::Type::STR_HEX, "hex", "The hex-encoded raw transaction with signature(s)"},
715 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
716 {RPCResult::Type::ARR, "errors", /*optional=*/true, "Script verification errors (if there are any)",
717 {
718 {RPCResult::Type::OBJ, "", "",
719 {
720 {RPCResult::Type::STR_HEX, "txid", "The hash of the referenced, previous transaction"},
721 {RPCResult::Type::NUM, "vout", "The index of the output to spent and used as input"},
722 {RPCResult::Type::ARR, "witness", "",
723 {
724 {RPCResult::Type::STR_HEX, "witness", ""},
725 }},
726 {RPCResult::Type::STR_HEX, "scriptSig", "The hex-encoded signature script"},
727 {RPCResult::Type::NUM, "sequence", "Script sequence number"},
728 {RPCResult::Type::STR, "error", "Verification or signing error related to the input"},
729 }},
730 }},
731 }
732 },
734 HelpExampleCli("signrawtransactionwithkey", "\"myhex\" \"[\\\"key1\\\",\\\"key2\\\"]\"")
735 + HelpExampleRpc("signrawtransactionwithkey", "\"myhex\", \"[\\\"key1\\\",\\\"key2\\\"]\"")
736 },
737 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
738{
740 if (!DecodeHexTx(mtx, request.params[0].get_str())) {
741 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed. Make sure the tx has at least one input.");
742 }
743
744 FlatSigningProvider keystore;
745 const UniValue& keys = request.params[1].get_array();
746 for (unsigned int idx = 0; idx < keys.size(); ++idx) {
747 UniValue k = keys[idx];
748 CKey key = DecodeSecret(k.get_str());
749 if (!key.IsValid()) {
750 throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
751 }
752
753 CPubKey pubkey = key.GetPubKey();
754 CKeyID key_id = pubkey.GetID();
755 keystore.pubkeys.emplace(key_id, pubkey);
756 keystore.keys.emplace(key_id, key);
757 }
758
759 // Fetch previous transactions (inputs):
760 std::map<COutPoint, Coin> coins;
761 for (const CTxIn& txin : mtx.vin) {
762 coins[txin.prevout]; // Create empty map entry keyed by prevout.
763 }
764 NodeContext& node = EnsureAnyNodeContext(request.context);
765 FindCoins(node, coins);
766
767 // Parse the prevtxs array
768 ParsePrevouts(request.params[2], &keystore, coins);
769
770 UniValue result(UniValue::VOBJ);
771 SignTransaction(mtx, &keystore, coins, request.params[3], result);
772 return result;
773},
774 };
775}
776
778{
779 static const RPCResult decodepsbt_inputs{
780 RPCResult::Type::ARR, "inputs", "",
781 {
782 {RPCResult::Type::OBJ, "", "",
783 {
784 {RPCResult::Type::OBJ, "non_witness_utxo", /*optional=*/true, "Decoded network transaction for non-witness UTXOs",
785 TxDoc({.elision_description="The layout is the same as the output of decoderawtransaction."})
786 },
787 {RPCResult::Type::OBJ, "witness_utxo", /*optional=*/true, "Transaction output for witness UTXOs",
788 {
789 {RPCResult::Type::NUM, "amount", "The value in " + CURRENCY_UNIT},
790 {RPCResult::Type::OBJ, "scriptPubKey", "",
791 {
792 {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
793 {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
794 {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
795 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
796 {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
797 }},
798 }},
799 {RPCResult::Type::OBJ_DYN, "partial_signatures", /*optional=*/true, "",
800 {
801 {RPCResult::Type::STR, "pubkey", "The public key and signature that corresponds to it."},
802 }},
803 {RPCResult::Type::STR, "sighash", /*optional=*/true, "The sighash type to be used"},
804 {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
805 {
806 {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
807 {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
808 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
809 }},
810 {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
811 {
812 {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
813 {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
814 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
815 }},
816 {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
817 {
818 {RPCResult::Type::OBJ, "", "",
819 {
820 {RPCResult::Type::STR, "pubkey", "The public key with the derivation path as the value."},
821 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
822 {RPCResult::Type::STR, "path", "The path"},
823 }},
824 }},
825 {RPCResult::Type::OBJ, "final_scriptSig", /*optional=*/true, "",
826 {
827 {RPCResult::Type::STR, "asm", "Disassembly of the final signature script"},
828 {RPCResult::Type::STR_HEX, "hex", "The raw final signature script bytes, hex-encoded"},
829 }},
830 {RPCResult::Type::ARR, "final_scriptwitness", /*optional=*/true, "",
831 {
832 {RPCResult::Type::STR_HEX, "", "hex-encoded witness data (if any)"},
833 }},
834 {RPCResult::Type::OBJ_DYN, "ripemd160_preimages", /*optional=*/ true, "",
835 {
836 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
837 }},
838 {RPCResult::Type::OBJ_DYN, "sha256_preimages", /*optional=*/ true, "",
839 {
840 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
841 }},
842 {RPCResult::Type::OBJ_DYN, "hash160_preimages", /*optional=*/ true, "",
843 {
844 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
845 }},
846 {RPCResult::Type::OBJ_DYN, "hash256_preimages", /*optional=*/ true, "",
847 {
848 {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."},
849 }},
850 {RPCResult::Type::STR_HEX, "taproot_key_path_sig", /*optional=*/ true, "hex-encoded signature for the Taproot key path spend"},
851 {RPCResult::Type::ARR, "taproot_script_path_sigs", /*optional=*/ true, "",
852 {
853 {RPCResult::Type::OBJ, "signature", /*optional=*/ true, "The signature for the pubkey and leaf hash combination",
854 {
855 {RPCResult::Type::STR, "pubkey", "The x-only pubkey for this signature"},
856 {RPCResult::Type::STR, "leaf_hash", "The leaf hash for this signature"},
857 {RPCResult::Type::STR, "sig", "The signature itself"},
858 }},
859 }},
860 {RPCResult::Type::ARR, "taproot_scripts", /*optional=*/ true, "",
861 {
862 {RPCResult::Type::OBJ, "", "",
863 {
864 {RPCResult::Type::STR_HEX, "script", "A leaf script"},
865 {RPCResult::Type::NUM, "leaf_ver", "The version number for the leaf script"},
866 {RPCResult::Type::ARR, "control_blocks", "The control blocks for this script",
867 {
868 {RPCResult::Type::STR_HEX, "control_block", "A hex-encoded control block for this script"},
869 }},
870 }},
871 }},
872 {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
873 {
874 {RPCResult::Type::OBJ, "", "",
875 {
876 {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
877 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
878 {RPCResult::Type::STR, "path", "The path"},
879 {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
880 {
881 {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
882 }},
883 }},
884 }},
885 {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
886 {RPCResult::Type::STR_HEX, "taproot_merkle_root", /*optional=*/ true, "The hex-encoded Taproot merkle root"},
887 {RPCResult::Type::ARR, "musig2_participant_pubkeys", /*optional=*/true, "",
888 {
889 {RPCResult::Type::OBJ, "", "",
890 {
891 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which the participants create."},
892 {RPCResult::Type::ARR, "participant_pubkeys", "",
893 {
894 {RPCResult::Type::STR_HEX, "pubkey", "The compressed public keys that are aggregated for aggregate_pubkey."},
895 }},
896 }},
897 }},
898 {RPCResult::Type::ARR, "musig2_pubnonces", /*optional=*/true, "",
899 {
900 {RPCResult::Type::OBJ, "", "",
901 {
902 {RPCResult::Type::STR_HEX, "participant_pubkey", "The compressed public key of the participant that created this pubnonce."},
903 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which this pubnonce is for."},
904 {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."},
905 {RPCResult::Type::STR_HEX, "pubnonce", "The public nonce itself."},
906 }},
907 }},
908 {RPCResult::Type::ARR, "musig2_partial_sigs", /*optional=*/true, "",
909 {
910 {RPCResult::Type::OBJ, "", "",
911 {
912 {RPCResult::Type::STR_HEX, "participant_pubkey", "The compressed public key of the participant that created this partial signature."},
913 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which this partial signature is for."},
914 {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."},
915 {RPCResult::Type::STR_HEX, "partial_sig", "The partial signature itself."},
916 }},
917 }},
918 {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/ true, "The unknown input fields",
919 {
920 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
921 }},
922 {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The input proprietary map",
923 {
924 {RPCResult::Type::OBJ, "", "",
925 {
926 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
927 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
928 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
929 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
930 }},
931 }},
932 }},
933 }
934 };
935 return decodepsbt_inputs;
936}
937
939{
940 static const RPCResult decodepsbt_outputs{
941 RPCResult::Type::ARR, "outputs", "",
942 {
943 {RPCResult::Type::OBJ, "", "",
944 {
945 {RPCResult::Type::OBJ, "redeem_script", /*optional=*/true, "",
946 {
947 {RPCResult::Type::STR, "asm", "Disassembly of the redeem script"},
948 {RPCResult::Type::STR_HEX, "hex", "The raw redeem script bytes, hex-encoded"},
949 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
950 }},
951 {RPCResult::Type::OBJ, "witness_script", /*optional=*/true, "",
952 {
953 {RPCResult::Type::STR, "asm", "Disassembly of the witness script"},
954 {RPCResult::Type::STR_HEX, "hex", "The raw witness script bytes, hex-encoded"},
955 {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
956 }},
957 {RPCResult::Type::ARR, "bip32_derivs", /*optional=*/true, "",
958 {
959 {RPCResult::Type::OBJ, "", "",
960 {
961 {RPCResult::Type::STR, "pubkey", "The public key this path corresponds to"},
962 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
963 {RPCResult::Type::STR, "path", "The path"},
964 }},
965 }},
966 {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"},
967 {RPCResult::Type::ARR, "taproot_tree", /*optional=*/ true, "The tuples that make up the Taproot tree, in depth first search order",
968 {
969 {RPCResult::Type::OBJ, "tuple", /*optional=*/ true, "A single leaf script in the taproot tree",
970 {
971 {RPCResult::Type::NUM, "depth", "The depth of this element in the tree"},
972 {RPCResult::Type::NUM, "leaf_ver", "The version of this leaf"},
973 {RPCResult::Type::STR, "script", "The hex-encoded script itself"},
974 }},
975 }},
976 {RPCResult::Type::ARR, "taproot_bip32_derivs", /*optional=*/ true, "",
977 {
978 {RPCResult::Type::OBJ, "", "",
979 {
980 {RPCResult::Type::STR, "pubkey", "The x-only public key this path corresponds to"},
981 {RPCResult::Type::STR, "master_fingerprint", "The fingerprint of the master key"},
982 {RPCResult::Type::STR, "path", "The path"},
983 {RPCResult::Type::ARR, "leaf_hashes", "The hashes of the leaves this pubkey appears in",
984 {
985 {RPCResult::Type::STR_HEX, "hash", "The hash of a leaf this pubkey appears in"},
986 }},
987 }},
988 }},
989 {RPCResult::Type::ARR, "musig2_participant_pubkeys", /*optional=*/true, "",
990 {
991 {RPCResult::Type::OBJ, "", "",
992 {
993 {RPCResult::Type::STR_HEX, "aggregate_pubkey", "The compressed aggregate public key for which the participants create."},
994 {RPCResult::Type::ARR, "participant_pubkeys", "",
995 {
996 {RPCResult::Type::STR_HEX, "pubkey", "The compressed public keys that are aggregated for aggregate_pubkey."},
997 }},
998 }},
999 }},
1000 {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown output fields",
1001 {
1002 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1003 }},
1004 {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The output proprietary map",
1005 {
1006 {RPCResult::Type::OBJ, "", "",
1007 {
1008 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1009 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1010 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1011 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1012 }},
1013 }},
1014 }},
1015 }
1016 };
1017 return decodepsbt_outputs;
1018}
1019
1021{
1022 return RPCMethod{
1023 "decodepsbt",
1024 "Return a JSON object representing the serialized, base64-encoded partially signed Bitcoin transaction.",
1025 {
1026 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The PSBT base64 string"},
1027 },
1028 RPCResult{
1029 RPCResult::Type::OBJ, "", "",
1030 {
1031 {RPCResult::Type::OBJ, "tx", "The decoded network-serialized unsigned transaction.",
1032 TxDoc({.elision_description="The layout is the same as the output of decoderawtransaction."})
1033 },
1034 {RPCResult::Type::ARR, "global_xpubs", "",
1035 {
1036 {RPCResult::Type::OBJ, "", "",
1037 {
1038 {RPCResult::Type::STR, "xpub", "The extended public key this path corresponds to"},
1039 {RPCResult::Type::STR_HEX, "master_fingerprint", "The fingerprint of the master key"},
1040 {RPCResult::Type::STR, "path", "The path"},
1041 }},
1042 }},
1043 {RPCResult::Type::NUM, "psbt_version", "The PSBT version number. Not to be confused with the unsigned transaction version"},
1044 {RPCResult::Type::ARR, "proprietary", "The global proprietary map",
1045 {
1046 {RPCResult::Type::OBJ, "", "",
1047 {
1048 {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"},
1049 {RPCResult::Type::NUM, "subtype", "The number for the subtype"},
1050 {RPCResult::Type::STR_HEX, "key", "The hex for the key"},
1051 {RPCResult::Type::STR_HEX, "value", "The hex for the value"},
1052 }},
1053 }},
1054 {RPCResult::Type::OBJ_DYN, "unknown", "The unknown global fields",
1055 {
1056 {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"},
1057 }},
1060 {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid if all UTXOs slots in the PSBT have been filled."},
1061 }
1062 },
1064 HelpExampleCli("decodepsbt", "\"psbt\"")
1065 },
1066 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1067{
1068 // Unserialize the transactions
1070 std::string error;
1071 if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1072 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1073 }
1074
1075 UniValue result(UniValue::VOBJ);
1076
1077 // Add the decoded tx
1078 UniValue tx_univ(UniValue::VOBJ);
1079 TxToUniv(CTransaction(*psbtx.tx), /*block_hash=*/uint256(), /*entry=*/tx_univ, /*include_hex=*/false);
1080 result.pushKV("tx", std::move(tx_univ));
1081
1082 // Add the global xpubs
1083 UniValue global_xpubs(UniValue::VARR);
1084 for (std::pair<KeyOriginInfo, std::set<CExtPubKey>> xpub_pair : psbtx.m_xpubs) {
1085 for (auto& xpub : xpub_pair.second) {
1086 std::vector<unsigned char> ser_xpub;
1087 ser_xpub.assign(BIP32_EXTKEY_WITH_VERSION_SIZE, 0);
1088 xpub.EncodeWithVersion(ser_xpub.data());
1089
1090 UniValue keypath(UniValue::VOBJ);
1091 keypath.pushKV("xpub", EncodeBase58Check(ser_xpub));
1092 keypath.pushKV("master_fingerprint", HexStr(std::span<unsigned char>(xpub_pair.first.fingerprint, xpub_pair.first.fingerprint + 4)));
1093 keypath.pushKV("path", WriteHDKeypath(xpub_pair.first.path));
1094 global_xpubs.push_back(std::move(keypath));
1095 }
1096 }
1097 result.pushKV("global_xpubs", std::move(global_xpubs));
1098
1099 // PSBT version
1100 result.pushKV("psbt_version", psbtx.GetVersion());
1101
1102 // Proprietary
1103 UniValue proprietary(UniValue::VARR);
1104 for (const auto& entry : psbtx.m_proprietary) {
1105 UniValue this_prop(UniValue::VOBJ);
1106 this_prop.pushKV("identifier", HexStr(entry.identifier));
1107 this_prop.pushKV("subtype", entry.subtype);
1108 this_prop.pushKV("key", HexStr(entry.key));
1109 this_prop.pushKV("value", HexStr(entry.value));
1110 proprietary.push_back(std::move(this_prop));
1111 }
1112 result.pushKV("proprietary", std::move(proprietary));
1113
1114 // Unknown data
1115 UniValue unknowns(UniValue::VOBJ);
1116 for (auto entry : psbtx.unknown) {
1117 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1118 }
1119 result.pushKV("unknown", std::move(unknowns));
1120
1121 // inputs
1122 CAmount total_in = 0;
1123 bool have_all_utxos = true;
1124 UniValue inputs(UniValue::VARR);
1125 for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
1126 const PSBTInput& input = psbtx.inputs[i];
1128 // UTXOs
1129 bool have_a_utxo = false;
1130 CTxOut txout;
1131 if (!input.witness_utxo.IsNull()) {
1132 txout = input.witness_utxo;
1133
1135 ScriptToUniv(txout.scriptPubKey, /*out=*/o, /*include_hex=*/true, /*include_address=*/true);
1136
1138 out.pushKV("amount", ValueFromAmount(txout.nValue));
1139 out.pushKV("scriptPubKey", std::move(o));
1140
1141 in.pushKV("witness_utxo", std::move(out));
1142
1143 have_a_utxo = true;
1144 }
1145 if (input.non_witness_utxo) {
1146 txout = input.non_witness_utxo->vout[psbtx.tx->vin[i].prevout.n];
1147
1148 UniValue non_wit(UniValue::VOBJ);
1149 TxToUniv(*input.non_witness_utxo, /*block_hash=*/uint256(), /*entry=*/non_wit, /*include_hex=*/false);
1150 in.pushKV("non_witness_utxo", std::move(non_wit));
1151
1152 have_a_utxo = true;
1153 }
1154 if (have_a_utxo) {
1155 if (MoneyRange(txout.nValue) && MoneyRange(total_in + txout.nValue)) {
1156 total_in += txout.nValue;
1157 } else {
1158 // Hack to just not show fee later
1159 have_all_utxos = false;
1160 }
1161 } else {
1162 have_all_utxos = false;
1163 }
1164
1165 // Partial sigs
1166 if (!input.partial_sigs.empty()) {
1167 UniValue partial_sigs(UniValue::VOBJ);
1168 for (const auto& sig : input.partial_sigs) {
1169 partial_sigs.pushKV(HexStr(sig.second.first), HexStr(sig.second.second));
1170 }
1171 in.pushKV("partial_signatures", std::move(partial_sigs));
1172 }
1173
1174 // Sighash
1175 if (input.sighash_type != std::nullopt) {
1176 in.pushKV("sighash", SighashToStr((unsigned char)*input.sighash_type));
1177 }
1178
1179 // Redeem script and witness script
1180 if (!input.redeem_script.empty()) {
1182 ScriptToUniv(input.redeem_script, /*out=*/r);
1183 in.pushKV("redeem_script", std::move(r));
1184 }
1185 if (!input.witness_script.empty()) {
1187 ScriptToUniv(input.witness_script, /*out=*/r);
1188 in.pushKV("witness_script", std::move(r));
1189 }
1190
1191 // keypaths
1192 if (!input.hd_keypaths.empty()) {
1193 UniValue keypaths(UniValue::VARR);
1194 for (auto entry : input.hd_keypaths) {
1195 UniValue keypath(UniValue::VOBJ);
1196 keypath.pushKV("pubkey", HexStr(entry.first));
1197
1198 keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1199 keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1200 keypaths.push_back(std::move(keypath));
1201 }
1202 in.pushKV("bip32_derivs", std::move(keypaths));
1203 }
1204
1205 // Final scriptSig and scriptwitness
1206 if (!input.final_script_sig.empty()) {
1207 UniValue scriptsig(UniValue::VOBJ);
1208 scriptsig.pushKV("asm", ScriptToAsmStr(input.final_script_sig, true));
1209 scriptsig.pushKV("hex", HexStr(input.final_script_sig));
1210 in.pushKV("final_scriptSig", std::move(scriptsig));
1211 }
1212 if (!input.final_script_witness.IsNull()) {
1213 UniValue txinwitness(UniValue::VARR);
1214 for (const auto& item : input.final_script_witness.stack) {
1215 txinwitness.push_back(HexStr(item));
1216 }
1217 in.pushKV("final_scriptwitness", std::move(txinwitness));
1218 }
1219
1220 // Ripemd160 hash preimages
1221 if (!input.ripemd160_preimages.empty()) {
1222 UniValue ripemd160_preimages(UniValue::VOBJ);
1223 for (const auto& [hash, preimage] : input.ripemd160_preimages) {
1224 ripemd160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1225 }
1226 in.pushKV("ripemd160_preimages", std::move(ripemd160_preimages));
1227 }
1228
1229 // Sha256 hash preimages
1230 if (!input.sha256_preimages.empty()) {
1231 UniValue sha256_preimages(UniValue::VOBJ);
1232 for (const auto& [hash, preimage] : input.sha256_preimages) {
1233 sha256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1234 }
1235 in.pushKV("sha256_preimages", std::move(sha256_preimages));
1236 }
1237
1238 // Hash160 hash preimages
1239 if (!input.hash160_preimages.empty()) {
1240 UniValue hash160_preimages(UniValue::VOBJ);
1241 for (const auto& [hash, preimage] : input.hash160_preimages) {
1242 hash160_preimages.pushKV(HexStr(hash), HexStr(preimage));
1243 }
1244 in.pushKV("hash160_preimages", std::move(hash160_preimages));
1245 }
1246
1247 // Hash256 hash preimages
1248 if (!input.hash256_preimages.empty()) {
1249 UniValue hash256_preimages(UniValue::VOBJ);
1250 for (const auto& [hash, preimage] : input.hash256_preimages) {
1251 hash256_preimages.pushKV(HexStr(hash), HexStr(preimage));
1252 }
1253 in.pushKV("hash256_preimages", std::move(hash256_preimages));
1254 }
1255
1256 // Taproot key path signature
1257 if (!input.m_tap_key_sig.empty()) {
1258 in.pushKV("taproot_key_path_sig", HexStr(input.m_tap_key_sig));
1259 }
1260
1261 // Taproot script path signatures
1262 if (!input.m_tap_script_sigs.empty()) {
1263 UniValue script_sigs(UniValue::VARR);
1264 for (const auto& [pubkey_leaf, sig] : input.m_tap_script_sigs) {
1265 const auto& [xonly, leaf_hash] = pubkey_leaf;
1266 UniValue sigobj(UniValue::VOBJ);
1267 sigobj.pushKV("pubkey", HexStr(xonly));
1268 sigobj.pushKV("leaf_hash", HexStr(leaf_hash));
1269 sigobj.pushKV("sig", HexStr(sig));
1270 script_sigs.push_back(std::move(sigobj));
1271 }
1272 in.pushKV("taproot_script_path_sigs", std::move(script_sigs));
1273 }
1274
1275 // Taproot leaf scripts
1276 if (!input.m_tap_scripts.empty()) {
1277 UniValue tap_scripts(UniValue::VARR);
1278 for (const auto& [leaf, control_blocks] : input.m_tap_scripts) {
1279 const auto& [script, leaf_ver] = leaf;
1280 UniValue script_info(UniValue::VOBJ);
1281 script_info.pushKV("script", HexStr(script));
1282 script_info.pushKV("leaf_ver", leaf_ver);
1283 UniValue control_blocks_univ(UniValue::VARR);
1284 for (const auto& control_block : control_blocks) {
1285 control_blocks_univ.push_back(HexStr(control_block));
1286 }
1287 script_info.pushKV("control_blocks", std::move(control_blocks_univ));
1288 tap_scripts.push_back(std::move(script_info));
1289 }
1290 in.pushKV("taproot_scripts", std::move(tap_scripts));
1291 }
1292
1293 // Taproot bip32 keypaths
1294 if (!input.m_tap_bip32_paths.empty()) {
1295 UniValue keypaths(UniValue::VARR);
1296 for (const auto& [xonly, leaf_origin] : input.m_tap_bip32_paths) {
1297 const auto& [leaf_hashes, origin] = leaf_origin;
1298 UniValue path_obj(UniValue::VOBJ);
1299 path_obj.pushKV("pubkey", HexStr(xonly));
1300 path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1301 path_obj.pushKV("path", WriteHDKeypath(origin.path));
1302 UniValue leaf_hashes_arr(UniValue::VARR);
1303 for (const auto& leaf_hash : leaf_hashes) {
1304 leaf_hashes_arr.push_back(HexStr(leaf_hash));
1305 }
1306 path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1307 keypaths.push_back(std::move(path_obj));
1308 }
1309 in.pushKV("taproot_bip32_derivs", std::move(keypaths));
1310 }
1311
1312 // Taproot internal key
1313 if (!input.m_tap_internal_key.IsNull()) {
1314 in.pushKV("taproot_internal_key", HexStr(input.m_tap_internal_key));
1315 }
1316
1317 // Write taproot merkle root
1318 if (!input.m_tap_merkle_root.IsNull()) {
1319 in.pushKV("taproot_merkle_root", HexStr(input.m_tap_merkle_root));
1320 }
1321
1322 // Write MuSig2 fields
1323 if (!input.m_musig2_participants.empty()) {
1324 UniValue musig_pubkeys(UniValue::VARR);
1325 for (const auto& [agg, parts] : input.m_musig2_participants) {
1326 UniValue musig_part(UniValue::VOBJ);
1327 musig_part.pushKV("aggregate_pubkey", HexStr(agg));
1328 UniValue part_pubkeys(UniValue::VARR);
1329 for (const auto& pub : parts) {
1330 part_pubkeys.push_back(HexStr(pub));
1331 }
1332 musig_part.pushKV("participant_pubkeys", part_pubkeys);
1333 musig_pubkeys.push_back(musig_part);
1334 }
1335 in.pushKV("musig2_participant_pubkeys", musig_pubkeys);
1336 }
1337 if (!input.m_musig2_pubnonces.empty()) {
1338 UniValue musig_pubnonces(UniValue::VARR);
1339 for (const auto& [agg_lh, part_pubnonce] : input.m_musig2_pubnonces) {
1340 const auto& [agg, lh] = agg_lh;
1341 for (const auto& [part, pubnonce] : part_pubnonce) {
1343 info.pushKV("participant_pubkey", HexStr(part));
1344 info.pushKV("aggregate_pubkey", HexStr(agg));
1345 if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));
1346 info.pushKV("pubnonce", HexStr(pubnonce));
1347 musig_pubnonces.push_back(info);
1348 }
1349 }
1350 in.pushKV("musig2_pubnonces", musig_pubnonces);
1351 }
1352 if (!input.m_musig2_partial_sigs.empty()) {
1353 UniValue musig_partial_sigs(UniValue::VARR);
1354 for (const auto& [agg_lh, part_psig] : input.m_musig2_partial_sigs) {
1355 const auto& [agg, lh] = agg_lh;
1356 for (const auto& [part, psig] : part_psig) {
1358 info.pushKV("participant_pubkey", HexStr(part));
1359 info.pushKV("aggregate_pubkey", HexStr(agg));
1360 if (!lh.IsNull()) info.pushKV("leaf_hash", HexStr(lh));
1361 info.pushKV("partial_sig", HexStr(psig));
1362 musig_partial_sigs.push_back(info);
1363 }
1364 }
1365 in.pushKV("musig2_partial_sigs", musig_partial_sigs);
1366 }
1367
1368 // Proprietary
1369 if (!input.m_proprietary.empty()) {
1370 UniValue proprietary(UniValue::VARR);
1371 for (const auto& entry : input.m_proprietary) {
1372 UniValue this_prop(UniValue::VOBJ);
1373 this_prop.pushKV("identifier", HexStr(entry.identifier));
1374 this_prop.pushKV("subtype", entry.subtype);
1375 this_prop.pushKV("key", HexStr(entry.key));
1376 this_prop.pushKV("value", HexStr(entry.value));
1377 proprietary.push_back(std::move(this_prop));
1378 }
1379 in.pushKV("proprietary", std::move(proprietary));
1380 }
1381
1382 // Unknown data
1383 if (input.unknown.size() > 0) {
1384 UniValue unknowns(UniValue::VOBJ);
1385 for (auto entry : input.unknown) {
1386 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1387 }
1388 in.pushKV("unknown", std::move(unknowns));
1389 }
1390
1391 inputs.push_back(std::move(in));
1392 }
1393 result.pushKV("inputs", std::move(inputs));
1394
1395 // outputs
1396 CAmount output_value = 0;
1397 UniValue outputs(UniValue::VARR);
1398 for (unsigned int i = 0; i < psbtx.outputs.size(); ++i) {
1399 const PSBTOutput& output = psbtx.outputs[i];
1401 // Redeem script and witness script
1402 if (!output.redeem_script.empty()) {
1404 ScriptToUniv(output.redeem_script, /*out=*/r);
1405 out.pushKV("redeem_script", std::move(r));
1406 }
1407 if (!output.witness_script.empty()) {
1409 ScriptToUniv(output.witness_script, /*out=*/r);
1410 out.pushKV("witness_script", std::move(r));
1411 }
1412
1413 // keypaths
1414 if (!output.hd_keypaths.empty()) {
1415 UniValue keypaths(UniValue::VARR);
1416 for (auto entry : output.hd_keypaths) {
1417 UniValue keypath(UniValue::VOBJ);
1418 keypath.pushKV("pubkey", HexStr(entry.first));
1419 keypath.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(entry.second.fingerprint)));
1420 keypath.pushKV("path", WriteHDKeypath(entry.second.path));
1421 keypaths.push_back(std::move(keypath));
1422 }
1423 out.pushKV("bip32_derivs", std::move(keypaths));
1424 }
1425
1426 // Taproot internal key
1427 if (!output.m_tap_internal_key.IsNull()) {
1428 out.pushKV("taproot_internal_key", HexStr(output.m_tap_internal_key));
1429 }
1430
1431 // Taproot tree
1432 if (!output.m_tap_tree.empty()) {
1434 for (const auto& [depth, leaf_ver, script] : output.m_tap_tree) {
1436 elem.pushKV("depth", depth);
1437 elem.pushKV("leaf_ver", leaf_ver);
1438 elem.pushKV("script", HexStr(script));
1439 tree.push_back(std::move(elem));
1440 }
1441 out.pushKV("taproot_tree", std::move(tree));
1442 }
1443
1444 // Taproot bip32 keypaths
1445 if (!output.m_tap_bip32_paths.empty()) {
1446 UniValue keypaths(UniValue::VARR);
1447 for (const auto& [xonly, leaf_origin] : output.m_tap_bip32_paths) {
1448 const auto& [leaf_hashes, origin] = leaf_origin;
1449 UniValue path_obj(UniValue::VOBJ);
1450 path_obj.pushKV("pubkey", HexStr(xonly));
1451 path_obj.pushKV("master_fingerprint", strprintf("%08x", ReadBE32(origin.fingerprint)));
1452 path_obj.pushKV("path", WriteHDKeypath(origin.path));
1453 UniValue leaf_hashes_arr(UniValue::VARR);
1454 for (const auto& leaf_hash : leaf_hashes) {
1455 leaf_hashes_arr.push_back(HexStr(leaf_hash));
1456 }
1457 path_obj.pushKV("leaf_hashes", std::move(leaf_hashes_arr));
1458 keypaths.push_back(std::move(path_obj));
1459 }
1460 out.pushKV("taproot_bip32_derivs", std::move(keypaths));
1461 }
1462
1463 // Write MuSig2 fields
1464 if (!output.m_musig2_participants.empty()) {
1465 UniValue musig_pubkeys(UniValue::VARR);
1466 for (const auto& [agg, parts] : output.m_musig2_participants) {
1467 UniValue musig_part(UniValue::VOBJ);
1468 musig_part.pushKV("aggregate_pubkey", HexStr(agg));
1469 UniValue part_pubkeys(UniValue::VARR);
1470 for (const auto& pub : parts) {
1471 part_pubkeys.push_back(HexStr(pub));
1472 }
1473 musig_part.pushKV("participant_pubkeys", part_pubkeys);
1474 musig_pubkeys.push_back(musig_part);
1475 }
1476 out.pushKV("musig2_participant_pubkeys", musig_pubkeys);
1477 }
1478
1479 // Proprietary
1480 if (!output.m_proprietary.empty()) {
1481 UniValue proprietary(UniValue::VARR);
1482 for (const auto& entry : output.m_proprietary) {
1483 UniValue this_prop(UniValue::VOBJ);
1484 this_prop.pushKV("identifier", HexStr(entry.identifier));
1485 this_prop.pushKV("subtype", entry.subtype);
1486 this_prop.pushKV("key", HexStr(entry.key));
1487 this_prop.pushKV("value", HexStr(entry.value));
1488 proprietary.push_back(std::move(this_prop));
1489 }
1490 out.pushKV("proprietary", std::move(proprietary));
1491 }
1492
1493 // Unknown data
1494 if (output.unknown.size() > 0) {
1495 UniValue unknowns(UniValue::VOBJ);
1496 for (auto entry : output.unknown) {
1497 unknowns.pushKV(HexStr(entry.first), HexStr(entry.second));
1498 }
1499 out.pushKV("unknown", std::move(unknowns));
1500 }
1501
1502 outputs.push_back(std::move(out));
1503
1504 // Fee calculation
1505 if (MoneyRange(psbtx.tx->vout[i].nValue) && MoneyRange(output_value + psbtx.tx->vout[i].nValue)) {
1506 output_value += psbtx.tx->vout[i].nValue;
1507 } else {
1508 // Hack to just not show fee later
1509 have_all_utxos = false;
1510 }
1511 }
1512 result.pushKV("outputs", std::move(outputs));
1513 if (have_all_utxos) {
1514 result.pushKV("fee", ValueFromAmount(total_in - output_value));
1515 }
1516
1517 return result;
1518},
1519 };
1520}
1521
1523{
1524 return RPCMethod{
1525 "combinepsbt",
1526 "Combine multiple partially signed Bitcoin transactions into one transaction.\n"
1527 "Implements the Combiner role.\n",
1528 {
1529 {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1530 {
1531 {"psbt", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A base64 string of a PSBT"},
1532 },
1533 },
1534 },
1535 RPCResult{
1536 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1537 },
1539 HelpExampleCli("combinepsbt", R"('["mybase64_1", "mybase64_2", "mybase64_3"]')")
1540 },
1541 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1542{
1543 // Unserialize the transactions
1544 std::vector<PartiallySignedTransaction> psbtxs;
1545 UniValue txs = request.params[0].get_array();
1546 if (txs.empty()) {
1547 throw JSONRPCError(RPC_INVALID_PARAMETER, "Parameter 'txs' cannot be empty");
1548 }
1549 for (unsigned int i = 0; i < txs.size(); ++i) {
1551 std::string error;
1552 if (!DecodeBase64PSBT(psbtx, txs[i].get_str(), error)) {
1553 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1554 }
1555 psbtxs.push_back(psbtx);
1556 }
1557
1558 PartiallySignedTransaction merged_psbt;
1559 if (!CombinePSBTs(merged_psbt, psbtxs)) {
1560 throw JSONRPCError(RPC_INVALID_PARAMETER, "PSBTs not compatible (different transactions)");
1561 }
1562
1563 DataStream ssTx{};
1564 ssTx << merged_psbt;
1565 return EncodeBase64(ssTx);
1566},
1567 };
1568}
1569
1571{
1572 return RPCMethod{"finalizepsbt",
1573 "Finalize the inputs of a PSBT. If the transaction is fully signed, it will produce a\n"
1574 "network serialized transaction which can be broadcast with sendrawtransaction. Otherwise a PSBT will be\n"
1575 "created which has the final_scriptSig and final_scriptwitness fields filled for inputs that are complete.\n"
1576 "Implements the Finalizer and Extractor roles.\n",
1577 {
1578 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1579 {"extract", RPCArg::Type::BOOL, RPCArg::Default{true}, "If true and the transaction is complete,\n"
1580 " extract and return the complete transaction in normal network serialization instead of the PSBT."},
1581 },
1582 RPCResult{
1583 RPCResult::Type::OBJ, "", "",
1584 {
1585 {RPCResult::Type::STR, "psbt", /*optional=*/true, "The base64-encoded partially signed transaction if not extracted"},
1586 {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if extracted"},
1587 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
1588 }
1589 },
1591 HelpExampleCli("finalizepsbt", "\"psbt\"")
1592 },
1593 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1594{
1595 // Unserialize the transactions
1597 std::string error;
1598 if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1599 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1600 }
1601
1602 bool extract = request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool());
1603
1605 bool complete = FinalizeAndExtractPSBT(psbtx, mtx);
1606
1607 UniValue result(UniValue::VOBJ);
1608 DataStream ssTx{};
1609 std::string result_str;
1610
1611 if (complete && extract) {
1612 ssTx << TX_WITH_WITNESS(mtx);
1613 result_str = HexStr(ssTx);
1614 result.pushKV("hex", result_str);
1615 } else {
1616 ssTx << psbtx;
1617 result_str = EncodeBase64(ssTx.str());
1618 result.pushKV("psbt", result_str);
1619 }
1620 result.pushKV("complete", complete);
1621
1622 return result;
1623},
1624 };
1625}
1626
1628{
1629 return RPCMethod{
1630 "createpsbt",
1631 "Creates a transaction in the Partially Signed Transaction format.\n"
1632 "Implements the Creator role.\n"
1633 "Note that the transaction's inputs are not signed, and\n"
1634 "it is not stored in the wallet or transmitted to the network.\n",
1635 CreateTxDoc(),
1636 RPCResult{
1637 RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1638 },
1640 HelpExampleCli("createpsbt", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"address\\\":0.01}]\"")
1641 },
1642 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1643{
1644
1645 std::optional<bool> rbf;
1646 if (!request.params[3].isNull()) {
1647 rbf = request.params[3].get_bool();
1648 }
1649 CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf, self.Arg<uint32_t>("version"));
1650
1651 // Make a blank psbt
1653 psbtx.tx = rawTx;
1654 for (unsigned int i = 0; i < rawTx.vin.size(); ++i) {
1655 psbtx.inputs.emplace_back();
1656 }
1657 for (unsigned int i = 0; i < rawTx.vout.size(); ++i) {
1658 psbtx.outputs.emplace_back();
1659 }
1660
1661 // Serialize the PSBT
1662 DataStream ssTx{};
1663 ssTx << psbtx;
1664
1665 return EncodeBase64(ssTx);
1666},
1667 };
1668}
1669
1671{
1672 return RPCMethod{
1673 "converttopsbt",
1674 "Converts a network serialized transaction to a PSBT. This should be used only with createrawtransaction and fundrawtransaction\n"
1675 "createpsbt and walletcreatefundedpsbt should be used for new applications.\n",
1676 {
1677 {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of a raw transaction"},
1678 {"permitsigdata", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, any signatures in the input will be discarded and conversion\n"
1679 " will continue. If false, RPC will fail if any signatures are present."},
1680 {"iswitness", RPCArg::Type::BOOL, RPCArg::DefaultHint{"depends on heuristic tests"}, "Whether the transaction hex is a serialized witness transaction.\n"
1681 "If iswitness is not present, heuristic tests will be used in decoding.\n"
1682 "If true, only witness deserialization will be tried.\n"
1683 "If false, only non-witness deserialization will be tried.\n"
1684 "This boolean should reflect whether the transaction has inputs\n"
1685 "(e.g. fully valid, or on-chain transactions), if known by the caller."
1686 },
1687 },
1688 RPCResult{
1689 RPCResult::Type::STR, "", "The resulting raw transaction (base64-encoded string)"
1690 },
1692 "\nCreate a transaction\n"
1693 + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"") +
1694 "\nConvert the transaction to a PSBT\n"
1695 + HelpExampleCli("converttopsbt", "\"rawtransaction\"")
1696 },
1697 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1698{
1699 // parse hex string from parameter
1701 bool permitsigdata = request.params[1].isNull() ? false : request.params[1].get_bool();
1702 bool witness_specified = !request.params[2].isNull();
1703 bool iswitness = witness_specified ? request.params[2].get_bool() : false;
1704 const bool try_witness = witness_specified ? iswitness : true;
1705 const bool try_no_witness = witness_specified ? !iswitness : true;
1706 if (!DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
1707 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
1708 }
1709
1710 // Remove all scriptSigs and scriptWitnesses from inputs
1711 for (CTxIn& input : tx.vin) {
1712 if ((!input.scriptSig.empty() || !input.scriptWitness.IsNull()) && !permitsigdata) {
1713 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Inputs must not have scriptSigs and scriptWitnesses");
1714 }
1715 input.scriptSig.clear();
1716 input.scriptWitness.SetNull();
1717 }
1718
1719 // Make a blank psbt
1721 psbtx.tx = tx;
1722 for (unsigned int i = 0; i < tx.vin.size(); ++i) {
1723 psbtx.inputs.emplace_back();
1724 }
1725 for (unsigned int i = 0; i < tx.vout.size(); ++i) {
1726 psbtx.outputs.emplace_back();
1727 }
1728
1729 // Serialize the PSBT
1730 DataStream ssTx{};
1731 ssTx << psbtx;
1732
1733 return EncodeBase64(ssTx);
1734},
1735 };
1736}
1737
1739{
1740 return RPCMethod{
1741 "utxoupdatepsbt",
1742 "Updates all segwit inputs and outputs in a PSBT with data from output descriptors, the UTXO set, txindex, or the mempool.\n",
1743 {
1744 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
1745 {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "An array of either strings or objects", {
1746 {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
1747 {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
1748 {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
1749 {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
1750 }},
1751 }},
1752 },
1753 RPCResult {
1754 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction with inputs updated"
1755 },
1756 RPCExamples {
1757 HelpExampleCli("utxoupdatepsbt", "\"psbt\"")
1758 },
1759 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1760{
1761 // Parse descriptors, if any.
1762 FlatSigningProvider provider;
1763 if (!request.params[1].isNull()) {
1764 auto descs = request.params[1].get_array();
1765 for (size_t i = 0; i < descs.size(); ++i) {
1766 EvalDescriptorStringOrObject(descs[i], provider);
1767 }
1768 }
1769
1770 // We don't actually need private keys further on; hide them as a precaution.
1772 request.params[0].get_str(),
1773 request.context,
1774 HidingSigningProvider(&provider, /*hide_secret=*/true, /*hide_origin=*/false),
1775 /*sighash_type=*/std::nullopt,
1776 /*finalize=*/false);
1777
1778 DataStream ssTx{};
1779 ssTx << psbtx;
1780 return EncodeBase64(ssTx);
1781},
1782 };
1783}
1784
1786{
1787 return RPCMethod{
1788 "joinpsbts",
1789 "Joins multiple distinct PSBTs with different inputs and outputs into one PSBT with inputs and outputs from all of the PSBTs\n"
1790 "No input in any of the PSBTs can be in more than one of the PSBTs.\n",
1791 {
1792 {"txs", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base64 strings of partially signed transactions",
1793 {
1794 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1795 }}
1796 },
1797 RPCResult {
1798 RPCResult::Type::STR, "", "The base64-encoded partially signed transaction"
1799 },
1800 RPCExamples {
1801 HelpExampleCli("joinpsbts", "\"psbt\"")
1802 },
1803 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1804{
1805 // Unserialize the transactions
1806 std::vector<PartiallySignedTransaction> psbtxs;
1807 UniValue txs = request.params[0].get_array();
1808
1809 if (txs.size() <= 1) {
1810 throw JSONRPCError(RPC_INVALID_PARAMETER, "At least two PSBTs are required to join PSBTs.");
1811 }
1812
1813 uint32_t best_version = 1;
1814 uint32_t best_locktime = 0xffffffff;
1815 for (unsigned int i = 0; i < txs.size(); ++i) {
1817 std::string error;
1818 if (!DecodeBase64PSBT(psbtx, txs[i].get_str(), error)) {
1819 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1820 }
1821 psbtxs.push_back(psbtx);
1822 // Choose the highest version number
1823 if (psbtx.tx->version > best_version) {
1824 best_version = psbtx.tx->version;
1825 }
1826 // Choose the lowest lock time
1827 if (psbtx.tx->nLockTime < best_locktime) {
1828 best_locktime = psbtx.tx->nLockTime;
1829 }
1830 }
1831
1832 // Create a blank psbt where everything will be added
1833 PartiallySignedTransaction merged_psbt;
1834 merged_psbt.tx = CMutableTransaction();
1835 merged_psbt.tx->version = best_version;
1836 merged_psbt.tx->nLockTime = best_locktime;
1837
1838 // Merge
1839 for (auto& psbt : psbtxs) {
1840 for (unsigned int i = 0; i < psbt.tx->vin.size(); ++i) {
1841 if (!merged_psbt.AddInput(psbt.tx->vin[i], psbt.inputs[i])) {
1842 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));
1843 }
1844 }
1845 for (unsigned int i = 0; i < psbt.tx->vout.size(); ++i) {
1846 merged_psbt.AddOutput(psbt.tx->vout[i], psbt.outputs[i]);
1847 }
1848 for (auto& xpub_pair : psbt.m_xpubs) {
1849 if (!merged_psbt.m_xpubs.contains(xpub_pair.first)) {
1850 merged_psbt.m_xpubs[xpub_pair.first] = xpub_pair.second;
1851 } else {
1852 merged_psbt.m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
1853 }
1854 }
1855 merged_psbt.unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
1856 }
1857
1858 // Generate list of shuffled indices for shuffling inputs and outputs of the merged PSBT
1859 std::vector<int> input_indices(merged_psbt.inputs.size());
1860 std::iota(input_indices.begin(), input_indices.end(), 0);
1861 std::vector<int> output_indices(merged_psbt.outputs.size());
1862 std::iota(output_indices.begin(), output_indices.end(), 0);
1863
1864 // Shuffle input and output indices lists
1865 std::shuffle(input_indices.begin(), input_indices.end(), FastRandomContext());
1866 std::shuffle(output_indices.begin(), output_indices.end(), FastRandomContext());
1867
1868 PartiallySignedTransaction shuffled_psbt;
1869 shuffled_psbt.tx = CMutableTransaction();
1870 shuffled_psbt.tx->version = merged_psbt.tx->version;
1871 shuffled_psbt.tx->nLockTime = merged_psbt.tx->nLockTime;
1872 for (int i : input_indices) {
1873 shuffled_psbt.AddInput(merged_psbt.tx->vin[i], merged_psbt.inputs[i]);
1874 }
1875 for (int i : output_indices) {
1876 shuffled_psbt.AddOutput(merged_psbt.tx->vout[i], merged_psbt.outputs[i]);
1877 }
1878 shuffled_psbt.unknown.insert(merged_psbt.unknown.begin(), merged_psbt.unknown.end());
1879
1880 DataStream ssTx{};
1881 ssTx << shuffled_psbt;
1882 return EncodeBase64(ssTx);
1883},
1884 };
1885}
1886
1888{
1889 return RPCMethod{
1890 "analyzepsbt",
1891 "Analyzes and provides information about the current status of a PSBT and its inputs\n",
1892 {
1893 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}
1894 },
1895 RPCResult {
1896 RPCResult::Type::OBJ, "", "",
1897 {
1898 {RPCResult::Type::ARR, "inputs", /*optional=*/true, "",
1899 {
1900 {RPCResult::Type::OBJ, "", "",
1901 {
1902 {RPCResult::Type::BOOL, "has_utxo", "Whether a UTXO is provided"},
1903 {RPCResult::Type::BOOL, "is_final", "Whether the input is finalized"},
1904 {RPCResult::Type::OBJ, "missing", /*optional=*/true, "Things that are missing that are required to complete this input",
1905 {
1906 {RPCResult::Type::ARR, "pubkeys", /*optional=*/true, "",
1907 {
1908 {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose BIP 32 derivation path is missing"},
1909 }},
1910 {RPCResult::Type::ARR, "signatures", /*optional=*/true, "",
1911 {
1912 {RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose signature is missing"},
1913 }},
1914 {RPCResult::Type::STR_HEX, "redeemscript", /*optional=*/true, "Hash160 of the redeem script that is missing"},
1915 {RPCResult::Type::STR_HEX, "witnessscript", /*optional=*/true, "SHA256 of the witness script that is missing"},
1916 }},
1917 {RPCResult::Type::STR, "next", /*optional=*/true, "Role of the next person that this input needs to go to"},
1918 }},
1919 }},
1920 {RPCResult::Type::NUM, "estimated_vsize", /*optional=*/true, "Estimated vsize of the final signed transaction"},
1921 {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"},
1922 {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid. Shown only if all UTXO slots in the PSBT have been filled"},
1923 {RPCResult::Type::STR, "next", "Role of the next person that this psbt needs to go to"},
1924 {RPCResult::Type::STR, "error", /*optional=*/true, "Error message (if there is one)"},
1925 }
1926 },
1927 RPCExamples {
1928 HelpExampleCli("analyzepsbt", "\"psbt\"")
1929 },
1930 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1931{
1932 // Unserialize the transaction
1934 std::string error;
1935 if (!DecodeBase64PSBT(psbtx, request.params[0].get_str(), error)) {
1936 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
1937 }
1938
1939 PSBTAnalysis psbta = AnalyzePSBT(psbtx);
1940
1941 UniValue result(UniValue::VOBJ);
1942 UniValue inputs_result(UniValue::VARR);
1943 for (const auto& input : psbta.inputs) {
1944 UniValue input_univ(UniValue::VOBJ);
1945 UniValue missing(UniValue::VOBJ);
1946
1947 input_univ.pushKV("has_utxo", input.has_utxo);
1948 input_univ.pushKV("is_final", input.is_final);
1949 input_univ.pushKV("next", PSBTRoleName(input.next));
1950
1951 if (!input.missing_pubkeys.empty()) {
1952 UniValue missing_pubkeys_univ(UniValue::VARR);
1953 for (const CKeyID& pubkey : input.missing_pubkeys) {
1954 missing_pubkeys_univ.push_back(HexStr(pubkey));
1955 }
1956 missing.pushKV("pubkeys", std::move(missing_pubkeys_univ));
1957 }
1958 if (!input.missing_redeem_script.IsNull()) {
1959 missing.pushKV("redeemscript", HexStr(input.missing_redeem_script));
1960 }
1961 if (!input.missing_witness_script.IsNull()) {
1962 missing.pushKV("witnessscript", HexStr(input.missing_witness_script));
1963 }
1964 if (!input.missing_sigs.empty()) {
1965 UniValue missing_sigs_univ(UniValue::VARR);
1966 for (const CKeyID& pubkey : input.missing_sigs) {
1967 missing_sigs_univ.push_back(HexStr(pubkey));
1968 }
1969 missing.pushKV("signatures", std::move(missing_sigs_univ));
1970 }
1971 if (!missing.getKeys().empty()) {
1972 input_univ.pushKV("missing", std::move(missing));
1973 }
1974 inputs_result.push_back(std::move(input_univ));
1975 }
1976 if (!inputs_result.empty()) result.pushKV("inputs", std::move(inputs_result));
1977
1978 if (psbta.estimated_vsize != std::nullopt) {
1979 result.pushKV("estimated_vsize", *psbta.estimated_vsize);
1980 }
1981 if (psbta.estimated_feerate != std::nullopt) {
1982 result.pushKV("estimated_feerate", ValueFromAmount(psbta.estimated_feerate->GetFeePerK()));
1983 }
1984 if (psbta.fee != std::nullopt) {
1985 result.pushKV("fee", ValueFromAmount(*psbta.fee));
1986 }
1987 result.pushKV("next", PSBTRoleName(psbta.next));
1988 if (!psbta.error.empty()) {
1989 result.pushKV("error", psbta.error);
1990 }
1991
1992 return result;
1993},
1994 };
1995}
1996
1998{
1999 return RPCMethod{
2000 "descriptorprocesspsbt",
2001 "Update all segwit inputs in a PSBT with information from output descriptors, the UTXO set or the mempool. \n"
2002 "Then, sign the inputs we are able to with information from the output descriptors. ",
2003 {
2004 {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction base64 string"},
2005 {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::NO, "An array of either strings or objects", {
2006 {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "An output descriptor"},
2007 {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with an output descriptor and extra information", {
2008 {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
2009 {"range", RPCArg::Type::RANGE, RPCArg::Default{1000}, "Up to what index HD chains should be explored (either end or [begin,end])"},
2010 }},
2011 }},
2012 {"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"
2013 " \"DEFAULT\"\n"
2014 " \"ALL\"\n"
2015 " \"NONE\"\n"
2016 " \"SINGLE\"\n"
2017 " \"ALL|ANYONECANPAY\"\n"
2018 " \"NONE|ANYONECANPAY\"\n"
2019 " \"SINGLE|ANYONECANPAY\""},
2020 {"bip32derivs", RPCArg::Type::BOOL, RPCArg::Default{true}, "Include BIP 32 derivation paths for public keys if we know them"},
2021 {"finalize", RPCArg::Type::BOOL, RPCArg::Default{true}, "Also finalize inputs if possible"},
2022 },
2023 RPCResult{
2024 RPCResult::Type::OBJ, "", "",
2025 {
2026 {RPCResult::Type::STR, "psbt", "The base64-encoded partially signed transaction"},
2027 {RPCResult::Type::BOOL, "complete", "If the transaction has a complete set of signatures"},
2028 {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The hex-encoded network transaction if complete"},
2029 }
2030 },
2032 HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[\\\"descriptor1\\\", \\\"descriptor2\\\"]\"") +
2033 HelpExampleCli("descriptorprocesspsbt", "\"psbt\" \"[{\\\"desc\\\":\\\"mydescriptor\\\", \\\"range\\\":21}]\"")
2034 },
2035 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
2036{
2037 // Add descriptor information to a signing provider
2038 FlatSigningProvider provider;
2039
2040 auto descs = request.params[1].get_array();
2041 for (size_t i = 0; i < descs.size(); ++i) {
2042 EvalDescriptorStringOrObject(descs[i], provider, /*expand_priv=*/true);
2043 }
2044
2045 std::optional<int> sighash_type = ParseSighashString(request.params[2]);
2046 bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
2047 bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
2048
2050 request.params[0].get_str(),
2051 request.context,
2052 HidingSigningProvider(&provider, /*hide_secret=*/false, !bip32derivs),
2053 sighash_type,
2054 finalize);
2055
2056 // Check whether or not all of the inputs are now signed
2057 bool complete = true;
2058 for (const auto& input : psbtx.inputs) {
2059 complete &= PSBTInputSigned(input);
2060 }
2061
2062 DataStream ssTx{};
2063 ssTx << psbtx;
2064
2065 UniValue result(UniValue::VOBJ);
2066
2067 result.pushKV("psbt", EncodeBase64(ssTx));
2068 result.pushKV("complete", complete);
2069 if (complete) {
2071 PartiallySignedTransaction psbtx_copy = psbtx;
2072 CHECK_NONFATAL(FinalizeAndExtractPSBT(psbtx_copy, mtx));
2073 DataStream ssTx_final;
2074 ssTx_final << TX_WITH_WITNESS(mtx);
2075 result.pushKV("hex", HexStr(ssTx_final));
2076 }
2077 return result;
2078},
2079 };
2080}
2081
2083{
2084 static const CRPCCommand commands[]{
2085 {"rawtransactions", &getrawtransaction},
2086 {"rawtransactions", &createrawtransaction},
2087 {"rawtransactions", &decoderawtransaction},
2088 {"rawtransactions", &decodescript},
2089 {"rawtransactions", &combinerawtransaction},
2090 {"rawtransactions", &signrawtransactionwithkey},
2091 {"rawtransactions", &decodepsbt},
2092 {"rawtransactions", &combinepsbt},
2093 {"rawtransactions", &finalizepsbt},
2094 {"rawtransactions", &createpsbt},
2095 {"rawtransactions", &converttopsbt},
2096 {"rawtransactions", &utxoupdatepsbt},
2097 {"rawtransactions", &descriptorprocesspsbt},
2098 {"rawtransactions", &joinpsbts},
2099 {"rawtransactions", &analyzepsbt},
2100 };
2101 for (const auto& c : commands) {
2102 t.appendCommand(c.name, &c);
2103 }
2104}
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:63
@ 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:112
#define NONFATAL_UNREACHABLE()
NONFATAL_UNREACHABLE() is a macro that is used to mark unreachable code.
Definition: check.h:133
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:64
std::vector< CTxUndo > vtxundo
Definition: undo.h:66
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
CCoinsView that adds a memory cache for transactions to another CCoinsView.
Definition: coins.h:394
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:54
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
static CoinsViewEmpty & Get()
Definition: coins.cpp:17
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:165
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:49
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:184
256-bit opaque blob.
Definition: uint256.h:196
std::string EncodeHexTx(const CTransaction &tx)
Definition: core_io.cpp:399
std::string SighashToStr(unsigned char sighash_type)
Definition: core_io.cpp:340
bool DecodeHexTx(CMutableTransaction &tx, const std::string &hex_tx, bool try_no_witness, bool try_witness)
Definition: core_io.cpp:224
void ScriptToUniv(const CScript &script, UniValue &out, bool include_hex, bool include_address, const SigningProvider *provider)
Definition: core_io.cpp:406
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:427
std::string ScriptToAsmStr(const CScript &script, const bool fAttemptSighashDecode)
Create the assembly string representation of a CScript object.
Definition: core_io.cpp:354
UniValue ValueFromAmount(const CAmount amount)
Definition: core_io.cpp:282
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()
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)
static RPCMethod createpsbt()
static RPCMethod combinerawtransaction()
static std::vector< RPCArg > CreateTxDoc()
const RPCResult & DecodePSBTOutputs()
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()
const RPCResult & DecodePSBTInputs()
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:57
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)