P2TR spending transactions missing from F2Pool and AntPool blocks (2021)

Hey pools! plz mine our funny transactions!!
Wednesday, August 24, 2022

My miningpool-observer project aims to detect when mining pools don’t mine transactions they could have mined. Right after taproot activation, it caught that F2Pool and AntPool didn’t mine P2TR (Pay-to-Taproot) spending transactions. This post is a write-up of this observation.

Note: I’m documenting an observation from November 2021 here so I can link to it. This is no longer an issue. I’ve also discussed this in Monitoring Taproot Activation, which might give a better overview of the situation.

During Taproot Activation

The taproot soft-fork was activated with block 709632 mined on November 14th, 2021. Some Bitcoin developers had crafted P2TR spending transactions containing, for example, OP_RETURN outputs celebrating the soft-fork activation. With block 709631 being mined, Bitcoin Core nodes began to accept and relay these P2TR spending transactions. Developers broadcast their transactions, hoping to make it into block 709632.

F2Pool mined block 709632 about 18 minutes after 709631 was mined. This was the first block with the taproot rules active. However, it didn’t contain any purposefully crafted P2TR spending transaction, which should have been included. While people were discussing what could have happened, AntPool mined the two blocks 709633 and 709634. Both of which didn’t contain any P2TR spending transactions either.

Then, Foundry mined block 709635, which included all P2TR spending transactions waiting in the mempool. Over the following blocks, other mining pools like, for example, Poolin, SlushPool, BTC.com, and Luxor also included P2TR spending transactions.

However, it took a few days until F2Pool and AntPool mined their first P2TR spending transactions. We only learned from F2Pool why they didn’t start mining these transactions right after activation. We don’t know details about AntPools problems but assume it was a similar issue. F2Pool had upgraded its nodes at least a few weeks before activation. However, they were running Bitcoin Core with custom patches. One of these patches disconnected peers, which reported a version string starting with /Satoshi:0.1. Only Bitcoin Core v0.21.1 and v22.01 shipped with the taproot soft-fork logic. Both of these didn’t match F2Pools version string filter and were disconnected. After fixing this, F2Pool started mining P2TR spending transactions. AntPool might have fixed a similar issue and started to include P2TR spends, too.

Missing transactions

The miningpool-observer project compares a just mined block to a block template generated just before the block was found. The differences between the two can show which transactions the pool left out and which were included extra. Block templates and blocks often differ slightly as different nodes know about other transactions. However, transactions not making it into multiple blocks when they have been in multiple block templates could indicate filtering or censorship by pools.

This was the case with the P2TR spending transactions. They were included in the block templates but not in the blocks by F2Pool and AntPool. The miningpool.observer/missing page shows transactions missing from three or more blocks. This is the case with F2Pools taproot activation block 709632, and AntPools blocks 709633 and 709634. The following transactions were included by Foundry in block 709635.

For example, transaction 0bf67b.. 2 was missing from these blocks. It spent a 6490 sat P2TR output and created an OP_RETURN and a P2SH output. The OP_RETURN output contains the message “∞/21million. Thanks Satoshi! —BitGo”. Similarly, the transaction 905ecd.. 3 spent the first Taproot 2-of-2 multisig output and includes an OP_RETURN output with the message Thx Satoshi! ∞/21mil First Taproot multisig spend -BitGo. Andrew Chow’s script path spend 37777d.. 4, which ended up being the second P2TR spend mined, was reported missing. Pieter Wuille’s vanity address taproot party taptap transaction 83c8e0.. 5, too.

This shows that the tool works when multiple pools do not include transactions. This also shows that Bitcoin works as intended. If at least some pools are mining P2TR spending transactions, the transactions will eventually be mined.

More Taproot activation history is documented in Monitoring Taproot Activation and in this bitcoin-dev mailing list thread “Taproot activates - A time/block line”.


  1. Bitcoin Core decided to drop the zero in the beginning of the version starting with version v0.22. ↩︎

  2. txid 0bf67b1f05326afbd613e11631a2b86466ac7e255499f6286e31b9d7d889cee7, miningpool.observer on archive.ph, blockstream.info, mempool.space ↩︎

  3. txid 905ecdf95a84804b192f4dc221cfed4d77959b81ed66013a7e41a6e61e7ed530, miningpool.observer on archive.ph, blockstream.info, mempool.space ↩︎

  4. txid 37777defed8717c581b4c0509329550e344bdc14ac38f71fc050096887e535c8, miningpool.observer on archive.ph, blockstream.info, mempool.space ↩︎

  5. txid 83c8e0289fecf93b5a284705396f5a652d9886cbd26236b0d647655ad8a37d82, miningpool.observer on archive.ph, blockstream.info, mempool.space ↩︎

All text and images in this work are licensed under a Creative Commons Attribution-ShareAlike 4.0 International License Creative Commons License

Previous

Image for Following the Blockchain.com feerate recommendations

July 13, 2020

Following the Blockchain.com feerate recommendations

Transactions sent with Blockchain.com wallets make up for about a third of all Bitcoin transactions. A methodology to identify these transactions is described and used. Insights about the wallet-usage are derived from the resulting dataset. The privacy implications and possible improvements are …