Golangのpubkeyからbech32 / segwitアドレスを生成する方法

Aug 20 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私が取得したbip84アドレスと一致しませんhttps://iancoleman.io/bip39/。上記のコードの何が問題になっていますか、またはpubキーからbech32アドレスを適切に取得する方法は何ですか?

同じ質問について別の投稿を調べましたが、golangで必要なデータを準備する方法がわかりませんでした。具体的には、[]byte呼び出す入力の準備bech32.Encode()とbech32.ConvertBits()。の使用に混乱しています。

回答

tbraden Sep 02 2020 at 09:42

modood / btckeygenのおかげで答えを見つけました。

これは、リポジトリから抽出された関連コードです。

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