In this article I’m going to present and walk you through some Monero nonce research and how the final numbers in the title were concluded. If I made any obvious mistakes or if you think there’s something that could enhance this research, let me know.
This was the chart that piqued my interest and made me do this research, but let’s just dive right into it.
On it you can see the nonce distribution over time. In theory the nonce distribution should be a random number between 0 and 2³². On the very left from block 1,500,000 to block ~1,546,500 you can see thick white stripes along the whole nonce range. At the same time it was publicly confirmed that ASICs were running on the network. Those thick white lines mean that a lot of nonces of the respectively found blocks were not chosen in a random fashion, I argue it was done so on purpose to align with the already existing thicker lines of the normal distribution nonces (as they perfectly line up), to try and hide in them, but their hashrate was just too big, so too many blocks were found in those nonces, making them too thick and obvious.
Once the April fork kicked in you can instantly see the hashrate dropping dramatically and the thick white stripes gone instantaneously. Thus we can conclude that the thick white stripes were nonces picked by pre-fork specialized hardware or in simpler terms: ASICs.
In mid June around block 1,597,000 we can see specialized hardware coming online again but it’s barely noticeable. I marked it with the yellow arrows. If you’ve got a good eye you’ll see what I mean: There’s a “wall” of suddendly increased randomness, meaning that the ASIC manufacturers had learned from past mistakes and implemented random nonce picking. The thing is that in its decentralized, “natural” state, the nonce picking in the Monero network isn’t that random, the majority of it happens sub 1.45*10⁷ and in very tight nonce ranges for differing mining programs (as I will show a couple paragraphs below), where likely a lot of the pool, CPU and GPU rig hashrate comes from. Near the yellow arrows we’ve seen some of those people being replaced by ASICs with the implemented “over-randomness” i.e. GPU miners leaving for more profitable networks.
In the October fork (green line) we can see a sharp decline in hashrate but that time around we saw no obvious patterns of changing nonce distribution. That is because the forked off generation of ASICs was stealthy enough but as I outlined above, they still happened and I’ll show you how we can show it even a second time. Let’s take a closer look at the normal white lines (which mostly are miner softwares and pools picking not very random nonces e.g. xmr-stak, xmrig).
I extracted every single “normal line” in the chart above, 238 px before the green line (Oct. fork) and 238px after the green line. We can very clearly see a majority of the lines getting brighter after the green line. This means block finding (or increased hashrate) returned to those immediately after the October fork, meaning independent, decentralized hobby miners increased, while ASICs were once again forked off.
After some bad months in the markets the hashrate progressively got lower as miners were shutting off their rigs but the network hashrate eventually found a temporary bottom between 315 Mh/s and 340 Mh/s.
Now come December 31st 2018 near block 1,738,000:
We can see a sudden increase of nonces in the sub 1.342*10⁹ area while all other areas dramatically decrease.
If we watch the lines again, we can see the brightness dwindling off again, meaning decentralized and smaller mining operations get shut off at a fast pace, while all the network hashrate centralizes in the hands of the ASIC owner(s).
At the time of writing the network hashrate has increased to 810 Mh/s or 255% since the first signs of the ASICs at the end of December 2018, or approximately 40 days ago.
So how can I make the claim that ASICs make up 85% of the network?
Let’s look at the chart again that I posted in the beginning and I’ll show you my method.
1 found block = 1 nonce
Therefore, if we compare the nonce distribution during the ASIC-free network and compare it to the ASIC-ridden network, we can try to find out how many nonces are ASIC nonces and therefore conclude the proportion of ASICs in the network.
So the first thing I did was looking for certain patterns in the ASIC free network besides the usual lines. The only thing I was able to find was that there’s a very disproportionate amount of nonces in the sub 1.45*10⁷ area, where the miner softwares — for whatever reason — choose low nonces, in fact over 50% of the nonces are in that nonce space during ASIC free periods.
The next thing to look for was a pattern in the ASIC ridden network, which was obvious:
Now some number crunching had to be done. I randomly chose two 501 block periods to analyze, for each respective network state. The reasoning behind analyzing the non-ASIC network state was, so I was able to normalize the “whitespace” (bottom right corner) to not disproportionally overblow my ASIC estimation.
Here are my numbers:
So normally we have 265 nonces in the sub 1.45e7 area, 80 nonces in the 1.45e7–1.342 10⁹ area and 156 nonces in the 1.34210⁹–4.3*10⁹ area.
You can see how those number changed once the ASICs came online with their tight-ish and non-random nonce space.
The next step was to normalize all nonce spaces i.e. part of the “Mid” 308 nonces that you can see in the middle (block 1,751,000–1,751,500) are still provided by normal miners, so we have to substract their proportion to arrive at the raw ASIC number (assuming miners leave uniformly, i.e. not leaving one nonce range faster than other nonce ranges, with regards to their respective network representation).
Next, how can we estimate the hashrate of the ASIC machines?
SChernykh came up with his own method (https://www.reddit.com/r/Monero/comments/agysnf/hashrate_discussion_thread/efvzdt3/https://www.reddit.com/r/Monero/comments/agysnf/hashrate_discussion_thread/efvzdt3/):
The question he asked himself was how many hashes an ASIC core checks on average to find a winning nonce.
According to SChernykh and the Noncesense Research Lab it looks like the ASIC divides the nonce space into 22 bit ranges (2²² = 4,194,304) and has 320 cores: 320 * 2²² ~= 1.342 * 10⁹
He then cut out all the noise from low nonces, which he determined to be below 3.35*10⁸ in order to get a clear and sound result.
N1 nonces fall between 2²² and 2²²+1000, N2 nonces fall between 2²²+1000 and 2²²+2000 and so on — Calculate this:
N1*500+N2*1500+... , divide by
N1+N2+... and you’ll get the average number. Since the average block time is 2 minutes, just divide it by 120 and you’ll get 400 h/s per core.
320 cores * 400 h/s = 128 kh/s
With the given numbers and methology we can finally conclude that the current network hashrate likely consists of 85.2% ASICs (5400 ASIC machines) and some die-hard GPU miners and botnets.
- Many thanks to the Noncesense Research Lab for their data and beautiful charts: https://apollo.open-resource.org/flight-control/noncewatch/, https://noncesense-research-lab.github.io/
- SChernykh for his outstanding methology of finding the hashrate of each ASIC machine and explaining it to me.
- Isthmus for their previous in-depth analysis https://hackernoon.com/utter-noncesense-a-statistical-study-of-nonce-value-distribution-on-the-monero-blockchain-f13f673a0a0d
- Xiphon for providing the nonce data