How to calculate difficulty from Bits fields (which is stored in block).
- Convert value to hex:
bits=471067731 -> 0x1c13ec53
- Split hex value, take 8 high bits (
0x1c), and 24 low (0x13ec53)
- Use formula to get 256-bit target value:
T = low * 2 ^ (8 * (high - 3)). In our case it will be: T = 0x13ec53 * 2 ^ (8 * (0x1c - 3)) = 0x0000000013ec5300000000000000000000000000000000000000000000000000
- Divide highest possible target Tmax (
0x00000000ffff0000000000000000000000000000000000000000000000000000) by our T. If we truncate zeros, it will be: 0x13ec53 / 0xffff00 = 12.849
Network recalculates difficulty every 2016 blocks (2 weeks). This is how 12.85 is getting recalculated from block timestamps:
block - diff - time stamp
...
52415 - 7.82 (2010-04-21 21:50:53)
52416 - 11.46 (2010-04-21 21:52:52) <- difficulty update
...
54430 - 11.46 (2010-05-04 09:39:19)
54431 - 11.46 (2010-05-04 09:40:03)
54432 - 12.85 (2010-05-04 09:46:16) <- difficulty update
...
55798 - 12.85 (2010-05-14 16:21:05) <- your block
When network recalculates difficulty, it takes time to mine the latest 2015 blocks (due to bug in code, it should take 2016). In our example, it would be:
2010-05-04 09:40:03 - 2010-04-21 21:52:52 = 12.491 days
In normal scenario 2016 block should be mined in 14 days. So, new difficulty:
11.46 * 14 / 12.491 = 12.844
Thanks for your help. But why we added 11.46 in our calculation? any reason for this? and why you added 12.491? what about the formula D = T(max) / T – Shubham – 2018-05-28T11:11:25.333
1
11.46 is previous difficulty. To calculate new difficulty network takes previous one. You can't use Bits field directly and do division. It has internal format, You can read wiki for details: https://en.bitcoin.it/wiki/Difficulty "How is difficulty stored in blocks?"
– Zergatul – 2018-05-28T11:23:04.887Please let me know what formula you have used to calculate the difficulty. – Shubham – 2018-05-28T11:24:39.703
new_diff = old_diff * ratio– Zergatul – 2018-05-28T11:28:19.4571I think the question is about how difficulty is calculated from bits, not about how the difficulty is actually determined from previous block timestamps. – Nate Eldredge – 2018-05-28T14:54:35.793
1@Shubham oh, sorry, I updated the answer. – Zergatul – 2018-05-28T16:06:57.863
@Zergatul Thanks you so much for your great help. I really appreciate it. – Shubham – 2018-05-29T05:35:05.037
@Zergatul Can you please let me know how to convert the '0x0000000013ec5300000000000000000000000000000000000000000000000000' floating point number into decimal. ? Any online conversion link would really help me. – Shubham – 2018-05-29T06:07:12.830
@Shubham I prefer to use programming languages, for example in javascript:
0x13ec53 * Math.pow(2, 8 * (0x1c - 3)). And result:2.0981516864422112e+66– Zergatul – 2018-05-29T07:36:33.060