Bitcoin 中的挖矿算法(2) 难度值说明
1. Bitcoin的難度值
定義創(chuàng)世區(qū)塊中的 target, 其 difficulty = 1既是規(guī)定一個256位的整數(shù)0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(56個F+8個0=64位)
為難度“1”,在當(dāng)時的全網(wǎng)算力下大約需要10分鐘左右的哈希計算工作量才可以滿足小于等于這個數(shù)這一規(guī)則
2. 壓縮標(biāo)記
class CBlockIndex{uint32_t nBits;... }最高位的1個字節(jié)代表指數(shù)(exponent),低位的3個字節(jié)代表系數(shù)(coefficient),這個記法將工作量證明的target表示為系數(shù)/指數(shù)(coefficient/exponent)的格式。
計算難度目標(biāo)target的公式為:target = coefficient * 2^(8 * (exponent – 3))
eg. 創(chuàng)世區(qū)塊中難度值為0x1d00ffff,實際值是:
0x00ffff * 2^(8*(0x1d - 3)) = 0x00ffff * 2^(8*26) 0x00000000FFFF0000000000000000000000000000000000000000000000000000(FFFF后面52個0,共8+4+52=64個16進制數(shù)) 注:0x1d = 29即 0x00000000ffff0000000000000000000000000000000000000000000000000000 。也就是說,為了構(gòu)建下一個合法區(qū)塊,需要不斷對塊頭做 SHA256 運算,直到找到一個區(qū)塊頭的 Hash 結(jié)果,前 32 位的值均為 0(小于target)
2.1 由無符號的32位整數(shù)nBits轉(zhuǎn)為難度值的函數(shù)
(如:0x1903a30c 轉(zhuǎn)為 0x0000000000000003A30C00000000000000000000000000000000000000000000 ):
// This implementation directly uses shifts instead of going // through an intermediate MPI representation. arith_uint256& arith_uint256::SetCompact(uint32_t nCompact,bool* pfNegative, bool* pfOverflow) {int nSize = nCompact >> 24;uint32_t nWord = nCompact & 0x007fffff;if (nSize <= 3) {nWord >>= 8 * (3 - nSize);*this = nWord;} else {*this = nWord;*this <<= 8 * (nSize - 3);}if (pfNegative)*pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0;if (pfOverflow)*pfOverflow = nWord != 0 && ((nSize > 34) ||(nWord > 0xff && nSize > 33) ||(nWord > 0xffff && nSize > 32));return *this; }2.2 由難度值轉(zhuǎn)為無符號的32位整數(shù)nBits的函數(shù)
(如:0x0000000000000003A30C00000000000000000000000000000000000000000000 轉(zhuǎn)為 0x1903a30c ):
參考
[1]. s1mple 比特幣源碼閱讀-神奇的nBits
總結(jié)
以上是生活随笔為你收集整理的Bitcoin 中的挖矿算法(2) 难度值说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bitcoin 中的挖矿算法(1) 难度
- 下一篇: Bitcoin 中的挖矿算法(3) 挖矿