Skip to content

Commit d6f225f

Browse files
author
MarcoFalke
committed
Merge bitcoin/bitcoin#24462: For descriptor pubkey parse errors, include context information
9b52672 For descriptor pubkey parse errors, include context information (Ben Woosley) Pull request description: This adds readily-available context information to the error string, for further disambiguation. This is a revival of #16123 which was largely addressed in #16542. Note 'Multi:' is used rather than 'multi():' as it also encompasses 'sortedmulti():' ACKs for top commit: achow101: ACK 9b52672 theStack: ACK 9b52672 Tree-SHA512: 96533ea8c3ac7010f9b62e75b4bd20b65aff843030eb91c7a88312975acecaaf17909b7d1841f45edc86dbf7fa402d208adb85f0673bd79b857dbebacb8c9395
2 parents f05cf59 + 9b52672 commit d6f225f

File tree

2 files changed

+38
-20
lines changed

2 files changed

+38
-20
lines changed

src/script/descriptor.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,13 +1066,19 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
10661066
auto expr = Expr(sp);
10671067
if (Func("pk", expr)) {
10681068
auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
1069-
if (!pubkey) return nullptr;
1069+
if (!pubkey) {
1070+
error = strprintf("pk(): %s", error);
1071+
return nullptr;
1072+
}
10701073
++key_exp_index;
10711074
return std::make_unique<PKDescriptor>(std::move(pubkey), ctx == ParseScriptContext::P2TR);
10721075
}
10731076
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH || ctx == ParseScriptContext::P2WSH) && Func("pkh", expr)) {
10741077
auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
1075-
if (!pubkey) return nullptr;
1078+
if (!pubkey) {
1079+
error = strprintf("pkh(): %s", error);
1080+
return nullptr;
1081+
}
10761082
++key_exp_index;
10771083
return std::make_unique<PKHDescriptor>(std::move(pubkey));
10781084
} else if (Func("pkh", expr)) {
@@ -1081,7 +1087,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
10811087
}
10821088
if (ctx == ParseScriptContext::TOP && Func("combo", expr)) {
10831089
auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
1084-
if (!pubkey) return nullptr;
1090+
if (!pubkey) {
1091+
error = strprintf("combo(): %s", error);
1092+
return nullptr;
1093+
}
10851094
++key_exp_index;
10861095
return std::make_unique<ComboDescriptor>(std::move(pubkey));
10871096
} else if (Func("combo", expr)) {
@@ -1109,7 +1118,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
11091118
}
11101119
auto arg = Expr(expr);
11111120
auto pk = ParsePubkey(key_exp_index, arg, ctx, out, error);
1112-
if (!pk) return nullptr;
1121+
if (!pk) {
1122+
error = strprintf("Multi: %s", error);
1123+
return nullptr;
1124+
}
11131125
script_size += pk->GetSize() + 1;
11141126
providers.emplace_back(std::move(pk));
11151127
key_exp_index++;
@@ -1154,7 +1166,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
11541166
}
11551167
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH) && Func("wpkh", expr)) {
11561168
auto pubkey = ParsePubkey(key_exp_index, expr, ParseScriptContext::P2WPKH, out, error);
1157-
if (!pubkey) return nullptr;
1169+
if (!pubkey) {
1170+
error = strprintf("wpkh(): %s", error);
1171+
return nullptr;
1172+
}
11581173
key_exp_index++;
11591174
return std::make_unique<WPKHDescriptor>(std::move(pubkey));
11601175
} else if (Func("wpkh", expr)) {
@@ -1191,7 +1206,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
11911206
if (ctx == ParseScriptContext::TOP && Func("tr", expr)) {
11921207
auto arg = Expr(expr);
11931208
auto internal_key = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
1194-
if (!internal_key) return nullptr;
1209+
if (!internal_key) {
1210+
error = strprintf("tr(): %s", error);
1211+
return nullptr;
1212+
}
11951213
++key_exp_index;
11961214
std::vector<std::unique_ptr<DescriptorImpl>> subscripts; //!< list of script subexpressions
11971215
std::vector<int> depths; //!< depth in the tree of each subexpression (same length subscripts)

0 commit comments

Comments
 (0)