Block

對哪些數據進行散列以產生塊散列?

  • August 3, 2021

塊中的哪些項目被包含在經過雜湊處理以產生塊雜湊的數據中?

Mastering Bitcoin中有這張圖表顯示了包含的數據:

塊頭和散列

上一個塊頭雜湊

時間戳

難度

隨機數

默克爾根

其他來源表明,塊頭的版本號也包含在散列數據中。

與目標大致相反的難度是一種稱為“位”的緊湊表示。

Merkle 根是從交易數據的雜湊以樹狀方式生成的雜湊。


有關的:

同意@RedGrittyBrick。我想讓它更清楚。版本號也包括在內。

所有六個參數都按下面列出的順序簡單地連接,但要注意數據類型(int 或 string)和字節順序(little-endian 或 big-endian),正確的順序是:

  1. 版本
  2. 前一個區塊頭雜湊
  3. 默克爾根
  4. 時間戳
  5. 比特(難度)
  6. 大使

這是一個帶有註釋的 Python 程序,用於驗證高度為 2 的塊雜湊

from hashlib import sha256
import struct

# below are the params of Block height 2
ver = 1  # 4 Bytes (32 bits)
prev_block = "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"  # 32 Bytes (256 bits)
mrkl_root =  "9b0fc92260312ce44e74ef369f5c66bbb85848f2eddd5a7a1cde251e54ccfdd5"  # 32 Bytes (256 bits)
time = 1231469744   # 4 Bytes (32 bits)
bits = 486604799    # 4 Bytes (32 bits)
nonce = 1639830024  # 4 Bytes (32 bits)

def deal_str(big_endian):
   return bytes.fromhex(big_endian)[::-1]    # [::-1] will reverse the bytes to little-endian

def deal_int(n):
   # < means "Little-endian"
   # L means "unsigned long"
   return struct.pack("<L", n)

header_bin = deal_int(ver) + deal_str(prev_block) + deal_str(mrkl_root) + deal_int(time) + deal_int(bits) + deal_int(nonce)

hash = sha256(sha256(header_bin).digest()).digest()

cur_block = hash[::-1].hex()   #reverse back to big-endian,  which is block hash.
print(cur_block)  # block hash of block height 2: 000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd

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