Block

為什麼我們要反轉區塊頭的雜湊?

  • March 4, 2018

讓我們在 Python 中選擇這個範例塊頭雜湊:

from hashlib import sha256
import hashlib
header = "0000002066720b99e07d284bd4fe67ff8c49a5db1dd8514fcdab610000000000000000007829844f4c3a41a537b3131ca992643eaa9d093b2383e4cdc060ad7dc548118751eb505ac1910018de19b302".decode('hex')
print sha256(sha256(header).digest()).digest()[::-1].encode('hex')
// result is 00000000000000000020cf2bdc6563fb25c424af588d5fb7223461e72715e4a9

我知道它是協議的一部分,否則將不會接受一個塊,但是:

  1. 為什麼我們不接受以所有這些零結尾的雜湊?是因為程序更容易計算if hash < expected_hash嗎?
  2. 但是在這種情況下,我不明白為什麼我們不簡單地接受sha256(sha256(header).digest()).digest().encode('hex')低於預期雜湊值的雜湊值?得到它的機率應該和倒數一樣高。

那麼反轉的原因是什麼呢?

  1. 為什麼我們不接受以所有這些零結尾的雜湊?是因為程序更容易計算if hash < expected_hash嗎?

計算前導零或尾隨零的數量不會給出很多粒度。如果表示為十六進制數,那麼如果您只計算零的數量,則只有 64 個可能的目標值。如果是二進制,則有 256 個可能的值。此外,計算零的數量意味著您只能將難度更改為 2 的某個冪(在二進制中,難度必須加倍或減半)。因此,目標的值並不多,這種粒度損失是不好的。

相反,比較值意味著(理論上)有 2^256 個可能的難度值。這更加精細,這些值是整數。不必通過乘法來改變難度,而是可以通過加法和減法來改變難度。通過具有更多的值,難度將不太可能太難或太容易。

  1. 但是在這種情況下,我不明白為什麼我們不簡單地接受sha256(sha256(header).digest()).digest().encode('hex')低於預期雜湊值的雜湊值?得到它的機率應該和倒數一樣高。

其實就像你說的那樣。雜湊的反轉僅適用於字節的實際表示方式。它們被儲存為字節並被解釋為一個小端序的 256 位整數。比較仍然是整數比較,數據表示是無關緊要的(它們可以很容易地儲存和表示為大端整數)。但是當它們顯示時,它們以十六進制顯示為大端值,因為人類習慣於大端。little endian 的原因很可能是因為 x86 架構使用 little endian 來儲存整數。

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