upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/compactblock.cpp
AgeCommit message (Collapse)Author
2026-09-05compactblock: fail closed on RAND_bytes error, bound reconstruction allocationbitflash-maintainer
Two fixes to the file imported in the previous commit. Kept separate so the deviation from upstream's bytes is reviewable on its own. BuildCompactBlock ignored the RAND_bytes return value. On failure nonceBytes is left uninitialised and an indeterminate shortIdNonce is memcpy'd out and sent on the wire -- and that nonce is exactly what the file relies on being unpredictable so short IDs cannot be precomputed before a block exists or ground across blocks. Every other RAND_bytes call site in this tree (bip32.cpp:203, db.cpp:2462, db.cpp:2469) checks for != 1 and fails closed; this one now does too. The caller falls back to full-block relay. TryReconstructBlock sized a vector directly from the wire. nTotal is the sum of two deserialised vector lengths, and serialize.h bounds a vector only by MAX_SIZE (0x02000000), so once the P2P handlers are wired a single small message could ask this node to default-construct ~33M CTransactions. The smallest a transaction can serialise to is 10 bytes, so no block within MAX_BLOCK_SIZE holds more than MAX_BLOCK_SIZE/10 of them; anything above that is not a block this node could accept under any circumstance. Rejecting falls back to full-block relay, which is always correct. Neither is reachable today -- nothing feeds these functions from the network yet -- but both are latent the moment the message handlers land, which is the wrong time to be finding them. test_compactblock (17 checks) and all 14 selftests pass with both in place.
2026-09-05compactblock: import BIP152-style compact block relay from upstream 1.2.23bitflash-maintainer
Brings src/compactblock.{cpp,h} and test_compactblock.cpp across verbatim from the upstream-v1.2.23 tag, and gives them a build. 1.2.23 is not a newer release of the line this fork ships. It is a lightweight tag (7ab5a8c) cut 2026-07-30, on a lineage that upstream/main (e0be70e, 2026-08-20) does not contain and no remote branch carries -- 272 commits that are not ours, against 376 of ours that are not theirs, from a merge-base at 56df983. Merging that tag would have deleted 18 files from src/, selftest.{cpp,h} and the whole 14-test suite among them, so the content is ported file by file instead. Compact block relay is the piece worth having: a peer that advertises sendcmpct gets 48-bit keyed short IDs per transaction rather than the transaction bytes, and reconstructs the block from its own mempool. It is purely additive on the wire -- a peer that never sends sendcmpct keeps receiving full block messages, so no coordinated upgrade is needed. This commit is the primitives and their unit test only. Nothing calls BuildCompactBlock or TryReconstructBlock yet: the P2P message handlers (sendcmpct/cmpctblock/getblocktxn/blocktxn) live in 1.2.23's main.cpp and are deliberately left for a follow-up, so that no attacker-controlled bytes reach this code until that wiring is reviewed on its own. The files needed no API adaptation -- mapTransactions, BEGIN/END and IMPLEMENT_SERIALIZE are unchanged across the divergence, and it compiled clean first time. Upstream never wired test_compactblock.cpp into its own Makefile, so it had never been built there; it links standalone the way test_bip32 does, supplying its own mapTransactions and GetAppDir to keep main.cpp out of the link. TEST_LIBS is overridable for the same reason NODE_LIBS is: the pinned dep tree ships libsodium as a static archive only. All 17 checks in test_compactblock pass, all 14 selftests still pass, and the consensus constants are unchanged against e4f898c.