Bitcoin-Core

在regtest中計算塊雜湊不同?

  • September 4, 2020

我能夠計算主網和測試網中的塊雜湊,但我在 regtest 中沒有得到正確的雜湊。我鑄造了 +3000 塊,我得到了高度為 3000 的塊

bitcoin-cli getblock $(bitcoin-cli getblockhash 3000)                                   

{
 "hash": "4221d8b10b0a7eb5e050337c76819abf71113f17e266e88cb12df4bf5ce24b55",
 "confirmations": 502,
 "strippedsize": 215,
 "size": 251,
 "weight": 896,
 "height": 3000,
 "version": 536870912,
 "versionHex": "20000000",
 "merkleroot": "23b4600b467f18ef0ec18bd73a9b921077486cf67c44c912de114888db184bf9",
 "tx": [
   "23b4600b467f18ef0ec18bd73a9b921077486cf67c44c912de114888db184bf9"
 ],
 "time": 1599147354,
 "mediantime": 1599147353,
 "nonce": 0,
 "bits": "207fffff",
 "difficulty": 4.656542373906925e-10,
 "chainwork": "0000000000000000000000000000000000000000000000000000000000001772",
 "nTx": 1,
 "previousblockhash": "4776b1ccad27e2de9ccbdc5bf4ad4d972a89e27a020db1f7b59abb857d77f3be",
 "nextblockhash": "121512fc6bc1395ada64a6c63ba2c2955ad9cc240a1fc0282b95cf2c2651b381"
}

現在我將值保存在 env 變數中

ver=`printf 20000000 | tac -rs ..| tr -d '\n'`
prev=`printf 4776b1ccad27e2de9ccbdc5bf4ad4d972a89e27a020db1f7b59abb857d77f3be | tac -rs .. | tr -d '\n'`
mkl=`printf 23b4600b467f18ef0ec18bd73a9b921077486cf67c44c912de114888db184bf9 | tac -rs .. | tr -d '\n'`
time=`printf '%x\n' 1599147354 | tac -rs .. | tr -d '\n'`
bits=`echo 207fffff | tac -rs .. | tr -d '\n'`
nonce=`printf '%x\n' 0 | tac -rs .. | tr -d '\n'`

之後我可以連接並獲得小端表示

printf $ver$prev$mkl$time$bits$nonce | xxd -r -p | sha256sum -b | xxd -r -p | sha256sum -b | awk '{printf $1}' | tac -rs ..

結果是:09665bcb63b6c279948f93937669bf1c8f36cffda0646180ba523847cb642384。主網和測試網中的相同操作正常工作。

nonce 需要是 8 個十六進制數字,但printf %x只生成該值所需的最小數字,對於 0,它只有 1 個數字。(其他數字轉換%d %i %u %o也是如此。)您需要使用%08x來強制一個 8 位十六進制值:

ver=$(printf 20000000 | tac -rs ..)
prev=$(printf 4776b1ccad27e2de9ccbdc5bf4ad4d972a89e27a020db1f7b59abb857d77f3be | tac -rs .. )
mkl=$(printf 23b4600b467f18ef0ec18bd73a9b921077486cf67c44c912de114888db184bf9 | tac -rs .. )
time=$(printf %x 1599147354 | tac -rs .. )
#should be %08x if any timestamp can be before mid-1978
bits=$(printf 207fffff | tac -rs .. )
nonce=$(printf %08x 0 | tac -rs .. )
printf $ver$prev$mkl$time$bits$nonce | xxd -r -p | openssl sha256 -binary |
openssl sha256 | awk '{print $2}' | tac -rs..

-->
4221d8b10b0a7eb5e050337c76819abf71113f17e266e88cb12df4bf5ce24b55

其他變化:

  • 您的大多數項目甚至都沒有換行符,對於那些這樣做的項目,它被 丟棄了tac -rs..,因此它們都不需要|tr -d '\n'——儘管為了保持一致性,我刪除了\n某些printf格式的 ,並更改了echo(預設情況下添加換行符)到printf(不是)。(即使/某些/任何項目確實包含換行符,如果你雙引號最終printf "$ver...$nonce"使它們被視為數據而不是單詞拆分,xxd -r -p它們將丟棄它們,就好像它們根本不存在一樣。)
  • 我使用較新的語法$( )進行程序替換,而不是較舊的反引號(我無法在 Stack markdown 中顯示!)因為在許多情況下它具有優勢,儘管不是特別在這裡,而且我喜歡保持一致。(在其他 Stacks 上有幾十個關於此的問題。)
  • 我使用openssl而不是sha256sum因為我的系統上有它,而且它更容易一些。

這在主網和測試網上不是問題,至少對於大多數區塊來說,因為它們的難度足夠高,以至於大多數時候隨機數值至少為 29 位。

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