Protocol

在 Getwork 中,如何計算 Hash1 的值?

  • February 11, 2012

(我知道 hash1 和 midstate 最終會被棄用,但我對它們有點好奇)

在 Getwork 中有一個欄位 hash1。從對 bitcoind 的範例呼叫中,我收到了它的值:

'hash1': '00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000'

hash1 的值究竟是如何計算的?

hash1 是一個 uint256 零,通過 main.cpp 中的 FormatHashBlocks() 填充到 64 字節的倍數,然後以 4 字節塊反轉。

FormatHashBlocks() 在 32 個零字節之後放置一個 0x80,並在末尾放置一個 4 字節的位數(00 00 01 00,表示 256 位)。

the uint256 zero is:
0000000000000000 0000000000000000 0000000000000000 0000000000000000

it's padded to 64 bytes:
0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000
                                                                   ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
has the 80 in the first byte of padding:
0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000
                                                                   ^^
and the length at the end:
0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000100
                                                                                                                              ^^^^^^^^
and then has each group of 4 bytes reversed: 12 34 56 78 -> 78 56 34 12
0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000008000000000 0000000000000000 0000000000000000 0000000000010000
                                                                   ^^^^^^^^                                                   ^^^^^^^^

一個更好的問題可能是“為什麼 hash1 的值是這樣計算的”?

您沒有問,但data返回的欄位getwork格式相同。輸入不是 uint256 零,而是:

  • 版本(4 字節)
  • 前一個區塊的雜湊(32 字節)
  • 默克爾根(32 字節)
  • 時間(4 個字節)
  • 位(與難度有關)(4 個字節)
  • 隨機數(4 字節)

總共 80 個字節,由 FormatHashBlocks() 填充到 128 個字節。

例子:

00000001 (version)
0863bcb701d52fea 0e0c7b0d4696d7e7 8feb125a84e0911b 0000043e00000000 (prev hash)
bc656fe91e44907c 32d1704f900bd7a6 c2fa06386174477f a8b145addebc8d00 (merkle root)
4f35dde3 (time)
1a0c290b (bits)
00000000 (nonce)
0000008000000000 0000000000000000 0000000000000000 } (padding)
0000000000000000 0000000000000000 0000000080020000 } (80 bytes = 640 bits = 0x280)

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