MSTR Cat

Блокчейн/Уровень IV · Глубины протокола/4.3 Хранение и приватность/Урок 1

HD-кошельки (BIP32, BIP44, BIP84, BIP86)

Как из одного сида получается целое дерево ключей

МатериалыКошелёк в тестовом режиме (testnet или signet), никогда не настоящий сидHD-кошелёк или инструмент, который показывает пути деривацииБлокнот

Любопытство

  1. Как один сид может порождать практически неограниченное количество уникальных приватных ключей, которые можно восстановить?
  2. Почему утечка одного дочернего приватного ключа вместе с расширенным публичным ключом родителя может раскрыть все ключи в неусиленной (non-hardened) ветке?
  3. Какое структурное различие отделяет legacy-адрес P2PKH от адреса нативного SegWit или Taproot с точки зрения экономии на комиссиях?

Исследование

  1. До появления BIP32, который предложил Питер Вуйле (Pieter Wuille) в 2012 году, кошельки генерировали случайную пару ключей для каждого нового адреса. Резервное копирование кошелька означало хранение каждого приватного ключа по отдельности; потеря одного файла резервной копии делала соответствующие средства невосстановимыми. BIP32 изменил эту модель: теперь из одного мастер-сида выводится детерминированное дерево ключей. Вся финансовая история привязана к этому единственному сиду, который обычно создаётся из 128 или 256 бит энтропии и записывается в виде 12 или 24 слов.
  2. Путь деривации следует структуре, определённой в BIP44 (2014): `m / purpose' / coin_type' / account' / change / index`. Апостроф обозначает усиленную (hardened) деривацию. Это критически важный механизм безопасности. При неусиленной деривации злоумышленник, получивший и родительский расширенный публичный ключ (xpub), и любой один дочерний приватный ключ, может математически вычислить родительский приватный ключ. Усиленная деривация разрывает эту связь: утёкший дочерний приватный ключ в сочетании с xpub ничего не раскрывает о секрете родителя.
  3. BIP44 стандартизировал первые три уровня, чтобы обеспечить поддержку нескольких валют в рамках одной иерархии. Уровень `purpose'` указывает на стандарт (например, 44 для BIP44, 84 для BIP84). Уровень `coin_type'` различает активы; у биткоина индекс 0. Это позволяет управлять разными криптовалютами с одного сида, не смешивая их ключи. Уровень `account'` разделяет средства на отдельные аккаунты, у каждого из которых своя цепочка сдачи (change). Расширенные публичные ключи (xpub) обычно выводятся именно на этом уровне.
  4. BIP84 обновил стандарт для нативных SegWit-адресов, начинающихся с `bc1q`. Он задаёт purpose равным 84. Эти адреса эффективнее устаревших форматов, поскольку их witness-данные учитываются со скидкой при расчёте веса транзакции, что снижает комиссии. Путь деривации принимает вид `m / 84' / 0' / account' / change / index`. Например, первый внешний адрес аккаунта 0 выводится по пути `m/84'/0'/0'/0/0`. Такая структура позволяет серверам генерировать адреса для получения средств из xpub, вообще не касаясь приватного ключа.
  5. BIP86 — отдельный стандарт деривации для Taproot, написанный Авой Чоу (Ava Chow) в 2021 году: он задаёт purpose равным 86 и выводит одноключевые Taproot-адреса, начинающиеся с `bc1p`. BIP86 охватывает одноключевые выходы Taproot без дерева скриптов. Поскольку путь ключа (key path) в Taproot может содержать и агрегированный ключ, например ключ MuSig2, выходы кошелька с несколькими участниками в блокчейне могут выглядеть точно так же, как эти одноключевые.
  6. Кошельки сканируют адреса наперёд, чтобы обнаружить использованные, и обычно останавливаются, достигнув «лимита пропусков» (gap limit) — 20 подряд неиспользованных адресов в цепочке. Если в этом диапазоне транзакций не найдено, кошелёк считает, что обнаружил все существующие ключи этого аккаунта. Чтобы проверить этот механизм, откройте любой современный HD-кошелёк и найдите настройки пути деривации. Определите каждый уровень: purpose, тип монеты, аккаунт, change и index. Выведите два разных пути из одного и того же сида и убедитесь, что они дают разные ключи и при этом полностью восстанавливаются из исходной мнемонической фразы.

Ключевые факты

  • BIP32 выводит детерминированное дерево дочерних ключей из одного мастер-сида.
  • Усиленная деривация (обозначается символом `'`) предотвращает утечку родительского ключа, если скомпрометированы дочерний приватный ключ и xpub.
  • Структура пути BIP44: `m / purpose' / coin_type' / account' / change / index`.
  • Purpose 84 соответствует нативным SegWit-адресам (`bc1q`), которые экономичнее по комиссиям, чем устаревшие форматы.
  • Purpose 86 соответствует одноключевым Taproot-адресам (`bc1p`).
  • Кошельки обычно прекращают сканирование после 20 подряд неиспользованных адресов (gap limit, лимит пропусков).

Упражнение девять, шесть, три, один

9СобратьПеречислите 9 путей деривации из разных кошельков или стандартов. Для каждого укажите purpose, тип монеты (coin type) и формат адреса.
6СгруппироватьРаспределите эти 9 путей по 6 категориям в зависимости от типа скрипта: legacy P2PKH, вложенный (nested) SegWit, нативный SegWit, Taproot, мультивалютные или прочие.
3Выделить главноеСведите 6 категорий к 3 причинам, по которым разработчик кошелька может предпочесть один путь деривации другому.
1КристаллизоватьНапишите одно предложение о том, как усиленная (hardened) деривация защищает мастер-ключ от раскрытия через дочерние ключи.

Проверка фактов

Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.

Открыть в интерактивной академии →

EN PT ES ZH JA KO DE FR MS