mirror of
https://github.com/bitcoin/bips.git
synced 2025-12-22 14:45:19 +00:00
bip-0054: document the test vectors
This commit is contained in:
parent
30b0084808
commit
0777a81367
@ -158,6 +158,11 @@ forward-compatible with the changes proposed in this BIP.
|
|||||||
|
|
||||||
An implementation of BIP54 for Bitcoin Core is available [here][inquisition-implem].
|
An implementation of BIP54 for Bitcoin Core is available [here][inquisition-implem].
|
||||||
|
|
||||||
|
## Test vectors
|
||||||
|
|
||||||
|
Documented test vectors are available [here](./bip-0054/test_vectors/) for all mitigations
|
||||||
|
introduced in this BIP.
|
||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
|
|
||||||
This document builds upon an [earlier proposal][BIP-XXXX] by Matt Corallo.
|
This document builds upon an [earlier proposal][BIP-XXXX] by Matt Corallo.
|
||||||
@ -165,7 +170,8 @@ This document builds upon an [earlier proposal][BIP-XXXX] by Matt Corallo.
|
|||||||
The authors would like to thank everyone involved in researching the most appropriate mitigation for
|
The authors would like to thank everyone involved in researching the most appropriate mitigation for
|
||||||
each of these bugs. We would like to thank in particular Anthony Towns and Sjors Provoost for their
|
each of these bugs. We would like to thank in particular Anthony Towns and Sjors Provoost for their
|
||||||
direct contributions to this proposal, as well as @0xb10c and Brian Groll for providing the authors
|
direct contributions to this proposal, as well as @0xb10c and Brian Groll for providing the authors
|
||||||
with data to analyze the proposed mitigations.
|
with data to analyze the proposed mitigations. Thanks to Chris Stewart for digging up historical
|
||||||
|
violations to the new transaction size rule, which are partially reused in this BIP's test vectors.
|
||||||
|
|
||||||
## Copyright
|
## Copyright
|
||||||
|
|
||||||
|
|||||||
102
bip-0054/test_vectors/README.md
Normal file
102
bip-0054/test_vectors/README.md
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
## 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][other-vectors]. The other half requires mining mainnet blocks and is [published
|
||||||
|
separately][bip54-miner]. 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][header-miner] and [block][block-miner] 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][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`](./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`](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`](./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`](./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.
|
||||||
|
|
||||||
|
|
||||||
|
[bip54-miner]: https://github.com/darosior/bitcoin/blob/bip54_miner/commits
|
||||||
|
[header-miner]: https://github.com/darosior/bitcoin/blob/bip54_miner/src/test/bip54_header_miner.cpp
|
||||||
|
[block-miner]: https://github.com/darosior/bitcoin/blob/bip54_miner/src/test/bip54_block_miner.cpp
|
||||||
|
[other-vectors]: https://github.com/darosior/bitcoin/blob/2509_inquisition_consensus_cleanup/src/test/bip54_tests.cpp
|
||||||
|
[premined-headers]: https://github.com/darosior/bitcoin/blob/bip54_miner/src/test/bip54_premined_headers.h
|
||||||
Loading…
x
Reference in New Issue
Block a user