|
56 | 56 | f"tr(4d54bb9928a0683b7e383de72943b214b0716f58aa54c7ba6bcea2328bc9c768,{{{{{P2WSH_MINISCRIPTS[0]},{P2WSH_MINISCRIPTS[1]}}},{{{P2WSH_MINISCRIPTS[2].replace('multi', 'multi_a')},{P2WSH_MINISCRIPTS[3]}}}}})", |
57 | 57 | ] |
58 | 58 |
|
59 | | -MINISCRIPTS_PRIV = [ |
| 59 | +DESCS_PRIV = [ |
60 | 60 | # One of two keys, of which one private key is known |
61 | 61 | { |
62 | | - "ms": f"or_i(pk({TPRVS[0]}/*),pk({TPUBS[0]}/*))", |
| 62 | + "desc": f"wsh(or_i(pk({TPRVS[0]}/*),pk({TPUBS[0]}/*)))", |
63 | 63 | "sequence": None, |
64 | 64 | "locktime": None, |
65 | 65 | "sigs_count": 1, |
66 | 66 | "stack_size": 3, |
67 | 67 | }, |
68 | 68 | # A more complex policy, that can't be satisfied through the first branch (need for a preimage) |
69 | 69 | { |
70 | | - "ms": f"andor(ndv:older(2),and_v(v:pk({TPRVS[0]}),sha256(2a8ce30189b2ec3200b47aeb4feaac8fcad7c0ba170389729f4898b0b7933bcb)),and_v(v:pkh({TPRVS[1]}),pk({TPRVS[2]}/*)))", |
| 70 | + "desc": f"wsh(andor(ndv:older(2),and_v(v:pk({TPRVS[0]}),sha256(2a8ce30189b2ec3200b47aeb4feaac8fcad7c0ba170389729f4898b0b7933bcb)),and_v(v:pkh({TPRVS[1]}),pk({TPRVS[2]}/*))))", |
71 | 71 | "sequence": 2, |
72 | 72 | "locktime": None, |
73 | 73 | "sigs_count": 3, |
74 | 74 | "stack_size": 5, |
75 | 75 | }, |
76 | 76 | # The same policy but we provide the preimage. This path will be chosen as it's a smaller witness. |
77 | 77 | { |
78 | | - "ms": f"andor(ndv:older(2),and_v(v:pk({TPRVS[0]}),sha256(61e33e9dbfefc45f6a194187684d278f789fd4d5e207a357e79971b6519a8b12)),and_v(v:pkh({TPRVS[1]}),pk({TPRVS[2]}/*)))", |
| 78 | + "desc": f"wsh(andor(ndv:older(2),and_v(v:pk({TPRVS[0]}),sha256(61e33e9dbfefc45f6a194187684d278f789fd4d5e207a357e79971b6519a8b12)),and_v(v:pkh({TPRVS[1]}),pk({TPRVS[2]}/*))))", |
79 | 79 | "sequence": 2, |
80 | 80 | "locktime": None, |
81 | 81 | "sigs_count": 3, |
|
86 | 86 | }, |
87 | 87 | # Signature with a relative timelock |
88 | 88 | { |
89 | | - "ms": f"and_v(v:older(2),pk({TPRVS[0]}/*))", |
| 89 | + "desc": f"wsh(and_v(v:older(2),pk({TPRVS[0]}/*)))", |
90 | 90 | "sequence": 2, |
91 | 91 | "locktime": None, |
92 | 92 | "sigs_count": 1, |
93 | 93 | "stack_size": 2, |
94 | 94 | }, |
95 | 95 | # Signature with an absolute timelock |
96 | 96 | { |
97 | | - "ms": f"and_v(v:after(20),pk({TPRVS[0]}/*))", |
| 97 | + "desc": f"wsh(and_v(v:after(20),pk({TPRVS[0]}/*)))", |
98 | 98 | "sequence": None, |
99 | 99 | "locktime": 20, |
100 | 100 | "sigs_count": 1, |
101 | 101 | "stack_size": 2, |
102 | 102 | }, |
103 | 103 | # Signature with both |
104 | 104 | { |
105 | | - "ms": f"and_v(v:older(4),and_v(v:after(30),pk({TPRVS[0]}/*)))", |
| 105 | + "desc": f"wsh(and_v(v:older(4),and_v(v:after(30),pk({TPRVS[0]}/*))))", |
106 | 106 | "sequence": 4, |
107 | 107 | "locktime": 30, |
108 | 108 | "sigs_count": 1, |
109 | 109 | "stack_size": 2, |
110 | 110 | }, |
111 | 111 | # We have one key on each branch; Core signs both (can't finalize) |
112 | 112 | { |
113 | | - "ms": f"c:andor(pk({TPRVS[0]}/*),pk_k({TPUBS[0]}),and_v(v:pk({TPRVS[1]}),pk_k({TPUBS[1]})))", |
| 113 | + "desc": f"wsh(c:andor(pk({TPRVS[0]}/*),pk_k({TPUBS[0]}),and_v(v:pk({TPRVS[1]}),pk_k({TPUBS[1]}))))", |
114 | 114 | "sequence": None, |
115 | 115 | "locktime": None, |
116 | 116 | "sigs_count": 2, |
117 | 117 | "stack_size": None, |
118 | 118 | }, |
119 | 119 | # We have all the keys, wallet selects the timeout path to sign since it's smaller and sequence is set |
120 | 120 | { |
121 | | - "ms": f"andor(pk({TPRVS[0]}/*),pk({TPRVS[2]}),and_v(v:pk({TPRVS[1]}),older(10)))", |
| 121 | + "desc": f"wsh(andor(pk({TPRVS[0]}/*),pk({TPRVS[2]}),and_v(v:pk({TPRVS[1]}),older(10))))", |
122 | 122 | "sequence": 10, |
123 | 123 | "locktime": None, |
124 | 124 | "sigs_count": 3, |
125 | 125 | "stack_size": 3, |
126 | 126 | }, |
127 | 127 | # We have all the keys, wallet selects the primary path to sign unconditionally since nsequence wasn't set to be valid for timeout path |
128 | 128 | { |
129 | | - "ms": f"andor(pk({TPRVS[0]}/*),pk({TPRVS[2]}),and_v(v:pkh({TPRVS[1]}),older(10)))", |
| 129 | + "desc": f"wsh(andor(pk({TPRVS[0]}/*),pk({TPRVS[2]}),and_v(v:pkh({TPRVS[1]}),older(10))))", |
130 | 130 | "sequence": None, |
131 | 131 | "locktime": None, |
132 | 132 | "sigs_count": 3, |
133 | 133 | "stack_size": 3, |
134 | 134 | }, |
135 | 135 | # Finalizes to the smallest valid witness, regardless of sequence |
136 | 136 | { |
137 | | - "ms": f"or_d(pk({TPRVS[0]}/*),and_v(v:pk({TPRVS[1]}),and_v(v:pk({TPRVS[2]}),older(10))))", |
| 137 | + "desc": f"wsh(or_d(pk({TPRVS[0]}/*),and_v(v:pk({TPRVS[1]}),and_v(v:pk({TPRVS[2]}),older(10)))))", |
138 | 138 | "sequence": 12, |
139 | 139 | "locktime": None, |
140 | 140 | "sigs_count": 3, |
141 | 141 | "stack_size": 2, |
142 | 142 | }, |
143 | 143 | # Liquid-like federated pegin with emergency recovery privkeys |
144 | 144 | { |
145 | | - "ms": f"or_i(and_b(pk({TPUBS[0]}/*),a:and_b(pk({TPUBS[1]}),a:and_b(pk({TPUBS[2]}),a:and_b(pk({TPUBS[3]}),s:pk({PUBKEYS[0]}))))),and_v(v:thresh(2,pkh({TPRVS[0]}),a:pkh({TPRVS[1]}),a:pkh({TPUBS[4]})),older(42)))", |
| 145 | + "desc": f"wsh(or_i(and_b(pk({TPUBS[0]}/*),a:and_b(pk({TPUBS[1]}),a:and_b(pk({TPUBS[2]}),a:and_b(pk({TPUBS[3]}),s:pk({PUBKEYS[0]}))))),and_v(v:thresh(2,pkh({TPRVS[0]}),a:pkh({TPRVS[1]}),a:pkh({TPUBS[4]})),older(42))))", |
146 | 146 | "sequence": 42, |
147 | 147 | "locktime": None, |
148 | 148 | "sigs_count": 2, |
@@ -198,10 +198,10 @@ def watchonly_test(self, desc): |
198 | 198 | assert utxo["txid"] == txid and utxo["solvable"] |
199 | 199 |
|
200 | 200 | def signing_test( |
201 | | - self, ms, sequence, locktime, sigs_count, stack_size, sha256_preimages |
| 201 | + self, desc, sequence, locktime, sigs_count, stack_size, sha256_preimages |
202 | 202 | ): |
203 | | - self.log.info(f"Importing private Miniscript '{ms}'") |
204 | | - desc = descsum_create(f"wsh({ms})") |
| 203 | + self.log.info(f"Importing private Miniscript descriptor '{desc}'") |
| 204 | + desc = descsum_create(desc) |
205 | 205 | res = self.ms_sig_wallet.importdescriptors( |
206 | 206 | [ |
207 | 207 | { |
@@ -309,14 +309,14 @@ def run_test(self): |
309 | 309 | self.watchonly_test(desc) |
310 | 310 |
|
311 | 311 | # Test we can sign for any Miniscript. |
312 | | - for ms in MINISCRIPTS_PRIV: |
| 312 | + for desc in DESCS_PRIV: |
313 | 313 | self.signing_test( |
314 | | - ms["ms"], |
315 | | - ms["sequence"], |
316 | | - ms["locktime"], |
317 | | - ms["sigs_count"], |
318 | | - ms["stack_size"], |
319 | | - ms.get("sha256_preimages"), |
| 314 | + desc["desc"], |
| 315 | + desc["sequence"], |
| 316 | + desc["locktime"], |
| 317 | + desc["sigs_count"], |
| 318 | + desc["stack_size"], |
| 319 | + desc.get("sha256_preimages"), |
320 | 320 | ) |
321 | 321 |
|
322 | 322 |
|
|
0 commit comments