1
0
mirror of https://github.com/bitcoin/bips.git synced 2025-12-22 14:45:19 +00:00
bips/bip-0054/test_vectors

BIP54 test vectors

This folder contains a set of test vectors for each mitigation introduced in the BIP. This document presents them in more detail.

The code used to generate half of the test vectors is included with the implementation and available here. The other half requires mining mainnet blocks and is published separately. In both cases it is implemented as a regular Bitcoin Core unit test, and the test vectors are persisted as a JSON file if the UPDATE_JSON_TESTS preprocessor directive is set (off by default).

To compile the header and block miners you may have to link to libatomic explicitly. This can be achieved like so:

cmake -B atomicbuild -DAPPEND_LDFLAGS="-latomic"
cmake --build atomicbuild/ -j $(nproc)

Premined headers are also provided along with the header miner to allow changing some of the last headers without having to re-generate the whole chain.

Difficulty adjustment exploits

The timestamps.json test vectors exercise the two constraints on block header timestamps introduced by BIP54 to mitigate the Timewarp and Murch-Zawy attacks. Each test case features a chain of mainnet headers starting from the genesis block, and whether this header chain is valid by BIP54 rules. Each test case also contains a comment describing why this particular chain is (in)valid according to BIP54. All test cases are valid according to current Bitcoin consensus rules. It is intended to be used to test a BIP54 implementation by feeding the header chain to a Bitcoin node implementation, enforcing the BIP54 rules on this chain from genesis.

The test vector file features a JSON array of JSON objects, each corresponding to a test case. Each JSON object features the following entries:

  • header_chain: a JSON array of strings. An ordered list of hex-encoded mainnet block headers.
  • valid: a JSON boolean. Whether this chain of headers is valid according to BIP54.
  • comment: a JSON string. Description of the test case.

For the purpose of testing a Timewarp fix, a Timewarp attack was included early on in the history of testnet3. An implementer of BIP54 may want to ensure that syncing testnet3 by enforcing BIP54 since genesis will treat block 00000000118da1e2165a19307b86f87eba814845e8a0f99734dce279ca3fb029 as invalid.

Long block validation time

The sigops.json file contains test vectors for the limit on the number of potentially-executed legacy signature operations in a single transaction, introduced by BIP54 in order to mitigate long block validation times. Each test case represents a transaction and whether a block containing it would be valid according to BIP54. The test cases feature an extensive set of combinations of inputs and output types, ways to run into the limit, historical violations and some pathological transactions exhibiting the specific implementation details. All test cases but those belonging to this last category feature transactions that are valid under current Bitcoin consensus rules. Each test case also features a comment describing why the transaction is (in)valid according to BIP54.

The test vector file features a JSON array of JSON objects, each corresponding to a test case. Each JSON object features the following entries:

  • spent_outputs: a JSON array of strings. An ordered list of hex-encoded Bitcoin-serialized transaction outputs spent by each input of this test case's transaction.
  • tx: a JSON string. A hex-encoded Bitcoin-serialized transaction to be evaluated.
  • valid: a JSON boolean. Whether this transaction is valid according to current consensus rules supplemented by BIP54.
  • comment: a JSON string. Description of the test case.

Merkle tree malleability with 64-byte transactions

The txsize.json file contains test cases exercising the new constraint on non-witness transaction size introduced in BIP54. Each test case contains a transaction and whether it would be valid according to BIP54, as well as a comment describing why it is (in)valid. All test cases are otherwise valid according to current Bitcoin consensus rules.

The test vector file features a JSON array of JSON objects, each corresponding to a test case. Each JSON object features the following entries:

  • tx: a JSON string. A hex-encoded Bitcoin-serialized transaction to be evaluated.
  • valid: a JSON boolean. Whether this transaction is valid according to BIP54.
  • comment: a JSON string. Description of the test case.

Possibility of duplicate coinbase transactions

The coinbases.json file contains test cases exercising the new restrictions on coinbase transactions introduced in BIP54 to prevent duplicate coinbase transactions without resorting to BIP30 validation. Each test case contains a chain of mainnet blocks (including the genesis block), and whether this block chain is valid according to BIP54. All test cases are valid according to current Bitcoin's consensus rules, except one that features a block containing a coinbase transaction timelocked to a future block height.

The test vector file features a JSON array of JSON objects, each corresponding to a test case. Each JSON object features the following entries:

  • block_chain: a JSON array of strings. An ordered list of hex-encoded mainnet blocks.
  • valid: a JSON boolean. Whether this block chain is valid according to current Bitcoin consensus rules supplemented by BIP54.
  • comment: a JSON string. Description of the test case.