mirror of
https://github.com/bitcoin/bips.git
synced 2026-06-01 17:15:27 +00:00
bip-0054: less redundancy in 64-byte rationale, move caching risk to footnote
This commit is contained in:
39
bip-0054.md
39
bip-0054.md
@@ -41,7 +41,7 @@ pressures and leading to reduced network security.
|
|||||||
In computing a block's Merkle root, a transaction with exactly 64 bytes of non-witness data can be
|
In computing a block's Merkle root, a transaction with exactly 64 bytes of non-witness data can be
|
||||||
interpreted both as an intermediate node in the tree and as a leaf in the tree. This makes it
|
interpreted both as an intermediate node in the tree and as a leaf in the tree. This makes it
|
||||||
possible to trick an SPV verifier into accepting an inclusion proof for a transaction that is not
|
possible to trick an SPV verifier into accepting an inclusion proof for a transaction that is not
|
||||||
part of a block, by pretending a 64-byte block transaction is actually an inner node. Invalidating
|
part of a block, by pretending a 64-byte block transaction is actually an inner node[^9]. Invalidating
|
||||||
64-byte transactions addresses this vulnerability without requiring users of SPV verifiers to deploy
|
64-byte transactions addresses this vulnerability without requiring users of SPV verifiers to deploy
|
||||||
one of the available mitigations, or even to know one is necessary in the first place.
|
one of the available mitigations, or even to know one is necessary in the first place.
|
||||||
|
|
||||||
@@ -104,20 +104,16 @@ increases the preparation cost of an attack, making it uneconomical for a miner[
|
|||||||
2500 was chosen as the tightest value that did not make any non-pathological standard transaction
|
2500 was chosen as the tightest value that did not make any non-pathological standard transaction
|
||||||
invalid[^7].
|
invalid[^7].
|
||||||
|
|
||||||
In the presence of 64-byte transactions a block header's Merkle root may be valid for different sets
|
64-byte transactions can only contain a scriptPubKey that lets anyone spend the funds, or one that
|
||||||
of transactions. This is because, in the Merkle tree construction, a 64-byte value may be
|
burns them. They have also been non-standard since 2019 and never been used since 2016. Several
|
||||||
interpreted either as a transaction or as the concatenation of two 32-byte hashes. Reinterpreting a
|
alternatives to invalidating them were previously proposed. Some believe the improvements for users
|
||||||
transaction as a node allows creating a valid Merkle proof for a transaction not included in a
|
of Merkle proofs are too marginal to be worth introducing a discontinuity in the set of valid
|
||||||
block. 64-byte transactions can only contain a scriptPubKey that lets anyone spend the funds, or one
|
witness-stripped transaction sizes. Others have suggested that the known vulnerabilities could
|
||||||
that burns them. 64-byte transactions have also been non-standard since 2019 and unused since 2016.
|
instead be mitigated by committing to the Merkle tree depth in the header's version field[^8]. The
|
||||||
It was suggested that the known vulnerabilities could instead be mitigated by committing to the
|
authors believe it is preferable to address the root cause by invalidating 64-byte transactions,
|
||||||
Merkle tree depth in the header's version field[^8], to avoid introducing a "seam". The authors
|
fixing the vulnerability without developers of SPV verifiers having to implement the mitigation or
|
||||||
believe it is preferable to address the root cause by invalidating 64-byte transactions, fixing the
|
to know it is necessary in the first place. See [this post][64 bytes debate] for an attempt at
|
||||||
vulnerability without developers of SPV verifiers having to implement the mitigation or to know it
|
summarizing the arguments for both sides of this debate.
|
||||||
is necessary in the first place. See [this post][64 bytes debate] for an attempt at summarizing the
|
|
||||||
arguments for both sides of this debate. Reinterpreting Merkle tree nodes as transactions could be
|
|
||||||
used to cause a vulnerable node to fall out of consensus[^9]. There are better ways to mitigate this
|
|
||||||
issue on its own, but it is also addressed as a byproduct of invalidating 64-byte transactions.
|
|
||||||
|
|
||||||
Several blocks prior to [bip-0034][BIP34] activation contain a coinbase transaction whose scriptSig
|
Several blocks prior to [bip-0034][BIP34] activation contain a coinbase transaction whose scriptSig
|
||||||
contains a valid [bip-0034][BIP34] commitment to a future block height. This offers an opportunity
|
contains a valid [bip-0034][BIP34] commitment to a future block height. This offers an opportunity
|
||||||
@@ -212,10 +208,14 @@ standard transaction size before running into the newly introduced limit. To run
|
|||||||
introduced limit but not the transaction size a transaction would need to spend P2SH inputs with a
|
introduced limit but not the transaction size a transaction would need to spend P2SH inputs with a
|
||||||
redeem script similar to `CHECKSIG DROP CHECKSIG DROP ...`. This type of redeem script serves no
|
redeem script similar to `CHECKSIG DROP CHECKSIG DROP ...`. This type of redeem script serves no
|
||||||
purpose beyond increasing its validation cost, which is exactly what this proposal aims to mitigate.
|
purpose beyond increasing its validation cost, which is exactly what this proposal aims to mitigate.
|
||||||
[^8]: By Sergio Demian Lerner in a [blog post][Sergio post] surfaced [by Eric Voskuil][Eric
|
[^8]: By Sergio Demian Lerner in a [blog post][Sergio post].
|
||||||
version].
|
[^9]: Conversely, pretending that the inner nodes on one level of the tree are the actual block
|
||||||
[^9]: Bitcoin Core versions between 0.13.0 and 0.13.2 implemented caching that made it vulnerable to
|
transactions is another source of complexity for full node implementations, which previously
|
||||||
this attack. See [this writeup][Suhas Merkle] by Suhas Daftuar for a detailed explanation.
|
resulted in consensus bugs. For instance, Bitcoin Core versions between 0.13.0 and 0.13.2
|
||||||
|
implemented caching that made it vulnerable to this attack. See [this writeup][Suhas Merkle] by
|
||||||
|
Suhas Daftuar for a detailed explanation. Invalidating 64-byte transactions may avoid this risk, but
|
||||||
|
the issue is largely orthogonal to this proposal: it is fundamentally about caching validation
|
||||||
|
status for malleable blocks.
|
||||||
[^10]: See [here][BIP34 list] for a full list of the heights of historical blocks including a valid
|
[^10]: See [here][BIP34 list] for a full list of the heights of historical blocks including a valid
|
||||||
bip-0034 height commitment and the corresponding future block height.
|
bip-0034 height commitment and the corresponding future block height.
|
||||||
[^11]: Technically it could be argued a duplicate could in principle always be possible before block
|
[^11]: Technically it could be argued a duplicate could in principle always be possible before block
|
||||||
@@ -242,7 +242,6 @@ have to be perpetuated for the Consensus Cleanup.
|
|||||||
[ML thread validation time]: https://gnusha.org/pi/bitcoindev/VsltJ2PHqWfzG4BU9YETTXjL7fYBbJhjVXKZQyItemySIA1okvNee9kf0zAOyLMeJ4Nqv1VOrYbWns5nP4TANCWvPJYu1ew_yxQSaudizzk=@protonmail.com
|
[ML thread validation time]: https://gnusha.org/pi/bitcoindev/VsltJ2PHqWfzG4BU9YETTXjL7fYBbJhjVXKZQyItemySIA1okvNee9kf0zAOyLMeJ4Nqv1VOrYbWns5nP4TANCWvPJYu1ew_yxQSaudizzk=@protonmail.com
|
||||||
[Suhas Merkle]: https://gnusha.org/pi/bitcoindev/CAFp6fsGtEm9p-ZQF_XqfqyQGzZK7BS2SNp2z680QBsJiFDraEA@mail.gmail.com
|
[Suhas Merkle]: https://gnusha.org/pi/bitcoindev/CAFp6fsGtEm9p-ZQF_XqfqyQGzZK7BS2SNp2z680QBsJiFDraEA@mail.gmail.com
|
||||||
[Sergio post]: https://bitslog.com/2018/06/09/leaf-node-weakness-in-bitcoin-merkle-tree-design
|
[Sergio post]: https://bitslog.com/2018/06/09/leaf-node-weakness-in-bitcoin-merkle-tree-design
|
||||||
[Eric version]: https://delvingbitcoin.org/t/great-consensus-cleanup-revival/710/37
|
|
||||||
[64 bytes debate]: https://delvingbitcoin.org/t/great-consensus-cleanup-revival/710/41
|
[64 bytes debate]: https://delvingbitcoin.org/t/great-consensus-cleanup-revival/710/41
|
||||||
[BIP34 list]: https://delvingbitcoin.org/t/great-consensus-cleanup-revival/710/4
|
[BIP34 list]: https://delvingbitcoin.org/t/great-consensus-cleanup-revival/710/4
|
||||||
[Harding nLockTime]: https://bitcoin.stackexchange.com/questions/90229/nlocktime-in-bitcoin-core
|
[Harding nLockTime]: https://bitcoin.stackexchange.com/questions/90229/nlocktime-in-bitcoin-core
|
||||||
|
|||||||
Reference in New Issue
Block a user