Bitcoin 中的挖矿算法(2) 难度值说明
1. Bitcoin的難度值
定義創世區塊中的 target, 其 difficulty = 1既是規定一個256位的整數0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(56個F+8個0=64位)
為難度“1”,在當時的全網算力下大約需要10分鐘左右的哈希計算工作量才可以滿足小于等于這個數這一規則
2. 壓縮標記
class CBlockIndex{uint32_t nBits;... }最高位的1個字節代表指數(exponent),低位的3個字節代表系數(coefficient),這個記法將工作量證明的target表示為系數/指數(coefficient/exponent)的格式。
計算難度目標target的公式為:target = coefficient * 2^(8 * (exponent – 3))
eg. 創世區塊中難度值為0x1d00ffff,實際值是:
0x00ffff * 2^(8*(0x1d - 3)) = 0x00ffff * 2^(8*26) 0x00000000FFFF0000000000000000000000000000000000000000000000000000(FFFF后面52個0,共8+4+52=64個16進制數) 注:0x1d = 29即 0x00000000ffff0000000000000000000000000000000000000000000000000000 。也就是說,為了構建下一個合法區塊,需要不斷對塊頭做 SHA256 運算,直到找到一個區塊頭的 Hash 結果,前 32 位的值均為 0(小于target)
2.1 由無符號的32位整數nBits轉為難度值的函數
(如:0x1903a30c 轉為 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 由難度值轉為無符號的32位整數nBits的函數
(如:0x0000000000000003A30C00000000000000000000000000000000000000000000 轉為 0x1903a30c ):
參考
[1]. s1mple 比特幣源碼閱讀-神奇的nBits
總結
以上是生活随笔為你收集整理的Bitcoin 中的挖矿算法(2) 难度值说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bitcoin 中的挖矿算法(1) 难度
- 下一篇: Bitcoin 中的挖矿算法(3) 挖矿