Protocol
在 Getwork 中,如何計算 Hash1 的值?
(我知道 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)