bitcoin, mining, stratum, crypto, formula, hashrate,

Math Formulas in Bitcoin Mining

Stefan Liu Stefan Liu Follow Jul 16, 2019 · 3 mins read
Math Formulas in Bitcoin Mining
Share this

This post is to list common formulas in bitcoin mining.

Mining Difficulty

A sha256 hash has 256 bits value as the target. The lower the value is, the more difficult the job is to be done to generate such a hash that can meet the target threshold.

To calculate a difficulty of a hash target:

difficulty = difficulty_1_target / current_target

Each bitcoin block has the required difficulty coded as bits in block header, which is a 32 bits value in compact nBits format to represent the block target. To convert the nBits to target:

sign = nbits & 0x00800000

mantissa = (nbits & 0x7fffff)

exponent = nbits >> 24

target = (-1^sign) * mantissa * 256^(exponent-3)

For bitcoin, the commonly used difficulty_1_target is 0x1d00ffff in nbits. So the below target has the difficulty as 1.

0x00000000FFFF0000000000000000000000000000000000000000000000000000

Mining Hashrate

Hashrate or hashpower is used to measure a mining machine’s hashing performance. Hashrate 1KH/s means 1000 hashes per second, and there’s more units commonly used as below:

1 EH/s = 1000 PH/s = 1000, 000 TH/s = 1000, 000, 000 GH/s = 1000, 000, 000, 000 MH/s = 1000, 000, 000, 000, 000 KH/s = 1000, 000, 000, 000, 000, 000 H/s

In a typical pooled mining, the pool would collect the shares submitted by the mining machines to calculate the hashrate of a mining worker, which would be like:

hashrate (TH/s) = (share_diff_sum_in_1h / 3600) * pow(2, 32) / pow(10, 12)

Mining luck

Mining luck is used to measure the round luck, which means you are lucky if you find a block with less work done compared to the one calculated.

luck = 1/(share_diff_sum_round / netdiff)

So, for example the bitcoin chain’s network difficulty is 9853622692186 (about 9.85T) when I am writing this post. This would mean to find a block within one day with a normal luck 100%, it would need this much hashpower:

hashrate(PH/s) = (9.85T / (60*60*24)) * pow(2, 32) / pow(10, 15) = 489.8 PH/s

Why? It’s a math logic as described below:

  • Convert diff to target

target = (0xffff * pow(2, 208)) / diff

  • Hashes required to meet the target

hashes = pow(2, 256) / target = diff * pow(2, 48) / 0xffff

To simplify a bit, use pow(2**16) to replace 0xffff

hashes = diff * pow(2, 32)

  • To do such hashes within 24 hours would require hashrate as

hashrate(H/s) = hashes/ (60*60*24) = diff * pow(2, 32) / (60*60*24)

Rejection Rate

For pooled mining, a share submitted by mining worker might be rejected for several reasons, like low difficulty, stale job, network latency, etc.

rejectionrate = shares_rejected / shares_total

PPS Reward

PPS is a commonly used mining reward calculation method to distribute mining rewards to miners. With this method, the mining pool’s profit would depends on the pool’s luck, while the miner’s rewards would be stable.

reward = block_reward * hashrate / network_difficulty

PPLNS Reward

PPLNS is another commonly used mining reward calculation method which is used to avoid pool hoppers. The N is normally bigger or equal than 5. With this method, miner’s profit would depend on the pool’s luck. The more shares the worker contribute to pool’s last N round, the more reward will be paid out to this user from this round’s block reward.

reward = block_reward * miner_shares_in_last_N_round / shares_total_in_last_N_round

In addition, I am not a native English speaker, just trying to get used with writing posts in it.

PV
Stefan Liu
Written by Stefan Liu Follow
Coding with ideas