Address

如何從 golang 中的 pubkey 生成 bech32/segwit 地址

  • September 2, 2020

我正在嘗試使用以下程式碼在 golang 中生成 bech32/segwit 地址:

var pubkey *btcec.PubKey
address, err := btcutil.NewAddressPubKey(pubkey.SerializeCompressed(), chainParams)
if err != nil {
   log.Fatal(err)
}
address.SetFormat(btcutil.PKFCompressed)
bech32Bytes, err := bech32.ConvertBits(address.ScriptAddress(), 8, 5, true)
if err != nil {
   log.Fatal(err)
}
segwitaddr, err := bech32.Encode("tb", bech32Bytes)
if err != nil {
   log.Fatal(err)
}

也更簡單

var e *hdkeychain.ExtendedKey
address, err := e.Address(chainParams)
bech32Bytes, err := bech32.ConvertBits(address.ScriptAddress(), 8, 5, true)
if err != nil {
   log.Fatal(err)
}
segwitaddr, err := bech32.Encode("tb", bech32Bytes)
if err != nil {
   log.Fatal(err)
}

但是segwitaddr生成的都沒有匹配我從<https://iancoleman.io/bip39/>獲得的 bip84 地址。上面的程式碼有什麼問題,或者如何從 pub 密鑰中正確獲取 bech32 地址?

我查看了關於同一問題的另一篇文章,但無法弄清楚如何準備 golang 所需的數據。更具體地說,我在準備[]byte呼叫bech32.Encode()和使用的輸入時感到困惑bech32.ConvertBits()

感謝modood/btckeygen,我找到了答案。

這是從 repo 中提取的相關程式碼。

witnessProg := btcutil.Hash160(pubkey.SerializeCompressed())
addressWitnessPubKeyHash, err := btcutil.NewAddressWitnessPubKeyHash(witnessProg, chainParams)
if err != nil {
   panic(err)
}
address := addressWitnessPubKeyHash.EncodeAddress()

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