Address

對字節序感到困惑:如何計算 base58 地址的公鑰的 HASH160?

  • June 12, 2022

給定地址如下:

> spend_address=$(btc-cli getnewaddress '' legacy)
> btc-cli getaddressinfo $spend_address

spend_address info {
 "address": "moHaAMoTLRZ7dCyP4SunTBRvSfdFxUNrCe",
 "scriptPubKey": "76a91455391f93c7409df890be2804aa3cf85b22a903c188ac",
 "isscript": false,
 "iswitness": false,
 "pubkey": "03a6a9b25d8cd811af3162222d5e6ddaf876f915ae37ccb4b4b3f2ba56c39e26d2",
 "iscompressed": true,
 ...<stuff not needed for example elided>...
}

所以我們有pubkey= 03a6a9b25d8cd811af3162222d5e6ddaf876f915ae37ccb4b4b3f2ba56c39e26d2

如果我們解碼ScriptPubKey我們會發現HASH160嵌入其中:55391f93c7409df890be2804aa3cf85b22a903c1

問題是我無法從pubkeyto HASH160(pubkey)。在某處我對字節順序感到困惑。(我通過查看錢包getaddressinfo處理程序中的中間結果確定了這一點。)

我試過了:

(ripemd160 (sha256 spend_address_pubkey))
(ripemd160 (sha256 (reversebytes spend_address_pubkey)))
(ripemd160 (reversebytes (sha256 spend_address_pubkey)))
(reversebytes (ripemd160 (sha256 spend_address_pubkey)))
(ripemd160 (reversebytes (sha256 (reversebytes spend_address_pubkey))))

並且這些(或它們的字節反轉!)都不匹配HASH160(pubkey)vout[0].scriptPubKey.asm欄位中的事務。請幫我找到工作的終點!

(我確實知道如何HASH160通過剝離校驗和來直接從地址中獲取。但我想知道如何從 pubkey 中獲取它,考慮到鍵和散列以字節順序顯示的標準方式。)

這裡根本不應該存在字節順序問題。

比特幣對字節序的處理在其人機界面中有時很奇怪(例如,交易和區塊雜湊以相反的順序列印,因為比特幣將它們解釋為小端數字,然後以大端順序列印以供人類消費)。不過,在二進制協議級別或腳本解釋器內部不存在此類問題。

我用這個 Python 程式碼計算了你正確發布的公鑰的Hash160 (它需要成熟的模組,因為最新版本的 Python 不再內置它):

import hashlib
import ripemd160

pubkey = bytes.fromhex("03a6a9b25d8cd811af3162222d5e6ddaf876f915ae37ccb4b4b3f2ba56c39e26d2")
pkhash = ripemd160.ripemd160(hashlib.sha256(pubkey).digest())
print("%s" % pkhash.hex())

輸出:

$ python3 testhash.py 
55391f93c7409df890be2804aa3cf85b22a903c1

如果沒有看到您正在使用的實際程式碼,我顯然無法告訴您您做錯了什麼,但它不能與此程式碼的功能完全相同。

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