|
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