come generare l'indirizzo bech32 / segwit da pubkey in golang

Aug 20 2020

Sto cercando di generare l'indirizzo bech32 / segwit in golang con il seguente codice:

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

e anche più semplicemente

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

Ma nessuno dei due segwitaddrgenerati corrisponde all'indirizzo bip84 da cui ho ricevutohttps://iancoleman.io/bip39/. Cosa c'è di sbagliato nel codice sopra o come ottenere correttamente un indirizzo bech32 da una chiave pub?

Ho esaminato un altro post sulla stessa domanda, ma non sono riuscito a capire come preparare i dati necessari in Golang. Più specificamente, sono confuso nella preparazione dell'input []byteda chiamare bech32.Encode()e nell'uso bech32.ConvertBits().

Risposte

tbraden Sep 02 2020 at 09:42

Ho trovato la risposta grazie a modood / btckeygen .

Ecco il codice pertinente estratto dal repo.

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