Hash

使用 SHA256/RIPEMD160 複製 Hash160

  • November 7, 2022

我有一個關於 Hash160 的愚蠢問題(特別是從公鑰到 Hash160)。

如果我使用公鑰:04ce0ed35340803b0c21f2f7f5d5ab9d687e5fa95a79471c9b5c9d97a0bb170eac1045230cc51d13b85a5f64feb80f8fc19358a396797926e3f8079d49066b1b

我通過一個 hash160 計算器(https://www.btcschools.net/bitcoin/bitcoin_tool_hash160.php)執行它,我得到一個 Hash160:1558c7cd9825447a31990ff964f347bb2dbfe9be

這是正確的 Hash160(根據其他可信來源)。

我正在嘗試手動完成 Hash160 步驟(只是為了學習)。我的理解是 Hash160 只是通過 SHA256 執行公鑰,然後通過 RIPEMD160 執行該輸出。但是,當我嘗試通過通過 SHA256 然後執行 RIPEMD160 執行該公鑰來重新創建正確的 Hash160 輸出時(例如,使用線上計算器,雖然我已經嘗試過其他計算器並通過 python 來控制二進制/十六進制編碼),我得到 SHA256 輸出:a5d0a142f10031f9e2d3f806f4845005cd5b3b2722c335d5a352c268a0ee1ec9。然後,當我通過 RIPEMD160 執行它時,我會得到其他輸出(取決於進入 RIPEMD 的內容,比如它是十六進制還是二進製或其他)。

但它們都不是我期待的 Hash160 輸出。我猜我錯過了一些步驟……我需要先對公鑰做任何事情嗎?或者在通過 SHA256 或 RIPEMD160 或其他東西執行它之後做些什麼?

只是真的不知道為什麼我能找到的每個來源都說 Hash160 只是 RIPEMD160(SHA256( publicKey )) 但是在嘗試手動執行此操作時該路徑似乎不起作用。

我找到了這篇文章(OP_HASH160: Computing script hash in a specific P2SH transaction)但我已經通過 python hashlib 嘗試了所有我能想到的二進制和十六進制排列(嘗試了所有二進制輸入,所有雜湊輸入,一些雜湊輸入一些二進製文件等)

任何幫助都會很棒,謝謝!!

您可能應該包含您的非工作 Python 程式碼,以便 Pythonistas 可以辨識您出錯的地方。

一個常見的錯誤是沒有首先將十六進製表示轉換回原始的不可列印數據值。

你的理論是正確的…

輸出:

1558c7cd9825447a31990ff964f347bb2dbfe9be

go中的原始碼:

package main

import (
   "crypto/sha256"
   "encoding/hex"
   "fmt"

   "golang.org/x/crypto/ripemd160"
)

func main() {

   pubKeyHex := "04ce0ed35340803b0c21f2f7f5d5ab9d687e5fa95a79471c9b5c9d97a0bb170eac1045230cc51d13b85a5f64feb80f8fc19358a396797926e3f89d49066b1abc07"
   pubKey, err := hex.DecodeString(pubKeyHex)
   check(err)

   hasher256 := sha256.New()
   hasher256.Write(pubKey)
   hash256 := hasher256.Sum(nil)

   hasher160 := ripemd160.New()
   hasher160.Write(hash256)
   hash160 := hasher160.Sum(nil)

   fmt.Printf("%x", hash160)
}

func check(err error) {
   if err != nil {
       panic(err)
   }
}

查看執行在https://go.dev/play/p/wNZzCv6l3tU的程式碼

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