The BIP-379 currently has a TBD in the test vector section.
I have extracted a bunch of test vectors from the rust-miniscript project, either directly or by slightly modifying test code to dump them into text/TSV files.
They have been very helpful for re-implementation in another language, so I think they should be made easily available here.
BIP-379: add test vectors from rust-miniscript #2240
pull guggero wants to merge 1 commits into bitcoin:master from guggero:bip379-test-vectors changing 16 files +76076 −1-
guggero commented at 9:11 AM on August 6, 2026: contributor
- jonatack added the label Proposed BIP modification on Aug 6, 2026
- jonatack added the label Pending acceptance on Aug 6, 2026
-
jonatack commented at 6:29 AM on August 7, 2026: member
Concept ACK. It may be handy to provide a file here that runs/verifies the test vectors.
-
bip379: add test vectors from rust-miniscript 9334aa2168
- guggero force-pushed on Aug 7, 2026
-
guggero commented at 8:58 AM on August 7, 2026: contributor
Concept ACK. It may be handy to provide a file here that runs/verifies the test vectors.
That's a great idea. I've added that in the latest push. Output looks like this:
$ cd bip-0379; go run main.go Checking the BIP379 test vectors in . against github.com/btcsuite/btcd/descriptors/miniscript. Testing vectors in valid_from_alloy.txt [positive]: 5896/5896 done (type column not compared) Testing vectors in valid_8f1e8_from_alloy.txt [positive]: 3492/3492 done (type column not compared) Testing vectors in malleable_from_alloy.txt [positive/negative]: 7024/7024 + 7024/7024 done Testing vectors in conflict_from_alloy.txt [positive]: 1773/1773 done (1586 of them are rejected by the sanity checks) Testing vectors in edge_cases.txt [positive]: 42/42 done Testing vectors in opcodes.txt [positive]: 18185/18185 done (type and op count columns not compared) Testing vectors in invalid.txt [negative]: 5574/5574 done Testing vectors in props_from_rust.tsv [positive]: 8198/8198 done (op_count and exec_stack columns not compared) Testing vectors in props_from_rust_tap.tsv [positive/negative]: 6728/6728 + 1470/1470 done (op_count and exec_stack columns not compared) Testing vectors in scripts_from_rust.tsv [positive]: 8198/8198 done Testing vectors in scripts_from_rust_tap.tsv [positive/negative]: 6728/6728 + 1470/1470 done Testing vectors in redeem.json [positive/negative]: 12/12 + 34/34 done (each spend is executed in the script engine) All 81848 vectors passed (0 skipped). -
murchandamus commented at 10:25 PM on August 17, 2026: member
cc Authors: @sipa, @apoelstra, @sanket1729, @darosior, @achow101
-
sipa commented at 8:16 PM on August 19, 2026: member
I tried to run these tests through the Bitcoin Core miniscript implementation, but quickly hit the problem that the typing rules are inplemented inconsistently. This isn't a problem in production, because the differences are all within expressions that are invalid (for the correctness-related typing rules) or malleable (for the malleability-related typing rules) anyway, but it does mean that exact type tests like the ones in
malleable_from_alloy.txtenforce than strictly needed.In fact, rust-miniscript, Bitcoin Core, and the BIP text are all inconsistent with each other, in minor irrelevant ways. If we want to go the direction of having strict test vectors (which I support), I think we also need to first align all implementations and specifications. My suggestion would be to make everything match the BIP text. I have an (LLM written) patch for Bitcoin Core to make it do that (which passes all its unit & fuzz tests) which I'm happy to PR, but someone else will need to do the same for rust-bitcoin. It differs from the BIP in one rule: the
threshrule for the "unique dissatisfiable"erule in the BIP is that all children ares, while rust-miniscript (and Bitcoin Core, so far) additionally (and superfluously) require that all children aree. -
jonatack commented at 8:57 PM on August 19, 2026: member
My suggestion would be to make everything match the BIP text.
(non-author) approach ACK