BIP-44 — это криптографический протокол, известный как «Предложение по улучшению Биткойна 44», который предлагает детерминированную архитектуру кошелька для генерации нескольких криптовалютных адресов и пар ключей. Ниже приводится подробное введение в BIP-44:
BIP-44 был предложен для решения некоторых проблем в традиционных биткойн-кошельках, особенно для резервного копирования кошельков, Мультивалютная поддержка и иерархическая определенность (HD, Hierarchical Детерминированная) структура кошелька. Традиционные биткойн-кошельки используют протокол BIP-32 для генерации адресов и закрытых ключей для одной валюты, а BIP-44 дополнительно расширен для поддержки нескольких валют.
m / purpose' / coin_type' / account' / change / address_index
,который содержит Сгенерировать адрес и закрытый ключ Вся необходимая информация.purpose
:фиксированный к44(жестко закодированный),Указывает на использование протокола BIP-44.coin_type
:Указывает тип валюты,Например, биткойн равен 0.,Эфириуму 60.account
:Индекс аккаунта,Указывает конкретный аккаунт.change
:Различение внешних адресов(0)и внутренний адрес(1),Используется для различения доходов и смены адресов.address_index
:индекс адреса,Используется для генерации определенных адресов.BIP-44Важной особенностью является поддержка нескольких валют.。используя разныеcoin_type
,Могут быть получены адреса и закрытые ключи для различных криптовалют. Например,Bitcoinиспользоватьcoin_type
для0,Эфириум использует 60,Litecoin использует 2,И так далее. Такая конструкция позволяет использовать одно основное начальное число для создания кошельков для нескольких валют.,Пользователям удобно управлять несколькими криптовалютами и создавать их резервные копии.
BIP-44 использует многоуровневый детерминированный подход,Все адреса и закрытые ключи, сгенерированные из одного начального числа, гарантированно могут быть полностью восстановлены из начального числа. Такая структура имеет существенные преимущества с точки зрения безопасного резервного копирования, мультивалютной поддержки и удобства эксплуатации.,Поэтому он широко используется в современных криптовалютных кошельках.
Реализация протокола BIP-44 на языке Go в основном включает в себя следующие шаги:
BIP-44 построен на основе BIP-32 (иерархические детерминированные кошельки), поэтому сначала необходимо реализовать протокол BIP-32 для генерации пары иерархических ключей (открытый ключ и закрытый ключ).
На языке Go для реализации BIP-32 можно использовать некоторые библиотеки криптовалют с открытым исходным кодом, например github.com/btcsuite/btcutil/hdkeychain
。Эта библиотека предоставляетBIP-32Возможности получения и управления ключами。
import (
"github.com/btcsuite/btcutil/hdkeychain"
)
// Пример: создание главного секретного ключа из начального числа
func generateMasterKey(seed []byte) (*hdkeychain.ExtendedKey, error) {
masterKey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams)
if err != nil {
return nil, err
}
return masterKey, nil
}
// Пример: получение дочернего закрытого ключа из главного закрытого ключа.
func deriveChildKey(masterKey *hdkeychain.ExtendedKey, path string) (*hdkeychain.ExtendedKey, error) {
segments := strings.Split(path, "/")
var key *hdkeychain.ExtendedKey
for _, segment := range segments {
if segment == "m" {
continue
}
var index uint32
if strings.HasSuffix(segment, "'") {
index = hdkeychain.HardenedKeyStart
segment = strings.TrimSuffix(segment, "'")
}
i, err := parseUint32(segment)
if err != nil {
return nil, err
}
index += i
key, err = masterKey.Derive(index)
if err != nil {
return nil, err
}
}
return key, nil
}
BIP-44 определяет стандартный формат путей деривации для получения адресов и закрытых ключей для конкретной валюты из начального числа. В языке Go его необходимо получить в соответствии с форматом пути, указанным в BIP-44:
// Пример: Путь деривации для BIP-44
func bip44DerivationPath(coinType uint32, accountIndex uint32) string {
return fmt.Sprintf("m/44'/%d'/%d'", coinType, accountIndex)
}
Получив производный субчастный ключ, вы можете сгенерировать соответствующий адрес и закрытый ключ. Разные криптовалюты могут иметь разные методы генерации адресов, и для обработки этой части логики обычно необходимо использовать соответствующие библиотеки.
// Пример: Сгенерировать адрес и закрытый ключ
func generateAddressAndPrivateKey(childKey *hdkeychain.ExtendedKey) (string, []byte, error) {
privKey, err := childKey.ECPrivKey()
if err != nil {
return "", nil, err
}
pubKey := privKey.PubKey()
address := pubKey.Address()
privateKeyBytes := privKey.Serialize()
return address.String(), privateKeyBytes, nil
}
Вот простой пример, показывающий, как сгенерировать адрес BIP-44 и закрытый ключ для Биткойна (coinType=0):
package main
import (
"fmt"
"strings"
"github.com/btcsuite/btcd/btcutil/hdkeychain"
"github.com/btcsuite/btcd/chaincfg"
"github.com/tyler-smith/go-bip39"
)
func generateMasterKey(seed []byte) (*hdkeychain.ExtendedKey, error) {
masterKey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams)
if err != nil {
return nil, err
}
return masterKey, nil
}
func deriveChildKey(masterKey *hdkeychain.ExtendedKey, path string) (*hdkeychain.ExtendedKey, error) {
segments := strings.Split(path, "/")
var key *hdkeychain.ExtendedKey
for _, segment := range segments {
if segment == "m" {
continue
}
var index uint32
if strings.HasSuffix(segment, "'") {
index = hdkeychain.HardenedKeyStart
segment = strings.TrimSuffix(segment, "'")
}
i, err := parseUint32(segment)
if err != nil {
return nil, err
}
index += i
key, err = masterKey.Derive(index)
if err != nil {
return nil, err
}
}
return key, nil
}
// parseUint32 Разобрать строку на uint32
func parseUint32(s string) (uint32, error) {
var n uint32
_, err := fmt.Sscanf(s, "%d", &n)
return n, err
}
func bip44DerivationPath(coinType uint32, accountIndex uint32) string {
return fmt.Sprintf("m/44'/%d'/%d'", coinType, accountIndex)
}
func generateAddressAndPrivateKey(childKey *hdkeychain.ExtendedKey) (string, []byte, error) {
privKey, err := childKey.ECPrivKey()
if err != nil {
return "", nil, err
}
pubKey, err := childKey.Neuter()
if err != nil {
return "", nil, err
}
address, err := pubKey.Address(&chaincfg.MainNetParams)
if err != nil {
return "", nil, err
}
privateKeyBytes := privKey.Serialize()
return address.String(), privateKeyBytes, nil
}
func generateSeed() ([]byte, error) {
entropy, err := bip39.NewEntropy(256)
if err != nil {
return nil, err
}
mnemonic, err := bip39.NewMnemonic(entropy)
if err != nil {
return nil, err
}
seed := bip39.NewSeed(mnemonic, "your_passphrase")
return seed, nil
}
func main() {
// 1. Создать семя
seed, _ := generateSeed()
// 2. Создать главный закрытый ключ
masterKey, _ := generateMasterKey(seed)
// 3. Получить путь BIP-44
coinType := uint32(0) // Bitcoin
accountIndex := uint32(0) // Account 0
path := bip44DerivationPath(coinType, accountIndex)
// 4. Получить дочерний закрытый ключ
childKey, _ := deriveChildKey(masterKey, path)
// 5. Сгенерировать адрес и закрытый ключ
address, privateKeyBytes, _ := generateAddressAndPrivateKey(childKey)
fmt.Printf("BIP-44 Address: %s\n", address)
fmt.Printf("Private Key (hex): %x\n", privateKeyBytes)
}
В этом примере показано, как использовать язык Go и библиотеку btcsuite для реализации протокола BIP-44 и генерации биткойн-адреса и закрытого ключа. В практических приложениях логика генерации путей и адресов может быть скорректирована в соответствии с конкретными потребностями и типами валют.