@@ -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
@@ -59,6 +64,17 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
59
64
None
60
65
}
61
66
67
+ /// Given a keyhash, look up the schnorr signature and the associated key
68
+ /// Even if signatures for public key Hashes are not available, the users
69
+ /// can use this map to provide pkh -> pk mapping which can be useful
70
+ /// for dissatisfying pkh.
71
+ fn lookup_pkh_schnorr_sig (
72
+ & self ,
73
+ _: & Pk :: Hash ,
74
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
75
+ None
76
+ }
77
+
62
78
/// Given a SHA256 hash, look up its preimage
63
79
fn lookup_sha256 ( & self , _: sha256:: Hash ) -> Option < Preimage32 > {
64
80
None
@@ -139,6 +155,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::Ecd
139
155
}
140
156
}
141
157
158
+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk , bitcoin:: SchnorrSig > {
159
+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
160
+ self . get ( key) . map ( |x| * x)
161
+ }
162
+ }
163
+
142
164
impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: EcdsaSig ) >
143
165
where
144
166
Pk : MiniscriptKey + ToPublicKey ,
@@ -160,11 +182,36 @@ where
160
182
}
161
183
}
162
184
185
+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: SchnorrSig ) >
186
+ where
187
+ Pk : MiniscriptKey + ToPublicKey ,
188
+ {
189
+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
190
+ self . get ( & key. to_pubkeyhash ( ) ) . map ( |x| x. 1 )
191
+ }
192
+
193
+ fn lookup_pkh_pk ( & self , pk_hash : & Pk :: Hash ) -> Option < Pk > {
194
+ self . get ( pk_hash) . map ( |x| x. 0 . clone ( ) )
195
+ }
196
+
197
+ fn lookup_pkh_schnorr_sig (
198
+ & self ,
199
+ pk_hash : & Pk :: Hash ,
200
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
201
+ self . get ( pk_hash)
202
+ . map ( |& ( ref pk, sig) | ( pk. to_public_key ( ) , sig) )
203
+ }
204
+ }
205
+
163
206
impl < ' a , Pk : MiniscriptKey + ToPublicKey , S : Satisfier < Pk > > Satisfier < Pk > for & ' a S {
164
207
fn lookup_ec_sig ( & self , p : & Pk ) -> Option < bitcoin:: EcdsaSig > {
165
208
( * * self ) . lookup_ec_sig ( p)
166
209
}
167
210
211
+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
212
+ ( * * self ) . lookup_schnorr_sig ( p)
213
+ }
214
+
168
215
fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
169
216
( * * self ) . lookup_pkh_pk ( pkh)
170
217
}
@@ -173,6 +220,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
173
220
( * * self ) . lookup_pkh_ec_sig ( pkh)
174
221
}
175
222
223
+ fn lookup_pkh_schnorr_sig (
224
+ & self ,
225
+ pkh : & Pk :: Hash ,
226
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
227
+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
228
+ }
229
+
176
230
fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
177
231
( * * self ) . lookup_sha256 ( h)
178
232
}
@@ -203,6 +257,10 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
203
257
( * * self ) . lookup_ec_sig ( p)
204
258
}
205
259
260
+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
261
+ ( * * self ) . lookup_schnorr_sig ( p)
262
+ }
263
+
206
264
fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
207
265
( * * self ) . lookup_pkh_pk ( pkh)
208
266
}
@@ -211,6 +269,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
211
269
( * * self ) . lookup_pkh_ec_sig ( pkh)
212
270
}
213
271
272
+ fn lookup_pkh_schnorr_sig (
273
+ & self ,
274
+ pkh : & Pk :: Hash ,
275
+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
276
+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
277
+ }
278
+
214
279
fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
215
280
( * * self ) . lookup_sha256 ( h)
216
281
}
@@ -254,6 +319,16 @@ macro_rules! impl_tuple_satisfier {
254
319
None
255
320
}
256
321
322
+ fn lookup_schnorr_sig( & self , key: & Pk ) -> Option <bitcoin:: SchnorrSig > {
323
+ let & ( $( ref $ty, ) * ) = self ;
324
+ $(
325
+ if let Some ( result) = $ty. lookup_schnorr_sig( key) {
326
+ return Some ( result) ;
327
+ }
328
+ ) *
329
+ None
330
+ }
331
+
257
332
fn lookup_pkh_ec_sig(
258
333
& self ,
259
334
key_hash: & Pk :: Hash ,
@@ -267,6 +342,19 @@ macro_rules! impl_tuple_satisfier {
267
342
None
268
343
}
269
344
345
+ fn lookup_pkh_schnorr_sig(
346
+ & self ,
347
+ key_hash: & Pk :: Hash ,
348
+ ) -> Option <( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
349
+ let & ( $( ref $ty, ) * ) = self ;
350
+ $(
351
+ if let Some ( result) = $ty. lookup_pkh_schnorr_sig( key_hash) {
352
+ return Some ( result) ;
353
+ }
354
+ ) *
355
+ None
356
+ }
357
+
270
358
fn lookup_pkh_pk(
271
359
& self ,
272
360
key_hash: & Pk :: Hash ,
0 commit comments