Skip to content

Commit e8a6d52

Browse files
committed
Merge #16542: Return more specific errors about invalid descriptors
787c9ec Additional tests for other failure cases (Andrew Chow) 6e1ae58 Check error messages in descriptor tests (Andrew Chow) 625534d Give more errors for specific failure conditions (Andrew Chow) c325f61 Return an error from descriptor Parse that gives more information about what failed (Andrew Chow) Pull request description: Because it's nigh impossible to figure out what is wrong with a descriptor otherwise. ACKs for top commit: Sjors: ACK 787c9ec meshcollider: Code review ACK 787c9ec Tree-SHA512: 07c5deff127fd65507b96df2e4608b4f918e0cbd20b3b45b9ab5a05c2985a6efa9832079cf1e7f504305bfbb861019e93b96cc1574dd63b2ff0756b5928ece20
2 parents 1124be6 + 787c9ec commit e8a6d52

File tree

8 files changed

+207
-83
lines changed

8 files changed

+207
-83
lines changed

src/rpc/misc.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,10 @@ UniValue getdescriptorinfo(const JSONRPCRequest& request)
150150
RPCTypeCheck(request.params, {UniValue::VSTR});
151151

152152
FlatSigningProvider provider;
153-
auto desc = Parse(request.params[0].get_str(), provider);
153+
std::string error;
154+
auto desc = Parse(request.params[0].get_str(), provider, error);
154155
if (!desc) {
155-
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Invalid descriptor"));
156+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
156157
}
157158

158159
UniValue result(UniValue::VOBJ);
@@ -199,9 +200,10 @@ UniValue deriveaddresses(const JSONRPCRequest& request)
199200
}
200201

201202
FlatSigningProvider key_provider;
202-
auto desc = Parse(desc_str, key_provider, /* require_checksum = */ true);
203+
std::string error;
204+
auto desc = Parse(desc_str, key_provider, error, /* require_checksum = */ true);
203205
if (!desc) {
204-
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Invalid descriptor"));
206+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
205207
}
206208

207209
if (!desc->IsRange() && request.params.size() > 1) {

src/rpc/util.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,10 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
717717
throw JSONRPCError(RPC_INVALID_PARAMETER, "Scan object needs to be either a string or an object");
718718
}
719719

720-
auto desc = Parse(desc_str, provider);
720+
std::string error;
721+
auto desc = Parse(desc_str, provider, error);
721722
if (!desc) {
722-
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Invalid descriptor '%s'", desc_str));
723+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
723724
}
724725
if (!desc->IsRange()) {
725726
range.first = 0;

src/script/descriptor.cpp

Lines changed: 145 additions & 43 deletions
Large diffs are not rendered by default.

src/script/descriptor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct Descriptor {
7979
* If a parse error occurs, or the checksum is missing/invalid, or anything
8080
* else is wrong, nullptr is returned.
8181
*/
82-
std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, bool require_checksum = false);
82+
std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum = false);
8383

8484
/** Get the checksum for a descriptor.
8585
*

src/test/descriptor_tests.cpp

Lines changed: 46 additions & 28 deletions
Large diffs are not rendered by default.

src/wallet/rpcdump.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,9 +1098,10 @@ static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID
10981098

10991099
const std::string& descriptor = data["desc"].get_str();
11001100
FlatSigningProvider keys;
1101-
auto parsed_desc = Parse(descriptor, keys, /* require_checksum = */ true);
1101+
std::string error;
1102+
auto parsed_desc = Parse(descriptor, keys, error, /* require_checksum = */ true);
11021103
if (!parsed_desc) {
1103-
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Descriptor is invalid");
1104+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
11041105
}
11051106

11061107
have_solving_data = parsed_desc->IsSolvable();

test/functional/rpc_deriveaddresses.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ def set_test_params(self):
1313
self.supports_cli = 1
1414

1515
def run_test(self):
16-
assert_raises_rpc_error(-5, "Invalid descriptor", self.nodes[0].deriveaddresses, "a")
16+
assert_raises_rpc_error(-5, "Missing checksum", self.nodes[0].deriveaddresses, "a")
1717

1818
descriptor = "wpkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)#t6wfjs64"
1919
address = "bcrt1qjqmxmkpmxt80xz4y3746zgt0q3u3ferr34acd5"
2020
assert_equal(self.nodes[0].deriveaddresses(descriptor), [address])
2121

2222
descriptor = descriptor[:-9]
23-
assert_raises_rpc_error(-5, "Invalid descriptor", self.nodes[0].deriveaddresses, descriptor)
23+
assert_raises_rpc_error(-5, "Missing checksum", self.nodes[0].deriveaddresses, descriptor)
2424

2525
descriptor_pubkey = "wpkh(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/0)#s9ga3alw"
2626
address = "bcrt1qjqmxmkpmxt80xz4y3746zgt0q3u3ferr34acd5"

test/functional/wallet_importmulti.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ def run_test(self):
552552
"keys": [key.privkey]},
553553
success=False,
554554
error_code=-5,
555-
error_message="Descriptor is invalid")
555+
error_message="Missing checksum")
556556

557557
# Test importing of a P2SH-P2WPKH address via descriptor + private key
558558
key = get_key(self.nodes[0])

0 commit comments

Comments
 (0)