@@ -46,6 +46,11 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
46
46
None
47
47
}
48
48
49
+ /// Given a public key, look up an schnorr signature with that key
50
+ fn lookup_schnorr_sig ( & self , _: & Pk ) -> Option < bitcoin:: SchnorrSig > {
51
+ None
52
+ }
53
+
49
54
/// Given a `Pkh`, lookup corresponding `Pk`
50
55
fn lookup_pkh_pk ( & self , _: & Pk :: Hash ) -> Option < Pk > {
51
56
None
@@ -62,6 +67,17 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
62
67
None
63
68
}
64
69
70
+ /// Given a keyhash, look up the schnorr signature and the associated key
71
+ /// Even if signatures for public key Hashes are not available, the users
72
+ /// can use this map to provide pkh -> pk mapping which can be useful
73
+ /// for dissatisfying pkh.
74
+ fn lookup_pkh_schnorr_sig (
75
+ & self ,
76
+ _: & Pk :: Hash ,
77
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
78
+ None
79
+ }
80
+
65
81
/// Given a SHA256 hash, look up its preimage
66
82
fn lookup_sha256 ( & self , _: sha256:: Hash ) -> Option < Preimage32 > {
67
83
None
@@ -142,6 +158,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::Ecd
142
158
}
143
159
}
144
160
161
+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk , bitcoin:: SchnorrSig > {
162
+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
163
+ self . get ( key) . map ( |x| * x)
164
+ }
165
+ }
166
+
145
167
impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: EcdsaSig ) >
146
168
where
147
169
Pk : MiniscriptKey + ToPublicKey ,
@@ -163,11 +185,36 @@ where
163
185
}
164
186
}
165
187
188
+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: SchnorrSig ) >
189
+ where
190
+ Pk : MiniscriptKey + ToPublicKey ,
191
+ {
192
+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
193
+ self . get ( & key. to_pubkeyhash ( ) ) . map ( |x| x. 1 )
194
+ }
195
+
196
+ fn lookup_pkh_pk ( & self , pk_hash : & Pk :: Hash ) -> Option < Pk > {
197
+ self . get ( pk_hash) . map ( |x| x. 0 . clone ( ) )
198
+ }
199
+
200
+ fn lookup_pkh_schnorr_sig (
201
+ & self ,
202
+ pk_hash : & Pk :: Hash ,
203
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
204
+ self . get ( pk_hash)
205
+ . map ( |& ( ref pk, sig) | ( pk. to_public_key ( ) , sig) )
206
+ }
207
+ }
208
+
166
209
impl < ' a , Pk : MiniscriptKey + ToPublicKey , S : Satisfier < Pk > > Satisfier < Pk > for & ' a S {
167
210
fn lookup_ecdsa_sig ( & self , p : & Pk ) -> Option < bitcoin:: EcdsaSig > {
168
211
( * * self ) . lookup_ecdsa_sig ( p)
169
212
}
170
213
214
+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
215
+ ( * * self ) . lookup_schnorr_sig ( p)
216
+ }
217
+
171
218
fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
172
219
( * * self ) . lookup_pkh_pk ( pkh)
173
220
}
@@ -179,6 +226,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
179
226
( * * self ) . lookup_pkh_ecdsa_sig ( pkh)
180
227
}
181
228
229
+ fn lookup_pkh_schnorr_sig (
230
+ & self ,
231
+ pkh : & Pk :: Hash ,
232
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
233
+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
234
+ }
235
+
182
236
fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
183
237
( * * self ) . lookup_sha256 ( h)
184
238
}
@@ -209,6 +263,10 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
209
263
( * * self ) . lookup_ecdsa_sig ( p)
210
264
}
211
265
266
+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
267
+ ( * * self ) . lookup_schnorr_sig ( p)
268
+ }
269
+
212
270
fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
213
271
( * * self ) . lookup_pkh_pk ( pkh)
214
272
}
@@ -220,6 +278,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
220
278
( * * self ) . lookup_pkh_ecdsa_sig ( pkh)
221
279
}
222
280
281
+ fn lookup_pkh_schnorr_sig (
282
+ & self ,
283
+ pkh : & Pk :: Hash ,
284
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
285
+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
286
+ }
287
+
223
288
fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
224
289
( * * self ) . lookup_sha256 ( h)
225
290
}
@@ -263,6 +328,16 @@ macro_rules! impl_tuple_satisfier {
263
328
None
264
329
}
265
330
331
+ fn lookup_schnorr_sig( & self , key: & Pk ) -> Option <bitcoin:: SchnorrSig > {
332
+ let & ( $( ref $ty, ) * ) = self ;
333
+ $(
334
+ if let Some ( result) = $ty. lookup_schnorr_sig( key) {
335
+ return Some ( result) ;
336
+ }
337
+ ) *
338
+ None
339
+ }
340
+
266
341
fn lookup_pkh_ecdsa_sig(
267
342
& self ,
268
343
key_hash: & Pk :: Hash ,
@@ -276,6 +351,19 @@ macro_rules! impl_tuple_satisfier {
276
351
None
277
352
}
278
353
354
+ fn lookup_pkh_schnorr_sig(
355
+ & self ,
356
+ key_hash: & Pk :: Hash ,
357
+ ) -> Option <( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
358
+ let & ( $( ref $ty, ) * ) = self ;
359
+ $(
360
+ if let Some ( result) = $ty. lookup_pkh_schnorr_sig( key_hash) {
361
+ return Some ( result) ;
362
+ }
363
+ ) *
364
+ None
365
+ }
366
+
279
367
fn lookup_pkh_pk(
280
368
& self ,
281
369
key_hash: & Pk :: Hash ,
0 commit comments