Skip to content

Commit c3738d0

Browse files
committed
miniscript: introduce a MsContext() helper to contexts
We are going to introduce Tapscript support in Miniscript, for which some of Miniscript rules and properties change (new or modified fragments, different typing rules, different resources consumption, ..).
1 parent bba9340 commit c3738d0

File tree

5 files changed

+35
-3
lines changed

5 files changed

+35
-3
lines changed

src/script/descriptor.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,8 +1426,11 @@ struct KeyParser {
14261426
mutable std::vector<std::unique_ptr<PubkeyProvider>> m_keys;
14271427
//! Used to detect key parsing errors within a Miniscript.
14281428
mutable std::string m_key_parsing_error;
1429+
//! The script context we're operating within (Tapscript or P2WSH).
1430+
const miniscript::MiniscriptContext m_script_ctx;
14291431

1430-
KeyParser(FlatSigningProvider* out LIFETIMEBOUND, const SigningProvider* in LIFETIMEBOUND) : m_out(out), m_in(in) {}
1432+
KeyParser(FlatSigningProvider* out LIFETIMEBOUND, const SigningProvider* in LIFETIMEBOUND, miniscript::MiniscriptContext ctx)
1433+
: m_out(out), m_in(in), m_script_ctx(ctx) {}
14311434

14321435
bool KeyCompare(const Key& a, const Key& b) const {
14331436
return *m_keys.at(a) < *m_keys.at(b);
@@ -1475,6 +1478,10 @@ struct KeyParser {
14751478
}
14761479
return {};
14771480
}
1481+
1482+
miniscript::MiniscriptContext MsContext() const {
1483+
return m_script_ctx;
1484+
}
14781485
};
14791486

14801487
/** Parse a script in a particular context. */
@@ -1714,7 +1721,7 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
17141721
}
17151722
// Process miniscript expressions.
17161723
{
1717-
KeyParser parser(&out, nullptr);
1724+
KeyParser parser(/*out = */&out, /* in = */nullptr, /* ctx = */miniscript::MiniscriptContext::P2WSH);
17181725
auto node = miniscript::FromString(std::string(expr.begin(), expr.end()), parser);
17191726
if (node) {
17201727
if (ctx != ParseScriptContext::P2WSH) {
@@ -1887,7 +1894,7 @@ std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptCo
18871894
}
18881895

18891896
if (ctx == ParseScriptContext::P2WSH) {
1890-
KeyParser parser(nullptr, &provider);
1897+
KeyParser parser(/* out = */nullptr, /* in = */&provider, /* ctx = */miniscript::MiniscriptContext::P2WSH);
18911898
auto node = miniscript::FromScript(script, parser);
18921899
if (node && node->IsSane()) {
18931900
return std::make_unique<MiniscriptDescriptor>(std::move(parser.m_keys), std::move(node));

src/script/miniscript.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,11 @@ enum class Availability {
229229
MAYBE,
230230
};
231231

232+
enum class MiniscriptContext {
233+
P2WSH,
234+
TAPSCRIPT,
235+
};
236+
232237
namespace internal {
233238

234239
//! Helper function for Node::CalcType.

src/script/sign.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ struct Satisfier {
404404
SignatureData& m_sig_data;
405405
const BaseSignatureCreator& m_creator;
406406
const CScript& m_witness_script;
407+
//! For now Miniscript is only available under P2WSH.
408+
const miniscript::MiniscriptContext m_script_ctx{miniscript::MiniscriptContext::P2WSH};
407409

408410
explicit Satisfier(const SigningProvider& provider LIFETIMEBOUND, SignatureData& sig_data LIFETIMEBOUND,
409411
const BaseSignatureCreator& creator LIFETIMEBOUND,
@@ -466,6 +468,10 @@ struct Satisfier {
466468
miniscript::Availability SatHASH160(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
467469
return MsLookupHelper(m_sig_data.hash160_preimages, hash, preimage);
468470
}
471+
472+
miniscript::MiniscriptContext MsContext() const {
473+
return m_script_ctx;
474+
}
469475
};
470476

471477
bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata)

src/test/fuzz/miniscript.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ struct ParserContext {
128128
if (it == TEST_DATA.dummy_keys_map.end()) return {};
129129
return it->second;
130130
}
131+
132+
miniscript::MiniscriptContext MsContext() const {
133+
return miniscript::MiniscriptContext::P2WSH;
134+
}
131135
} PARSER_CTX;
132136

133137
//! Context that implements naive conversion from/to script only, for roundtrip testing.
@@ -172,6 +176,10 @@ struct ScriptParserContext {
172176
key.is_hash = true;
173177
return key;
174178
}
179+
180+
miniscript::MiniscriptContext MsContext() const {
181+
return miniscript::MiniscriptContext::P2WSH;
182+
}
175183
} SCRIPT_PARSER_CONTEXT;
176184

177185
//! Context to produce a satisfaction for a Miniscript node using the pre-computed data.

src/test/miniscript_tests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ typedef std::pair<ChallengeType, uint32_t> Challenge;
114114
struct KeyConverter {
115115
typedef CPubKey Key;
116116

117+
const miniscript::MiniscriptContext m_script_ctx{miniscript::MiniscriptContext::P2WSH};
118+
117119
bool KeyCompare(const Key& a, const Key& b) const {
118120
return a < b;
119121
}
@@ -158,6 +160,10 @@ struct KeyConverter {
158160
std::optional<std::string> ToString(const Key& key) const {
159161
return HexStr(ToPKBytes(key));
160162
}
163+
164+
miniscript::MiniscriptContext MsContext() const {
165+
return m_script_ctx;
166+
}
161167
};
162168

163169
/** A class that encapsulates all signing/hash revealing operations. */

0 commit comments

Comments
 (0)