Skip to content

feat(dataset): add AntPool empty-block coinbase overpayments 494933 and 544568 - #34

Merged
deadmanoz merged 1 commit into
mainfrom
antpool-494933-544568-coinbase-overpay
Oct 20, 2026
Merged

deadmanoz merged 1 commit into
mainfrom
antpool-494933-544568-coinbase-overpay

Conversation

@deadmanoz

@deadmanoz deadmanoz commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

While revisiting 0xB10C's AntPool & friends invalid mining jobs observation (where AntPool-template pools broadcast empty-block Stratum jobs that failed bad-cb-amount by carrying over a prior template's coinbase payout amount), I audited all historical AuxPoW-recovered Bitcoin parent blocks with an empty coinbase_merkle_branch against GetBlockSubsidy(height).

That sweep surfaced two Namecoin AuxPoW proofs at child heights 370,986 (bb4049c7…990c57bd) and 420,298 (4616d4db…d420a3402). Those proofs preserve the 80-byte Bitcoin parent header, raw Bitcoin parent coinbase transaction, and a zero-step coinbase_merkle_branch for Bitcoin heights 494,933 (…c31a9382de1fced9, 2017-11-18 14:37:54 UTC) and 544,568 (…52def7e220d202cd, 2018-10-06 02:07:52 UTC).

Because each AuxPoW proof's coinbase_merkle_branch is empty ([]), the parent coinbase txid (3ef8b25a…b07f4a00 at 494,933 and cb818b5b…deae6df3 at 544,568) equals the 80-byte Bitcoin header's merkle_root directly. That proves both candidates are single-transaction empty blocks (vtx.size() == 1) with zero transaction fees, allowing exact reconstruction of the complete 329-byte serialized Bitcoin block (80-byte header + 0x01 transaction count + 248-byte non-witness coinbase transaction) from the Namecoin AuxPoW record alone.

Both blocks were mined by AntPool (Mined by AntPoolh paying 1CyB8GJNEsNVXtPutB36nrDY3fMXBTzXSX at 494,933; Mined by AntPool1M paying 1Nh7uHdvY6fNwtQtM1G5EZAFPLC33B59rB at 544,568) during the second subsidy epoch (420,000 to 629,999), where GetBlockSubsidy(height) is 1,250,000,000 satoshis (12.5 BTC). Each coinbase instead claims 2,500,000,000 satoshis (25 BTC) in vout[0], failing CheckBlock() (bad-cb-amount). They belong to the same empty-block coinbase-overpayment class as AntPool's height 584,802 (…beefb88f4c5fa5a69) and the later Stratum-observed incidents in 0xB10C's report, except that 494,933 and 544,568 paid a pre-2016-halving 25 BTC value rather than a cached prior-block fee total. Both headers were previously listed as valid stale blocks in bitcoin-data/stale-blocks; bitcoin-data/stale-blocks#169 removes them from stale-blocks.csv.

Changes

  • blocks/494933-….bin and blocks/544568-….bin: add the 329-byte reconstructed single-transaction block bodies (sha256 b02f3521…e072723 and 855e7292…a7219b).
  • data/invalid-blocks.jsonl: add catalogue entries for 494933 and 544568 under rule = "bad-cb-amount", attributed to AntPool by coinbase tag, with namecoin:370986 and namecoin:420298 AuxPoW observations.
  • docs/notes.md and ci/test_sanity_check.py: update the AntPool coinbase overpayment section (now three AntPool blocks: 494933, 544568, 584802) and dataset count assertions (175 blocks, 128 block files).

Testing

Ran the unit test suite and repository sanity check against the reconstructed .bin files and JSONL records:

$ python3 -m unittest discover -s ci -p 'test_*.py'
..................................................
----------------------------------------------------------------------
Ran 50 tests in 11.633s

OK

$ python3 ci/sanity-check.py
sanity-check successful: 175 blocks, 175 contexts, 591 observations, 128 block files, 40 proof files

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant