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

Aug 20 2020

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 segwitaddrgenerados coincide con la dirección bip84 que obtuvehttps://iancoleman.io/bip39/. ¿Qué está mal con el código anterior o cómo obtener correctamente una dirección bech32 de una clave de publicación?

Revisé otra publicación sobre la misma pregunta, pero no pude encontrar la forma de 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

tbraden Sep 02 2020 at 09:42

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