Введение в БИП-44
Введение в БИП-44

BIP-44 — это криптографический протокол, известный как «Предложение по улучшению Биткойна 44», который предлагает детерминированную архитектуру кошелька для генерации нескольких криптовалютных адресов и пар ключей. Ниже приводится подробное введение в BIP-44:

Предыстория и цель

BIP-44 был предложен для решения некоторых проблем в традиционных биткойн-кошельках, особенно для резервного копирования кошельков, Мультивалютная поддержка и иерархическая определенность (HD, Hierarchical Детерминированная) структура кошелька. Традиционные биткойн-кошельки используют протокол BIP-32 для генерации адресов и закрытых ключей для одной валюты, а BIP-44 дополнительно расширен для поддержки нескольких валют.

Ключевые понятия

  1. Иерархическая детерминированная (HD) структура кошелька:BIP-44на основеBIP-32,Позволяет создавать иерархические адреса и секретные ключи из одного начального числа. Это означает, что одно начальное число может быть использовано для создания основного кошелька.,Это упрощает резервное копирование и управление.
  2. Путь вывода: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 в основном включает в себя следующие шаги:

1. Внедрить генерацию иерархических ключей с помощью BIP-32.

BIP-44 построен на основе BIP-32 (иерархические детерминированные кошельки), поэтому сначала необходимо реализовать протокол BIP-32 для генерации пары иерархических ключей (открытый ключ и закрытый ключ).

На языке Go для реализации BIP-32 можно использовать некоторые библиотеки криптовалют с открытым исходным кодом, например github.com/btcsuite/btcutil/hdkeychain。Эта библиотека предоставляетBIP-32Возможности получения и управления ключами。

Язык кода:go
копировать
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
}

2. Внедрить путь развития BIP-44.

BIP-44 определяет стандартный формат путей деривации для получения адресов и закрытых ключей для конкретной валюты из начального числа. В языке Go его необходимо получить в соответствии с форматом пути, указанным в BIP-44:

Язык кода:go
копировать
// Пример: Путь деривации для BIP-44
func bip44DerivationPath(coinType uint32, accountIndex uint32) string {
    return fmt.Sprintf("m/44'/%d'/%d'", coinType, accountIndex)
}

3. Сгенерируйте адрес и закрытый ключ.

Получив производный субчастный ключ, вы можете сгенерировать соответствующий адрес и закрытый ключ. Разные криптовалюты могут иметь разные методы генерации адресов, и для обработки этой части логики обычно необходимо использовать соответствующие библиотеки.

Язык кода:go
копировать
// Пример: Сгенерировать адрес и закрытый ключ
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):

Язык кода:go
копировать
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 и генерации биткойн-адреса и закрытого ключа. В практических приложениях логика генерации путей и адресов может быть скорректирована в соответствии с конкретными потребностями и типами валют.

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода