cómo generar la dirección bech32/segwit desde pubkey en golang

Estoy tratando de generar la dirección bech32/segwit en golang con el siguiente código:

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)
}

y también más simple

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)
}

Pero ninguno de los dos segwitaddrgeneró una coincidencia con la dirección bip84 que obtuve de https://iancoleman.io/bip39/ . ¿Qué tiene de malo el código anterior o cómo obtener correctamente una dirección bech32 de una clave de pub?

Miré otra publicación sobre la misma pregunta, pero no pude descubrir cómo preparar los datos necesarios en golang. Más específicamente, estoy confundido al preparar la entrada []bytepara llamar bech32.Encode()y usar bech32.ConvertBits().

Respuestas (1)

He encontrado la respuesta gracias a modood/btckeygen .

Aquí está el código relevante extraído del repositorio.

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