Wow just figured out Bitmain's latest fuckery in real time.
I'll give you the back story...
Once upon a time Bitmain was grinding merkle roots instead of nonces aka "covert ASICBOOST".
This gave them an advantage over other miners who didn't know this was possible. One company went out of business - KNC - citing "the Chinese having some secret advantage we don't know about" - which turned out to be true precisely for this reason.
It's one of the reasons ASIC manufacture is so centralized today and this is correctly identified by many as being one of the most vulnerable aspects of the entire bitcoin ecosystem.
The ASICBOOST issue came to a head when Bitmain used their influence to block the activation of SEGWIT (essential for Lightning) because it would break their ability to do it - at least covertly. Well, they would still be able to use asicboost, but just in an obvious way that would mean everyone else could do it too. They had patented it so as to try and prevent this because that's the kind of people we're dealing with here but I digress...
When asicboost was independently discovered by Greg Maxwell Bitmain lied and said they weren't in fact using it.
This was after years of bullshitting about segwit, with Bitmain pretending to be in favour of "alternative scaling solutions" or even doing segwit as a hard fork instead which would allow them to continue what they were doing.....
Absolutely nobody believed them thanks to GMax having reverse engineered one of their ASICs and demonstrating what they had built and tried to keep to themselves.
This was a watershed moment in the fork wars where everyone suddenly understood why Bitmain had been making nonsensical arguments against segwit forever. Wanting big/small blocks wasn't a related discussion. Segwit fixed TX malleability and was a no-brainer upgrade and in the end was combined with a block size increase anyway as a compromise.
So we proceeded with segwit anyway, at which point Bitmain switched to overt asicboost which is actually even more powerful, it just requires grinding version bits instead of merkle roots but it's obvious if a miner is doing this.
Now everybody does it so essentially the net effect of it being possible is zero, except your node asking you wtf miners are doing signalling for upgrades your node knows nothing about (upgrade coordination is what version bits are actually supposed to be used for).
Oh well, relatively little harm done. If you're happy to ignore the obvious dishonesty and effort to undermine what's arguably Bitcoin's most important ever upgrade.
Fun extra tidbit: Antbleed - an intentional backdoor with which Bitmain could remotely shutdown any Antminer in the world. They said it was for shutting down stolen ASICs but immediately patched it once it was discovered.
Anyway, this company now accounts for 25-30% of all blocks found, if you naively observe the blockchain.
That's not enough to spook anyone, but unfortunately many smaller pools are in fact just fronts for Bitmain which we know for three reasons:
1. The smaller pools are clearly using blocks constructed by, or for the benefit of, Antpool.
2. They share the same custodian of their newly mined coins (Cobo).
3. They have a lending program to bail out smaller pools who get in over their head due to FPPS.
And the trend is sadly in the wrong direction, given Braiins recently abandoning its old payout model and becoming just a simple proxy for Bitmain as result of switching to FPPS.
[Massive shoutout to @mononautical and @0xB10C for helping uncover how centralized pools have become. Those are their Tweeter handles, idk if they're on Nostr.]
Summary - Bitmain is not just Antpool, it probably accounts for >50% of block templates and manufactures >90% of the mining hardware in the world.
So where am I going with all this?
Amazingly, it's about empty blocks.
What does that have to do with anything?
Well, famously OCEAN has found 3 empty blocks in its short existence, causing many to wrongly make allegations of some sort of issue with the pool itself.
This spurred on endless debate about why pools make empty templates in the first place and the actual reason so many of them get solved.
In short, pools send empty templates then immediately follow up with full templates. So quickly, that the interim period accounts for a tiny minority of the empty blocks that get found on the network, and none of ours.
In all three cases with OCEAN, the miner solved the empty block long after already having a full template to work on -
- leaving the pool in a position to either throw away a perfectly good (but empty) block or to broadcast it to the network and get miners >90% of the reward of a full block. Obviously the latter makes sense and does zero harm to the network while still adding to the overall PoW necessary for any attacker.
So why would an empty block happen a few seconds after the pool had already sent an updated job for a full block?
Because Antminers suck.
*What we didn't realize was that they intentionally sucked.*
You can send an updated job to an Antminer and watch it continue to work on an old job for over 60 seconds in edge cases.
This was something we assumed was due to design of the ASIC itself, and thus just poor engineering on the part of Bitmain.
But it turns out we were wrong, it's due to Antminer firmware.
We know this because they just released a fix for it.
So Bitmain watched, while people kept mining empty blocks, everyone would wrongly attribute it to pools, while explainers on popular websites like mempool(.)space would offer wrong explanations about it happening due to pools being slow to send proper templates and seemingly no one would understand even the motivation for sending empty templates, let alone the reason they get worked on for so long.
But the fix being something that gets released right after OCEAN starts explaining what's really going on here is beyond reasonable doubt.
They had a fix for it, and have been using that fix for their own mining.
Now they can't get away with it because increasingly people are realizing that Whatsminers and ASICs from other manufacturers aren't finding anything like the amount of empty blocks because they switch jobs far more quickly.
An Antminer has a far greater likelihood of finding an empty block because it spends longer working on old jobs.
We've been out here yelling that the issue is with the ASIC *NOT* the pool.
The fact that Bitmain intentionally crippled the firmware on the Antminers they would sell to the world, while keeping more functional units for their own mining is typical of everything Bitmain.
Sure it can be incompetence and coincidental timing on the fix, but I sincerely doubt it.
The conversation around empty blocks reached the point where people were beginning to realize something was broken with Antminers and then they just happen to release a fix for it right after people finally start catching wind of what's really going on.
__________________
So imagine this -
You sell shovels to gold miners, and as we all know, the people who make money during a gold rush are the people who sell the shovels.
But in this case the shovel seller is digging for gold himself too.
And he has intentionally sold crappy shovels to all of his customers so as give himself an advantage.
Empty blocks kept happening, people kept blaming pools.
OCEAN got attacked over it. We explained the real reason they happen so much, and Bitmain releases a fix right after.
Insane.
This goes further than empty blocks.
It's not just empty templates that take forever to work their way out of an Antminer, it's *all templates* and pools are constantly updating work as new transactions show up.
A super lucrative transaction shows up in your mempool?
All other pools are sending an updated job to hundreds of thousands of Antminers who will ignore it for a while, while Antpool has their miners working on it more quickly.
It's not hard to see the motivation for all this, especially going forward as TX fees become more and more important.
Again, insane.
_________________
If you want to watch @wk057 and I figure this all out in real time, watch the video below which was just intended to be a discussion on why empty blocks happen:
https://www.youtube.com/watch?v=4BkyhdxnDrM