cara menghasilkan alamat bech32 / segwit dari pubkey di golang

Aug 20 2020

Saya mencoba menghasilkan alamat bech32 / segwit di golang dengan kode berikut:

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

dan juga lebih sederhana

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

Tapi tidak ada yang segwitaddrcocok dengan alamat bip84 yang saya dapatkanhttps://iancoleman.io/bip39/. Apa yang salah dengan kode di atas atau bagaimana cara mendapatkan alamat bech32 dengan benar dari kunci pub?

Saya telah melihat ke posting lain tentang pertanyaan yang sama, tetapi tidak dapat menemukan cara menyiapkan data yang dibutuhkan di golang. Lebih spesifiknya, saya bingung mempersiapkan input yang []byteakan ditelepon bech32.Encode()dan digunakan bech32.ConvertBits().

Jawaban

tbraden Sep 02 2020 at 09:42

Saya telah menemukan jawabannya berkat modood / btckeygen .

Berikut adalah kode relevan yang diekstrak dari repo.

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