@@ -171,6 +171,98 @@ static bool CreateTaprootScriptSig(const BaseSignatureCreator& creator, Signatur
171
171
return false ;
172
172
}
173
173
174
+ template <typename M, typename K, typename V>
175
+ miniscript::Availability MsLookupHelper (const M& map, const K& key, V& value)
176
+ {
177
+ auto it = map.find (key);
178
+ if (it != map.end ()) {
179
+ value = it->second ;
180
+ return miniscript::Availability::YES;
181
+ }
182
+ return miniscript::Availability::NO;
183
+ }
184
+
185
+ /* *
186
+ * Context for solving a Miniscript.
187
+ * If enough material (access to keys, hash preimages, ..) is given, produces a valid satisfaction.
188
+ */
189
+ struct Satisfier {
190
+ typedef CPubKey Key;
191
+
192
+ const SigningProvider& m_provider;
193
+ SignatureData& m_sig_data;
194
+ const BaseSignatureCreator& m_creator;
195
+ const CScript& m_witness_script;
196
+ // ! For now Miniscript is only available under P2WSH.
197
+ const miniscript::MiniscriptContext m_script_ctx{miniscript::MiniscriptContext::P2WSH};
198
+
199
+ explicit Satisfier (const SigningProvider& provider LIFETIMEBOUND, SignatureData& sig_data LIFETIMEBOUND,
200
+ const BaseSignatureCreator& creator LIFETIMEBOUND,
201
+ const CScript& witscript LIFETIMEBOUND) : m_provider(provider),
202
+ m_sig_data(sig_data),
203
+ m_creator(creator),
204
+ m_witness_script(witscript) {}
205
+
206
+ static bool KeyCompare (const Key& a, const Key& b) {
207
+ return a < b;
208
+ }
209
+
210
+ // ! Conversion from a raw public key.
211
+ template <typename I>
212
+ std::optional<Key> FromPKBytes (I first, I last) const
213
+ {
214
+ Key pubkey{first, last};
215
+ if (pubkey.IsValid ()) return pubkey;
216
+ return {};
217
+ }
218
+
219
+ // ! Conversion from a raw public key hash.
220
+ template <typename I>
221
+ std::optional<Key> FromPKHBytes (I first, I last) const {
222
+ assert (last - first == 20 );
223
+ Key pubkey;
224
+ CKeyID key_id;
225
+ std::copy (first, last, key_id.begin ());
226
+ if (GetPubKey (m_provider, m_sig_data, key_id, pubkey)) return pubkey;
227
+ m_sig_data.missing_pubkeys .push_back (key_id);
228
+ return {};
229
+ }
230
+
231
+ // ! Conversion to raw public key.
232
+ std::vector<unsigned char > ToPKBytes (const CPubKey& key) const { return {key.begin (), key.end ()}; }
233
+
234
+ // ! Satisfy a signature check.
235
+ miniscript::Availability Sign (const CPubKey& key, std::vector<unsigned char >& sig) const {
236
+ if (CreateSig (m_creator, m_sig_data, m_provider, sig, key, m_witness_script, SigVersion::WITNESS_V0)) {
237
+ return miniscript::Availability::YES;
238
+ }
239
+ return miniscript::Availability::NO;
240
+ }
241
+
242
+ // ! Time lock satisfactions.
243
+ bool CheckAfter (uint32_t value) const { return m_creator.Checker ().CheckLockTime (CScriptNum (value)); }
244
+ bool CheckOlder (uint32_t value) const { return m_creator.Checker ().CheckSequence (CScriptNum (value)); }
245
+
246
+
247
+ // ! Hash preimage satisfactions.
248
+ miniscript::Availability SatSHA256 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
249
+ return MsLookupHelper (m_sig_data.sha256_preimages , hash, preimage);
250
+ }
251
+ miniscript::Availability SatRIPEMD160 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
252
+ return MsLookupHelper (m_sig_data.ripemd160_preimages , hash, preimage);
253
+ }
254
+ miniscript::Availability SatHASH256 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
255
+ return MsLookupHelper (m_sig_data.hash256_preimages , hash, preimage);
256
+ }
257
+ miniscript::Availability SatHASH160 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
258
+ return MsLookupHelper (m_sig_data.hash160_preimages , hash, preimage);
259
+ }
260
+
261
+ miniscript::MiniscriptContext MsContext () const {
262
+ return m_script_ctx;
263
+ }
264
+ };
265
+
174
266
static bool SignTaprootScript (const SigningProvider& provider, const BaseSignatureCreator& creator, SignatureData& sigdata, int leaf_version, Span<const unsigned char > script_bytes, std::vector<valtype>& result)
175
267
{
176
268
// Only BIP342 tapscript signing is supported for now.
@@ -382,98 +474,6 @@ static CScript PushAll(const std::vector<valtype>& values)
382
474
return result;
383
475
}
384
476
385
- template <typename M, typename K, typename V>
386
- miniscript::Availability MsLookupHelper (const M& map, const K& key, V& value)
387
- {
388
- auto it = map.find (key);
389
- if (it != map.end ()) {
390
- value = it->second ;
391
- return miniscript::Availability::YES;
392
- }
393
- return miniscript::Availability::NO;
394
- }
395
-
396
- /* *
397
- * Context for solving a Miniscript.
398
- * If enough material (access to keys, hash preimages, ..) is given, produces a valid satisfaction.
399
- */
400
- struct Satisfier {
401
- typedef CPubKey Key;
402
-
403
- const SigningProvider& m_provider;
404
- SignatureData& m_sig_data;
405
- const BaseSignatureCreator& m_creator;
406
- const CScript& m_witness_script;
407
- // ! For now Miniscript is only available under P2WSH.
408
- const miniscript::MiniscriptContext m_script_ctx{miniscript::MiniscriptContext::P2WSH};
409
-
410
- explicit Satisfier (const SigningProvider& provider LIFETIMEBOUND, SignatureData& sig_data LIFETIMEBOUND,
411
- const BaseSignatureCreator& creator LIFETIMEBOUND,
412
- const CScript& witscript LIFETIMEBOUND) : m_provider(provider),
413
- m_sig_data(sig_data),
414
- m_creator(creator),
415
- m_witness_script(witscript) {}
416
-
417
- static bool KeyCompare (const Key& a, const Key& b) {
418
- return a < b;
419
- }
420
-
421
- // ! Conversion from a raw public key.
422
- template <typename I>
423
- std::optional<Key> FromPKBytes (I first, I last) const
424
- {
425
- Key pubkey{first, last};
426
- if (pubkey.IsValid ()) return pubkey;
427
- return {};
428
- }
429
-
430
- // ! Conversion from a raw public key hash.
431
- template <typename I>
432
- std::optional<Key> FromPKHBytes (I first, I last) const {
433
- assert (last - first == 20 );
434
- Key pubkey;
435
- CKeyID key_id;
436
- std::copy (first, last, key_id.begin ());
437
- if (GetPubKey (m_provider, m_sig_data, key_id, pubkey)) return pubkey;
438
- m_sig_data.missing_pubkeys .push_back (key_id);
439
- return {};
440
- }
441
-
442
- // ! Conversion to raw public key.
443
- std::vector<unsigned char > ToPKBytes (const CPubKey& key) const { return {key.begin (), key.end ()}; }
444
-
445
- // ! Satisfy a signature check.
446
- miniscript::Availability Sign (const CPubKey& key, std::vector<unsigned char >& sig) const {
447
- if (CreateSig (m_creator, m_sig_data, m_provider, sig, key, m_witness_script, SigVersion::WITNESS_V0)) {
448
- return miniscript::Availability::YES;
449
- }
450
- return miniscript::Availability::NO;
451
- }
452
-
453
- // ! Time lock satisfactions.
454
- bool CheckAfter (uint32_t value) const { return m_creator.Checker ().CheckLockTime (CScriptNum (value)); }
455
- bool CheckOlder (uint32_t value) const { return m_creator.Checker ().CheckSequence (CScriptNum (value)); }
456
-
457
-
458
- // ! Hash preimage satisfactions.
459
- miniscript::Availability SatSHA256 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
460
- return MsLookupHelper (m_sig_data.sha256_preimages , hash, preimage);
461
- }
462
- miniscript::Availability SatRIPEMD160 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
463
- return MsLookupHelper (m_sig_data.ripemd160_preimages , hash, preimage);
464
- }
465
- miniscript::Availability SatHASH256 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
466
- return MsLookupHelper (m_sig_data.hash256_preimages , hash, preimage);
467
- }
468
- miniscript::Availability SatHASH160 (const std::vector<unsigned char >& hash, std::vector<unsigned char >& preimage) const {
469
- return MsLookupHelper (m_sig_data.hash160_preimages , hash, preimage);
470
- }
471
-
472
- miniscript::MiniscriptContext MsContext () const {
473
- return m_script_ctx;
474
- }
475
- };
476
-
477
477
bool ProduceSignature (const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata)
478
478
{
479
479
if (sigdata.complete ) return true ;
0 commit comments