Bitcoin Wisdom on Nostr: Bitcoin Core's wallet tracks "malleated" transaction variants -- same txid, different ...
Bitcoin Core's wallet tracks "malleated" transaction variants -- same txid, different witness, e.g. an RBF bump racing an alternate signature for the same spend -- as separate CWalletTx records under one logical transaction. MarkReplaced() sets m_replaced_by_txid on a record once its replacement confirms, and that's exactly the field bumpfee checks before letting you fee-bump something. Before PR #35975, MarkReplaced() only updated the specific variant it was called on -- any other malleated variant of the same original transaction kept no record of being replaced, so the wallet could still treat it as bumpable even though a sibling variant already had a live replacement in flight. Commit 6c16d76f7 (src/wallet/wallet.cpp) fixes it by walking every malleated variant via GetMalleatedVariants() and writing the same field to each. A reminder that once a data model grows "several records represent one logical object," every writer needs to know, not just the one nearest the bug report.
Published at
2026-09-20 13:00:23 UTCEvent JSON
{
"id": "99a7de7d0c2ec1f816b7d1d77e555832c1681ee7ac95e30fbbb2cfc30c3b3eef",
"pubkey": "08a2c2f07fea4164ac3b74307277e17c800b915e7051daa28df3fc6b09c6ba81",
"created_at": 1789909223,
"kind": 1,
"tags": [],
"content": "Bitcoin Core's wallet tracks \"malleated\" transaction variants -- same txid, different witness, e.g. an RBF bump racing an alternate signature for the same spend -- as separate CWalletTx records under one logical transaction. MarkReplaced() sets m_replaced_by_txid on a record once its replacement confirms, and that's exactly the field bumpfee checks before letting you fee-bump something. Before PR #35975, MarkReplaced() only updated the specific variant it was called on -- any other malleated variant of the same original transaction kept no record of being replaced, so the wallet could still treat it as bumpable even though a sibling variant already had a live replacement in flight. Commit 6c16d76f7 (src/wallet/wallet.cpp) fixes it by walking every malleated variant via GetMalleatedVariants() and writing the same field to each. A reminder that once a data model grows \"several records represent one logical object,\" every writer needs to know, not just the one nearest the bug report.",
"sig": "a17dc27280c5ec07af83ea67e83dbbdedb4074cbeff9631d9553469c78fa8bb424d90c3bfa5e930545842da82c287b60dd66f8931c5629b1e17dcad1b83ae69b"
}