Mining-Theory

與目標(位)相比,塊頭雜湊如何?

  • June 1, 2016

我試圖通過做一個塊散列的小例子來了解探勘過程。

根據關於難度的Wiki 條目,可以從標頭的“位”部分讀取塊雜湊的目標,如下所示:在此範例中,位部分是535f0119.

535f0119 * 2**(8*(0x1b - 3))

我的最終目標是:

535f0119000000000000000000000000000000000000000000000000

十進制的目標是:

8780002705592212783085671453687210878315895819816253650256038723584

假設我用目前隨機數得到的雜湊是

4d47599dd86834282a8ae6f20ba454704ddbe6eb23aa31b9fdec97fc7679b559

我現在如何比較雜湊是否小於目標?我與散列有什麼關係才能說“散列<目標”?

如何從位計算目標

讓我們從一個塊頭開始,它總是 80 字節,看起來像這樣:

04000000b9e2784a84e5d2468cee60ad14e08d0fee5dda49a37148040000000000000000e9dd2b13157508891880ef68729a1e5ecdde58062ebfa214a89f0141e5a4717faefd2b577627061880564bec

從 80 字節開始,這些位實際上是第 72 到第 76 字節:

04000000b9e2784a84e5d2468cee60ad14e08d0fee5dda49a37148040000000000000000e9dd2b13157508891880ef68729a1e5ecdde58062ebfa214a89f0141e5a4717faefd2b57**76270618**80564bec

要麼

76270618

然而,這個數字是小端的,所以我們必須反轉字節:

18062776

第一個字節是“指數”

e = 0x18

接下來的 3 個字節是“係數”

c = 0x062776

您將其代入公式:

target = c * 2**(8*(e - 3))

在我們的例子中,即:

target = 0x062776 * 2**(8*(0x18 - 3))

結果是:

0000000000000000062776000000000000000000000000000000000000000000

讓我們使用 Python 2 計算這個塊頭的雜湊值:

from hashlib import sha256
header = "04000000b9e2784a84e5d2468cee60ad14e08d0fee5dda49a37148040000000000000000e9dd2b13157508891880ef68729a1e5ecdde58062ebfa214a89f0141e5a4717faefd2b577627061880564bec".decode('hex')
print sha256(sha256(header).digest()).digest()[::-1].encode('hex')

輸出是

0000000000000000040199a6c7b922f711ee7e98cd58863b8b981b02d2b83e13

您可以將其與目標進行比較

>&gt;&gt; 0x0000000000000000040199a6c7b922f711ee7e98cd58863b8b981b02d2b83e13 &lt; 0x0000000000000000062776000000000000000000000000000000000000000000 
True

這就是我們如何知道一個區塊滿足工作量證明的方式。

引用自:https://bitcoin.stackexchange.com/questions/44579