Hacky Slack
Hacky Slack
April 2021

Is it better to buy lotto tickets or solo mine Bitcoin?

We periodically pose a question to our devs on slack, then post the lightly edited conversation here.

Hacky Slack and Bitcoin

This Week’s Hacky Slack is about Bitcoin. We’re nerds, but we’re not bitcoin nerds. Even so, we were curious. Assuming you are a solo miner, is it better to mine bitcoin or buy a lotto ticket?

Skot

Bitcoin mining is pretty neat technically. Basically you are guess-and-checking to find a random number (nonce) that when added to the current block and hashed makes a number that matches a specific pattern.

The “specificness” of that pattern is called the difficulty. the network moves the difficulty up and down to make sure that blocks are found every 10 minutes or so.

the current difficulty is 23,581,981,443,664.

If you can find a nonce that makes a hash with a difficulty higher than that number, you have solved that block and you can collect your 6.25+ bitcoins ($396,525.00 USD)

I have been running a little USB dongle miner on my desk that can do about 20 billion hashes per second. So it’s picking nonces, adding them to the current block and hashing them to check if the difficulty is high enough, 20 billion times a second.

zeke

What are the odds of success? 1/current_difficulty?

skot

Yup! So far I am proud to report that I have achieved a nonce with a difficulty of 33,200, so… I’m almost rich. A lot of miners work as a part of a pool, where they split up the rewards with everyone, based on how many hashes each person has done. even though only one of the hashes made any money

Solo mining means you get the whole reward yourself, if you get really lucky.

zeke

You get 20 billion * 600 chances per block (10 minutes of 60 seconds * 20 billion tries per second) so 20,000,000,000 * 60 * 10 = 12,000,000,000,000. If you run two of these, why don’t you hit almost every time?

23,581,981,443,663 / 12,000,000,000,000 is basically 2

sam

I got a similar result from a different angle…  if something has a chance of 1/x and you try it x times, it approaches 63% odds of happening at least once in those x times

that’s only 1100 seconds of trying

zeke

skot would be making almost 400k per 10 minutes if he just bought a 2nd usb dongle. must be nice

sam

that 20billion/second stat sounds suspicious…

skot

hmm. my average is reported as 22.27Gh/s

but you’re right, why am i not rich yet?

zeke

that’s because you only have one dongle

sam

how long have you been running it, have you checked your accounts???

skot

at least an hour

sam

I don’t think there are many things that can do anything 20B times per second

just transmitting data that fast requires 160gigabit

zeke

20ghz is a big number, but not impossible

sam

I think they mean gigahash

zeke

and each hash is multiple steps of mathing

skot

it doesn’t have to transmit anything.. only when it hits the jackpot

danny

the dongle must be really parallelized

seems like it’s clock is probably something like 1GHz and it’s running ~100 cores or something?

well, it’s probably an ASIC, right?

skot

it’s clock is 100MHz, so it needs to be able to do at least 200 parallel hashes

sam

The Bitmain AntMiner, widely touted as the most efficient and most powerful Bitcoin miner on the market, offers miners a highly impressive hash rate of 14 TH/s

zeke

we must be drastically underestimating how the difficulty works.

skot

that has ~187 copies of the chip on my dongle

sam

these numbers sound outrageous

skot

and a lot of fans so it can run it at crazy higher frequency

danny

maybe difficulty is log scale or something? 2^23,581,981,443,663?

sam

nice nerd-snipe skot, now I’m looking at this table

skot

yeah, 1/current_difficulty must not be right.

I can’t quite understand what’s going on here on the Difficulty page on Wikipedia.

sam

This calculator says you’ll make $0.31/month

skot I’m solo mining, just to screw around with it… so it’s pure lottery

danny

I understand that the current block has a SHA256 hash:

1 0 1 1 0 1 0 1
0 1 1 0 0 0 1 0
0 0 0 1 1 1 0 0
1 1 0 1 0 0 1 0

Then I want to come up with some other random number whose SHA256 hash differences with the current block’s has such that the first n bits of the sum are 0. The higher n is, the higher the difficulty. A winning sum might look like

block hash
---------------
1 0 1 1 0 1 0 1
0 1 1 0 0 0 1 0
0 0 0 1 1 1 0 0
1 1 0 1 0 0 1 0 my hash of my magic number
---------------
1 0 1 1 0 1 0 1
0 1 1 0 0 0 1 0
0 1 0 1 1 1 0 0
1 1 0 1 1 1 1 0 block hash - my hash of my magic number
---------------
0 0 0 0 0 0 0 0 <--------- win!
0 0 0 0 0 0 0 0 <--------- win!
0 0 0 1 1 1 0 0
1 1 0 1 0 0 1 0

zeke

I’m not sure that I really understand how SHA256 or any one way hashing works

why can’t I just do the hash making math in reverse?

skot

It’s a one way function

if you could figure out how to reverse it, you could be very wealthy!

danny

Yes, if you could reverse it, you would break all encryption and all bitcoin and everything

and basically send the global economy into a tailspin

skot

That is a pretty fun “what if” scenario; what would you do if you one day figured it out?

danny

This guy is an incredible explainer and does a great walk-through of blockchain and bitcoin: But how does bitcoin actually work?

zeke

but what makes it one way? if I want to use the new ZSA1 algorithm (x * 69 = hash) to hash the number 420, I get 28,980. Everyone knows that can just divide the hash by 69 to get the original number since the hashing function is well known

danny

I was curious too and found this one helpful: Cryptography: Hash Functions

A really simple example of an almost one-way function is the product of two large primes:15,485,863 * 67,867,967 = 1,050,994,039,050,521 The product is the hash. To reverse the function, you need to determine which two prime numbers multiply to equal the output. 

It’s just an example, but you can immediately see that it’s very easy to go “to the right” and much harder to go “to the left”

To go to the left, you have to divide 1,050,994,039,050,521 by every prime starting at 1, then if it’s divisible, you have to check to see if the quotient is also prime.

so it might take «1 second to go to the right and thousands of seconds to go to the left. SHA256 is like that, except it takes nanoseconds to go to the right and trillions of years to go to the left.

BUT, SHA256 was developed by the NSA, so maybe they know how to reverse it and are snooping on all our shit

so it’s not that has functions are irreversible, it’s just that it’s a giant pain in the ass to reverse them, and usually the best option is to just guess-and-check (which is what bitcoin miners do)

Dean

To return the original question, apparently authoritative CoinWarz says

Bitcoin difficulty is a measure of how many hashes (statistically) must be generated to find a valid solution to solve the next Bitcoin block and earn the mining reward.

The difficulty is in the trillions of hashes required, but the network is generating hundreds of quintillions of hashes per second (hashrate). Quintillions are obviously a lot bigger than trillions. If the network is generating quintillions of hashes per second, it’s not clear why it takes 10 minutes to achieve the trillions of difficulty. Side note, Skot’s single USB stick is contributing 0.0000001% of the total hashing effort.

CoinWarz doesn’t have access to some reported sum of hashes though, they’re actually backing into that quintillion number.

The Bitcoin hashrate is calculated using the current Bitcoin difficulty, the defined Bitcoin block time, and the average block time of the last (X) number of blocks.

danny

AH! we must be totally missing something having to do with this difficulty concept

dean

Here is a Stack Exchange post with a solid answer by Pieter Wuille

difficulty = hashrate / (2^256 / max_target / intended_time_per_block)
 = hashrate / (2^256 / (2^208*65535) / 600)
 = hashrate / (2^48 / 65535 / 600)
 = hashrate / 7158388.05

That… doesn’t help does it?

danny

I am not sure what max_target is…

dean

max_target is 2^208*65535 (an application-defined constant, which sets the target hash corresponding to the lowest possible difficulty, 1), and intended_time_per_block is 600 (10 minutes, also a constant).

Does that make sense to you?

danny

Maybe…

dean

Hmmm

(2^256*difficulty/max_target) hashes are needed on average to find a block

danny

now that’s a useful constant

dean

So plugging in the numbers from CoinWarz to the formula from that Stack Exchange gets us these results

2^256*23.58 trillion/(2^208*65535) = 8e+23
135 quintillion * 60 seconds * 10 minutes = 1e+22 (or 0.1e+23)

(I feel like this paper would be marked down by my high school teachers for not using authoritative sources, but the numbers seem to get close)

danny

where did 135 quintillion come from?

dean

That’s the current hashrate

dean

Hmm, the difference between 8e+23 and 0.1e+23 is almost certainly because difficulty doesn’t update that frequently.

Once every 10 days or so. Those numbers almost definitionally won’t match exactly. I’m reasonably satisfied we have the formula right.

So the odds that Skot gets rich in any given second are

[number of hashes per second]/([difficulty]*[4,295,032,833]) 

or, in this case, 20 billion/(23.6 trillion * 4.3 billion)= 1.97e-13

The odds of winning the lottery are roughly 3.33e-9. The odds of winning the lottery are 3.33e-9 / 1.97e-13 = 16,903 times higher than getting a bitcoin in any given second, but the bitcoin miner just keeps running.

In terms of winning the prize, running that USB stick is essentially equivalent to buying a lotto ticket every 4.7 hours.

skot

ooo I just had my best hash yet; 272,226 difficulty.

23,581,981,443,663 here we come!