日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bitcoin 中的挖矿算法(2) 难度值说明

發布時間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 ):

uint32_t arith_uint256::GetCompact(bool fNegative) const {int nSize = (bits() + 7) / 8;uint32_t nCompact = 0;if (nSize <= 3) {nCompact = GetLow64() << 8 * (3 - nSize);} else {arith_uint256 bn = *this >> 8 * (nSize - 3);nCompact = bn.GetLow64();}// The 0x00800000 bit denotes the sign.// Thus, if it is already set, divide the mantissaby 256 and increase the exponent.if (nCompact & 0x00800000) {nCompact >>= 8;nSize++;}assert((nCompact & ~0x007fffff) == 0);assert(nSize < 256);nCompact |= nSize << 24;nCompact |= (fNegative && (nCompact & 0x007fffff) ? 0x00800000 : 0);return nCompact; }

參考

[1]. s1mple 比特幣源碼閱讀-神奇的nBits

總結

以上是生活随笔為你收集整理的Bitcoin 中的挖矿算法(2) 难度值说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。