Skip to content

Instantly share code, notes, and snippets.

@luoqeng
Last active November 3, 2020 01:50
Show Gist options
  • Save luoqeng/dace8738207ba418f3cfc9fb43ab76dd to your computer and use it in GitHub Desktop.
Save luoqeng/dace8738207ba418f3cfc9fb43ab76dd to your computer and use it in GitHub Desktop.
package main
import (
"encoding/hex"
"fmt"
"log"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcutil"
"github.com/btcsuite/btcutil/hdkeychain"
"github.com/tyler-smith/go-bip32"
"github.com/tyler-smith/go-bip39"
"github.com/tyler-smith/go-bip39/wordlists"
)
func main() {
// Generate a mnemonic for memorization or user-friendly seeds
bip39.SetWordList(wordlists.ChineseSimplified)
entropy, _ := bip39.NewEntropy(160)
mnemonic, _ := bip39.NewMnemonic(entropy)
// Generate a Bip32 HD wallet for the mnemonic and a user supplied password
seed := bip39.NewSeed(mnemonic, "password")
// Generate a new master node using the seed.
rootKey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams)
if err != nil {
log.Fatalln(err)
}
// m/0H
m_0H, err := rootKey.Child(hdkeychain.HardenedKeyStart + 0)
if err != nil {
log.Fatalln(err)
}
// m/0H/0H
m_0H_0H, err := m_0H.Child(hdkeychain.HardenedKeyStart + 0)
if err != nil {
log.Fatalln(err)
}
// m/0H/0H/0H
m_0H_0H_0H, err := m_0H_0H.Child(hdkeychain.HardenedKeyStart + 0)
if err != nil {
log.Fatalln(err)
}
// m/0H/0H/0
m_0H_0H_0, err := m_0H_0H.Child(0)
if err != nil {
log.Fatalln(err)
}
pubKey, err := m_0H_0H_0.ECPubKey()
if err != nil {
log.Fatalln(err)
}
// m/0H/0H
m_0H_0HPub, err := m_0H_0H.Neuter()
if err != nil {
log.Fatalln(err)
}
// m/0H/0H/0
m_0H_0H_0Pub, err := m_0H_0HPub.Child(0)
if err != nil {
log.Fatalln(err)
}
pubKey1, err := m_0H_0H_0Pub.ECPubKey()
if err != nil {
log.Fatalln(err)
}
rootKey2, err := bip32.NewMasterKey(seed)
if err != nil {
log.Fatalln(err)
}
// m/0H
m2_0H, err := rootKey2.NewChildKey(hdkeychain.HardenedKeyStart + 0)
if err != nil {
log.Fatalln(err)
}
// m/0H/0H
m2_0H_0H, err := m2_0H.NewChildKey(hdkeychain.HardenedKeyStart + 0)
if err != nil {
log.Fatalln(err)
}
// m/0H/0H/0H
m2_0H_0H_0H, err := m2_0H_0H.NewChildKey(hdkeychain.HardenedKeyStart + 0)
if err != nil {
log.Fatalln(err)
}
m_0H_0H_0HAddr, err := m_0H_0H_0H.Address(&chaincfg.MainNetParams)
if err != nil {
log.Fatalln(err)
}
m2_0H_0H_0HAddr, err := btcutil.NewAddressPubKeyHash(btcutil.Hash160(m2_0H_0H_0H.PublicKey().Key), &chaincfg.MainNetParams)
if err != nil {
log.Fatalln(err)
}
m_0H_0H_0Addr, err := m_0H_0H_0.Address(&chaincfg.MainNetParams)
if err != nil {
log.Fatalln(err)
}
priv, err := m_0H_0H_0H.ECPrivKey()
if err != nil {
log.Fatalln(err)
}
wif, err := btcutil.NewWIF(priv, &chaincfg.MainNetParams, true)
if err != nil {
log.Fatalln(err)
}
fmt.Printf("Mnemonic: %s\n", mnemonic)
fmt.Printf("Seed: %s\n", hex.EncodeToString(seed))
fmt.Printf("Master private key: %s\n", rootKey)
fmt.Printf("Master private key: %s\n", rootKey2)
fmt.Printf("m/0'/0' priv: %s\n", m_0H_0H)
fmt.Printf("m/0'/0' priv: %s\n", m2_0H_0H)
fmt.Printf("m/0'/0'/0' wif: %s\n", wif)
fmt.Printf("m/0'/0'/0' priv: %s\n", m_0H_0H_0H)
fmt.Printf("m/0'/0'/0' priv: %s\n", m2_0H_0H_0H)
fmt.Printf("m/0'/0'/0' addr: %s\n", m_0H_0H_0HAddr)
fmt.Printf("m/0'/0'/0' addr: %s\n", m2_0H_0H_0HAddr)
fmt.Printf("m/0'/0'/0' pub: %x\n", m2_0H_0H_0H.PublicKey().Key)
fmt.Println("-----------------------------------------------")
fmt.Printf("m/0'/0'/0 priv: %s\n", m_0H_0H_0)
fmt.Printf("m/0'/0'/0 addr: %s\n", m_0H_0H_0Addr)
fmt.Printf("m/0'/0'/0 pub: %x\n", pubKey.SerializeCompressed())
fmt.Printf("m/0'/0'/0 pub: %x\n", pubKey1.SerializeCompressed())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment