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.
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.
Bitcoin Core decided to drop the zero in the beginning of the version starting with version v0.22. ↩︎