Bitcoin-Core
在regtest中計算塊雜湊不同?
我能夠計算主網和測試網中的塊雜湊,但我在 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 位。