python環境挖礦
A. 挖礦難度表示
比特幣的挖礦難度可以使用Target Threshold,nBits或Difficulty表示,它們互相等價:
這三個值的轉化關系可以採用下面的實例來說明:
首先獲取哈希值為 的區塊原生十六進制信息如下:
區塊中nBits採用小端格式表示,解析區塊信息,得到nBits欄位值為0x4c86041b。因此轉化為大端格式為0x1B04864C,這個值是Target Threshold的壓縮格式表示,可以將它轉化成256位的Target Threshold值:
開頭的一個位元組為指數,後面三個位元組為系數,則:
計算出Target Threshold值為 。
再計算Difficulty的值,它有兩個值,計算公式分別為:
由此可以使用 Python 計算出bdiff的值:
因此,得到在比特幣客戶端中的difficulty值bdiff為14484.162361225399。
為了檢驗上述結果,可以在比特幣核心客戶端中使用 getblock "" 命令得到該區塊的json格式信息:
最終,可以發現該區塊的bits和difficulty欄位信息與上面分析計算的相關結果一致。
nBits的大端格式表示法中,其系數最大為0x7fffff,這是因為Target Threshold數據類型是無符號整型,而它繼承自有符號數據類,則在實際中Target Threshold系數的最高位有可能是1,這可能會被解析成一個負數。則在挖礦過程中難度值永遠無法小於一個負數。因此,為了解決這個問題,比特幣核心在生成nBits值時需要首先檢查一下生成的nBits是否會被解析為一個負數。如果是,首先在系數開頭補8位0,即除以256,然後指數再加上1。這樣由nBits轉化為Target Threshold過程中轉化公式就與普通值相同了,即指數位都是減去3,轉化過程上面已經提到。
舉個例子說明:
哈希值為 的區塊信息如下:
發現bdiff值為1,則利用bdiff與Target Threshold關系可以計算出:
將Target Threshold值 轉化為nBits的過程中可以發現其系數為0xffff00,指數為0x1c,這樣:
然而由於系數最高位為1,則如果這樣表示的話就可能將Target Threshold解析為負數。因此,我們將系數除以256,指數加上1,得到系數為0x00ffff,指數為0x1d。這樣:
最終,nBits值為0x1d00ffff(大端表示),與json格式信息一致。