mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-13 07:28:59 +01:00
Merge #14477: Add ability to convert solvability info to descriptor
109699dd33Add release notes (Pieter Wuille)b65326b562Add matching descriptors to scantxoutset output + tests (Pieter Wuille)16203d5df7Add descriptors to listunspent and getaddressinfo + tests (Pieter Wuille)9b2a25b13fAdd tests for InferDescriptor and Descriptor::IsSolvable (Pieter Wuille)225bf3e3b0Add Descriptor::IsSolvable() to distinguish addr/raw from others (Pieter Wuille)4d78bd93b5Add support for inferring descriptors from scripts (Pieter Wuille) Pull request description: This PR adds functionality to convert a script to a descriptor, given a `SigningProvider` with the relevant information about public keys and redeemscripts/witnessscripts. The feature is exposed in `listunspent`, `getaddressinfo`, and `scantxoutset` whenever these calls are applied to solvable outputs/addresses. This is not very useful on its own, though when we add RPCs to import descriptors, or sign PSBTs using descriptors, these strings become a compact and standalone way of conveying everything necessary to sign an output (excluding private keys). Unit tests and rudimentary RPC tests are included (more relevant tests can be added once RPCs support descriptors). Fixes #14503. Tree-SHA512: cb36b84a3e0200375b7e06a98c7e750cfaf95cf5de132cad59f7ec3cbd201f739427de0dc108f515be7aca203652089fbf5f24ed283d4553bddf23a3224ab31f
This commit is contained in:
@@ -2187,6 +2187,7 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
||||
" \"txid\" : \"transactionid\", (string) The transaction id\n"
|
||||
" \"vout\": n, (numeric) the vout value\n"
|
||||
" \"scriptPubKey\" : \"script\", (string) the script key\n"
|
||||
" \"desc\" : \"descriptor\", (string) A specialized descriptor for the matched scriptPubKey\n"
|
||||
" \"amount\" : x.xxx, (numeric) The total amount in " + CURRENCY_UNIT + " of the unspent output\n"
|
||||
" \"height\" : n, (numeric) Height of the unspent transaction output\n"
|
||||
" }\n"
|
||||
@@ -2221,6 +2222,7 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Scan already in progress, use action \"abort\" or \"status\"");
|
||||
}
|
||||
std::set<CScript> needles;
|
||||
std::map<CScript, std::string> descriptors;
|
||||
CAmount total_in = 0;
|
||||
|
||||
// loop through the scan objects
|
||||
@@ -2253,7 +2255,11 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
||||
if (!desc->Expand(i, provider, scripts, provider)) {
|
||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys: '%s'", desc_str));
|
||||
}
|
||||
needles.insert(scripts.begin(), scripts.end());
|
||||
for (const auto& script : scripts) {
|
||||
std::string inferred = InferDescriptor(script, provider)->ToString();
|
||||
needles.emplace(script);
|
||||
descriptors.emplace(std::move(script), std::move(inferred));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2286,6 +2292,7 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
||||
unspent.pushKV("txid", outpoint.hash.GetHex());
|
||||
unspent.pushKV("vout", (int32_t)outpoint.n);
|
||||
unspent.pushKV("scriptPubKey", HexStr(txo.scriptPubKey.begin(), txo.scriptPubKey.end()));
|
||||
unspent.pushKV("desc", descriptors[txo.scriptPubKey]);
|
||||
unspent.pushKV("amount", ValueFromAmount(txo.nValue));
|
||||
unspent.pushKV("height", (int32_t)coin.nHeight);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user