The vector files
Each file has the same header:
| Field | Meaning |
|---|---|
format, version |
signer-profile-vectors, 1. |
profile |
The profile version the file was written against. |
requirements |
The requirement ids the file covers. |
operations |
The adapter functions it calls. |
description |
What the file checks, in a sentence or two. |
contexts |
Wallets referred to by cases, where needed. |
cases |
The cases. |
Each case has an id, an operation, the requirements it checks, a level,
a description, an input and an expected value, and sources, which says
where each expected value came from. Review cases also carry bitcoinCore: what
Bitcoin Core said about the same PSBT (its computed fee, its sighash names, the
error it gave, its mempool's replaceability verdict), recorded for a reader to
compare, not used by the runner.
Amounts are decimal strings of satoshis. PSBTs are base64. Keys, values and digests are lowercase hex. Text is UTF-8.
Where the expected values come from
No expected value was produced by running nullroute. Each comes from a source that shares no code with it.
| File | Cases | Requirements | Source of the expected values |
|---|---|---|---|
dice-to-entropy.json |
17 | SP-ENT-1 to 4, 7, 10, SP-HW-9 | Digest from printf '%s' ROLLS | shasum -a 256 and sha256sum. Mnemonic from the BIP-39 algorithm and the English list in bitcoin/bips, written for the generator and checked against the 24 Trezor vectors first. Seed from PBKDF2-HMAC-SHA512 as BIP-39 defines it. Refusals from the requirement text. |
dice-accounting.json |
25 | SP-ENT-5 | The largest k with 2^k <= 6^n, by exact integer comparison. |
review-fee-and-amounts.json |
7 | SP-REV-2, 4, 13 | PSBTs built by Bitcoin Core 31.1 on regtest. Fee from decodepsbt. Change from the path getaddressinfo reports. Addresses from the scriptPubKey with the BIP-173/350 reference encoder. A negative fee rejected by testmempoolaccept. |
review-input-amounts.json |
7 | SP-REV-3 | Core PSBTs with UTXO records removed or altered. Verdicts from the requirement text, BIP-174 and BIP-341. Core's decodepsbt error for the mismatched TXID is recorded. |
review-change.json |
9 | SP-REV-6, 7, 14 | Core PSBTs. Change and path from getaddressinfo. The wallet key is the published BIP-84 and BIP-86 test key; the generator stops unless Core derives the addresses those BIPs print. Derivation claims use the public keys those BIPs print. |
review-sighash.json |
13 | SP-REV-8, 23 | Core PSBTs with PSBT_IN_SIGHASH_TYPE set. Meaning from BIP-143 and BIP-341; Core's names recorded. |
review-timelocks.json |
9 | SP-REV-9 | Core PSBTs. Height or time from LOCKTIME_THRESHOLD in Bitcoin Core's source. Not enforced from IsFinalTx in Core's source, and from Core accepting that transaction into its mempool far below its locktime. Replaceability from BIP-125, and from Core's own mempool (getmempoolentry) for every case it could broadcast. |
review-unknown-fields.json |
2 | SP-REV-11 | A Core PSBT with pairs added. Core's decodepsbt lists them as unknown or proprietary. Preservation from BIP-174. |
sign-override.json |
3 | SP-REV-22 | Core PSBTs blocked by SIGHASH_NONE, by an unconfirmed segwit v0 amount, and by owning no input. Each is signed without an override, with one, and without one again; the expected verdicts are the requirement text. |
review-ownership.json |
5 | SP-REV-24, 25 | Core PSBTs from a second wallet (the BIP-32 test vector 1 key), with derivation records naming the signer's fingerprint. Verdicts from the requirement text. |
manifest-root.json |
2 | SP-ATT-2 | LC_ALL=C sort -z | xargs -0 sha256sum over the files, and sha256sum of the result. The forbidden roots are from LC_ALL=en_US.UTF-8 sort and from ICU's en-US collation. |
bbqr-psbt.json |
12 | SP-TX-2 to 6 | Frames from Coinkite's reference splitter (coinkite/BBQr, python/bbqr), and a real Coldcard camera scan from that repository's test data. Decoded payloads cross-checked with Python's base32 and zlib. |
ur-psbt.json |
5 | SP-TX-7 | Frames written by SeedSigner's own UR encoder (SeedSigner/seedsigner, src/seedsigner/helpers/ur2) around PSBT bodies from selfcustody/urtypes, and read back by SeedSigner's own decoder. Optional: only for a signer that implements UR. |
Every external document was fetched at a pinned commit: bitcoin/bips at
7c7cb232, coinkite/BBQr at 8dc7ef07, sipa/bech32 at 7a7d7ab1,
SeedSigner/seedsigner at 088b144e, and selfcustody/urtypes at 7fb280ea.
Levels
A case's level is MUST or SHOULD. Some MUST cases also carry a SHOULD part,
written as { "should": ... } in expected (a high fee SHOULD warn; an output
the transaction falsely claimed SHOULD be reported as claimed). A missed SHOULD
is printed as an advisory and never fails a run.
Rendered from conformance/README.md, the same bytes that ship with the code. SHA-256 d0c681a5e7b7f55bcc96ecd33bb0ab07dd944b4fe2bb50f640ee79a85db3917e