как сгенерировать адрес bech32 / segwit из pubkey в golang

Aug 20 2020

Я пытаюсь сгенерировать адрес bech32 / segwit в golang с помощью следующего кода:

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/. Что не так с приведенным выше кодом или как правильно получить адрес 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()