Block
對哪些數據進行散列以產生塊散列?
塊中的哪些項目被包含在經過雜湊處理以產生塊雜湊的數據中?
在Mastering Bitcoin中有這張圖表顯示了包含的數據:
上一個塊頭雜湊
時間戳
難度
隨機數
默克爾根
其他來源表明,塊頭的版本號也包含在散列數據中。
與目標大致相反的難度是一種稱為“位”的緊湊表示。
Merkle 根是從交易數據的雜湊以樹狀方式生成的雜湊。
有關的:
- 根雜湊和塊雜湊有什麼區別?
- 塊散列算法(wiki)
- 區塊鏈(開發者參考)
同意@RedGrittyBrick。我想讓它更清楚。版本號也包括在內。
所有六個參數都按下面列出的順序簡單地連接,但要注意數據類型(int 或 string)和字節順序(little-endian 或 big-endian),正確的順序是:
- 版本
- 前一個區塊頭雜湊
- 默克爾根
- 時間戳
- 比特(難度)
- 大使
這是一個帶有註釋的 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