|
5 | 5 | """Test Miniscript descriptors integration in the wallet."""
|
6 | 6 |
|
7 | 7 | from test_framework.descriptors import descsum_create
|
| 8 | +from test_framework.psbt import PSBT, PSBT_IN_SHA256 |
8 | 9 | from test_framework.test_framework import BitcoinTestFramework
|
9 | 10 | from test_framework.util import assert_equal
|
10 | 11 |
|
|
60 | 61 | "sigs_count": 3,
|
61 | 62 | "stack_size": 5,
|
62 | 63 | },
|
| 64 | + # The same policy but we provide the preimage. This path will be chosen as it's a smaller witness. |
| 65 | + { |
| 66 | + "ms": f"andor(ndv:older(2),and_v(v:pk({TPRVS[0]}),sha256(61e33e9dbfefc45f6a194187684d278f789fd4d5e207a357e79971b6519a8b12)),and_v(v:pkh({TPRVS[1]}),pk({TPRVS[2]}/*)))", |
| 67 | + "sequence": 2, |
| 68 | + "locktime": None, |
| 69 | + "sigs_count": 3, |
| 70 | + "stack_size": 4, |
| 71 | + "sha256_preimages": { |
| 72 | + "61e33e9dbfefc45f6a194187684d278f789fd4d5e207a357e79971b6519a8b12": "e8774f330f5f330c23e8bbefc5595cb87009ddb7ac3b8deaaa8e9e41702d919c" |
| 73 | + }, |
| 74 | + }, |
63 | 75 | # Signature with a relative timelock
|
64 | 76 | {
|
65 | 77 | "ms": f"and_v(v:older(2),pk({TPRVS[0]}/*))",
|
@@ -167,7 +179,9 @@ def watchonly_test(self, ms):
|
167 | 179 | utxo = self.ms_wo_wallet.listunspent(minconf=0, addresses=[addr])[0]
|
168 | 180 | assert utxo["txid"] == txid and utxo["solvable"]
|
169 | 181 |
|
170 |
| - def signing_test(self, ms, sequence, locktime, sigs_count, stack_size): |
| 182 | + def signing_test( |
| 183 | + self, ms, sequence, locktime, sigs_count, stack_size, sha256_preimages |
| 184 | + ): |
171 | 185 | self.log.info(f"Importing private Miniscript '{ms}'")
|
172 | 186 | desc = descsum_create(f"wsh({ms})")
|
173 | 187 | res = self.ms_sig_wallet.importdescriptors(
|
@@ -208,6 +222,12 @@ def signing_test(self, ms, sequence, locktime, sigs_count, stack_size):
|
208 | 222 | )
|
209 | 223 |
|
210 | 224 | self.log.info("Signing it and checking the satisfaction.")
|
| 225 | + if sha256_preimages is not None: |
| 226 | + psbt = PSBT.from_base64(psbt) |
| 227 | + for (h, preimage) in sha256_preimages.items(): |
| 228 | + k = PSBT_IN_SHA256.to_bytes(1, "big") + bytes.fromhex(h) |
| 229 | + psbt.i[0].map[k] = bytes.fromhex(preimage) |
| 230 | + psbt = psbt.to_base64() |
211 | 231 | res = self.ms_sig_wallet.walletprocesspsbt(psbt=psbt, finalize=False)
|
212 | 232 | psbtin = self.nodes[0].rpc.decodepsbt(res["psbt"])["inputs"][0]
|
213 | 233 | assert len(psbtin["partial_signatures"]) == sigs_count
|
@@ -258,14 +278,15 @@ def run_test(self):
|
258 | 278 | for ms in MINISCRIPTS:
|
259 | 279 | self.watchonly_test(ms)
|
260 | 280 |
|
261 |
| - # Test we can sign most Miniscript (all but ones requiring preimages, for now) |
| 281 | + # Test we can sign for any Miniscript. |
262 | 282 | for ms in MINISCRIPTS_PRIV:
|
263 | 283 | self.signing_test(
|
264 | 284 | ms["ms"],
|
265 | 285 | ms["sequence"],
|
266 | 286 | ms["locktime"],
|
267 | 287 | ms["sigs_count"],
|
268 | 288 | ms["stack_size"],
|
| 289 | + ms.get("sha256_preimages"), |
269 | 290 | )
|
270 | 291 |
|
271 | 292 |
|
|
0 commit comments