Address
對字節序感到困惑:如何計算 base58 地址的公鑰的 HASH160?
給定地址如下:
> 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
問題是我無法從
pubkey
toHASH160(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
如果沒有看到您正在使用的實際程式碼,我顯然無法告訴您您做錯了什麼,但它不能與此程式碼的功能完全相同。