"The PSBT_OUT_SP_V0_INFO should be serialized as a zero byte for the
version, followed by the 33 bytes of the scan key and then 33 bytes for
the spend key" names the field, and the field is 66 bytes: its table
entry is "<33 byte scan key> <33 byte spend key>", the test vectors carry
66, and the validator refuses anything else.
The sentence is in the Unique Identification section and was added with
it, so what it describes is the output script that stands in for a silent
payment output when building the unsigned transaction that identifies the
psbt -- 67 bytes there, and nothing about the field. Read as the field's
own serialization it contradicts the table, which is how it first read
here.
Only the wording changes.
All vectors were tested against libsecp256k1, and
all verification vectors were checked against OpenSSL.
A check was also added to the `verify` specification
to reject pubkeys with x or y coordinates greater than
or equal to `p`.
Add a vendored copy of the secp256k1lab library (master branch, commit
a265da139aea27386085a2a8760f8698e1bda64e) that the full-aggregation
reference implementation and test vector scripts depend on.
Add a BIP-352 test vector where a taproot input is spent via the key path with an annex (2-item witness). The annex must be stripped before deciding between key-path and script-path spends, so the input is still eligible and all expected values match the plain key-path case.
The annex is 0x50 followed by the BIP341 NUMS point H, so an implementation that fails to strip it reads it as a control block with the NUMS internal key and wrongly skips the input.
* bip139: wallet metadata format
* bip139: add the Version header to the preamble
* bip139: keep a single psbts field and fix the spend status link
* bip139: fold the version section and bip field into the version value
* bip139: capitalize Bitcoin Core and clarify the change_descriptor note
* bip139: replace the three account birth time fields with birth_block
* bip139: drop descriptor_id and change_descriptor_id
* bip139: drop field aliases, keeping name and labels
* bip139: restrict descriptor and change_descriptor to a string
* bip139: make version, type, descriptor, key, txid, outpoint and tweak mandatory
* bip139: move field definitions to a companion registry
* bip139: add the wallet survey behind these decisions
* bip139: replace the wallet description field with a backup note
* bip139: add the backup date field
* bip139: add the account gap_limit field
* bip139: add the multi_bip380 account type
* bip139: give the bip352_labels range an explicit encoding
* bip139: add a general coin object
* bip139: move signers above the account
* bip139: add signer modality and device records
* bip139: add bip85 application and index
* bip139: add Bitkey to the wallet survey
* bip139: state how to derive birth_block from a creation date
* bip139: define the timestamp format once
* bip139: rename the transaction time field to block_time
* bip139: keep last_height on the account only
* bip139: state that type names the descriptor language
* bip139: drop output_type, the descriptor already states it
* bip139: replace the account active flag with a status enum
* bip139: add mutinynet and scope a backup to one network
* bip139: record that the label gap belongs to BIP-329
* bip139: record that proprietary needs no change
* bip139: make the survey annex-ready
* bip139: record that mainnet mnemonics stay out of scope
* bip139: reword the mnemonic evidence heading
* bip139: correct the birth_block evidence, Sparrow stores a height
* bip139: type and descriptor fit every surveyed wallet
* bip139: correct the addr descriptor solvability note
* bip139: re-assess every partial score against fillability
* bip139: store psbts once at wallet level, reference them per account
* bip139: store transactions once at wallet level, reference them per account
* bip139: txid is the transaction map key, not a field
* bip139: refresh the matrix after the fillability re-assessment
* bip139: electrum holds no bip39 mnemonic at all
* bip139: sp_output.label has no constituency
* bip139: collapse the survey to a two-value scale
* bip139: drop the obsolete partial-score analysis
* bip139: size the matrix field column from the data
* bip139: cut the survey down to the table and its results
* bip139: recompute liana compat against the current draft
* bip139: correct the liana breaking-change count
* bip139: make network mandatory
* bip139: network no longer breaks liana on import
* bip139: render wallet fields as a wrapped table
* bip139: render account fields as a wrapped table
* bip139: render every field section as a wrapped table
* bip139: the registry is part of the bip, not a reference to it
* bip139: drop the registration process from the registry intro
* bip139: put field rationale in the cell, not below the table
* bip139: keep code spans whole when wrapping cells
* bip139: render field tables as preformatted blocks
* bip139: drop link definitions the tables no longer use
* bip139: use a bordered grid for the field tables
* bip139: give birth_block an estimation formula and drop the enum underscore
* bip139: merge silent payment outputs into the coin object
* bip139: restore spend_status and give the sp label scalar a home
* bip139: register the transaction fee field
* bip139: rebuild the survey matrix against the current field set
* bip139: drop survey findings the draft now addresses
* bip139: bar passphrase-protected seeds from bip39_mnemonic
* bip139: record the missing-field decisions in the survey
* bip139: cut the survey down to its revision list and matrix
* bip139: reword the survey as a wallet to field mapping
* bip139: reference the wallet support annex from the spec
* bip139: list the mandatory fields in the registry tables
* bip139: point the spec at the registry as the complete field list
* bip139: spell out mandatory and optional in the registry req column
* bip139: mark only the optional fields in the registry tables
* bip139: retitle and reframe the BIP around moving between wallets
* bip139: call the artefact an export throughout
* bip139: scope the mnemonic advice to exports kept as backups
* bip139: say that most metadata cannot be recovered from the chain
* bip139: clarify account and signer metadata fields
* bip139: cut the registry cells back to the field description
* bip139: reword the registry field descriptions
* bip139: give the device record its own registry table
* bip139: keep an unknown enum value from failing the import
* bip139: define the device transports field
* bip139: point the devices row at the device object
* bip139: backup -> export in README
* bip139: clarify export fields and remove survey annex
* bip139: Drop Version header in absence of Changelog
The upgradeable rules list the to_sign version, NOPs reserved for
upgrades and segwit versions above 1. BIP341 and BIP342 also reserve
unknown leaf versions, OP_SUCCESSx, unknown public key types and the
annex for upgrades. A verifier that follows the BIP322 text calls a
signature using any of them valid. Name them, so that these give the
inconclusive state like the other upgrade mechanisms.
Bump the version to 2.1.0 and add a changelog entry.
Add 342 to Requires.
Add a vendored copy of the secp256k1lab library (master branch, commit
a265da139aea27386085a2a8760f8698e1bda64e) that the half-aggregation
reference implementation and test vector scripts depend on.
Since 977300d timestamps.json is a single JSON object whose children are
nested recursively in extensions arrays, with valid and comment only on the
leaves, but the README still described a flat array of objects with a
header_chain entry.
The example says the skipped hashes are 0x00..., 0x66... and 0x22...,
and traversal-example.dot has 0x22... as the SKIP branch of D, but the
base64 proof ended with 32 bytes of 0x44, which is one of the VERIFY
hashes. Re-encode the proof with 0x22... as the last hash. The length
(101 bytes) and the tree serialization are unchanged.