วิธีสร้างที่อยู่ 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

นี่คือรหัสที่เกี่ยวข้องที่ดึงมาจาก repo

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