Блокчейн/Уровень IV · Глубины протокола/4.3 Хранение и приватность/Урок 1
HD-кошельки (BIP32, BIP44, BIP84, BIP86)
Как из одного сида получается целое дерево ключей
МатериалыКошелёк в тестовом режиме (testnet или signet), никогда не настоящий сидHD-кошелёк или инструмент, который показывает пути деривацииБлокнот
Любопытство
- Как один сид может порождать практически неограниченное количество уникальных приватных ключей, которые можно восстановить?
- Почему утечка одного дочернего приватного ключа вместе с расширенным публичным ключом родителя может раскрыть все ключи в неусиленной (non-hardened) ветке?
- Какое структурное различие отделяет legacy-адрес P2PKH от адреса нативного SegWit или Taproot с точки зрения экономии на комиссиях?
Исследование
- До появления BIP32, который предложил Питер Вуйле (Pieter Wuille) в 2012 году, кошельки генерировали случайную пару ключей для каждого нового адреса. Резервное копирование кошелька означало хранение каждого приватного ключа по отдельности; потеря одного файла резервной копии делала соответствующие средства невосстановимыми. BIP32 изменил эту модель: теперь из одного мастер-сида выводится детерминированное дерево ключей. Вся финансовая история привязана к этому единственному сиду, который обычно создаётся из 128 или 256 бит энтропии и записывается в виде 12 или 24 слов.
- Путь деривации следует структуре, определённой в BIP44 (2014): `m / purpose' / coin_type' / account' / change / index`. Апостроф обозначает усиленную (hardened) деривацию. Это критически важный механизм безопасности. При неусиленной деривации злоумышленник, получивший и родительский расширенный публичный ключ (xpub), и любой один дочерний приватный ключ, может математически вычислить родительский приватный ключ. Усиленная деривация разрывает эту связь: утёкший дочерний приватный ключ в сочетании с xpub ничего не раскрывает о секрете родителя.
- BIP44 стандартизировал первые три уровня, чтобы обеспечить поддержку нескольких валют в рамках одной иерархии. Уровень `purpose'` указывает на стандарт (например, 44 для BIP44, 84 для BIP84). Уровень `coin_type'` различает активы; у биткоина индекс 0. Это позволяет управлять разными криптовалютами с одного сида, не смешивая их ключи. Уровень `account'` разделяет средства на отдельные аккаунты, у каждого из которых своя цепочка сдачи (change). Расширенные публичные ключи (xpub) обычно выводятся именно на этом уровне.
- BIP84 обновил стандарт для нативных SegWit-адресов, начинающихся с `bc1q`. Он задаёт purpose равным 84. Эти адреса эффективнее устаревших форматов, поскольку их witness-данные учитываются со скидкой при расчёте веса транзакции, что снижает комиссии. Путь деривации принимает вид `m / 84' / 0' / account' / change / index`. Например, первый внешний адрес аккаунта 0 выводится по пути `m/84'/0'/0'/0/0`. Такая структура позволяет серверам генерировать адреса для получения средств из xpub, вообще не касаясь приватного ключа.
- BIP86 — отдельный стандарт деривации для Taproot, написанный Авой Чоу (Ava Chow) в 2021 году: он задаёт purpose равным 86 и выводит одноключевые Taproot-адреса, начинающиеся с `bc1p`. BIP86 охватывает одноключевые выходы Taproot без дерева скриптов. Поскольку путь ключа (key path) в Taproot может содержать и агрегированный ключ, например ключ MuSig2, выходы кошелька с несколькими участниками в блокчейне могут выглядеть точно так же, как эти одноключевые.
- Кошельки сканируют адреса наперёд, чтобы обнаружить использованные, и обычно останавливаются, достигнув «лимита пропусков» (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) деривация защищает мастер-ключ от раскрытия через дочерние ключи.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.
- P. Wuille, BIP32: Hierarchical Deterministic Wallets (2012)
- M. Palatinus & P. Rusnak, BIP44: Multi-Account Hierarchy for Deterministic Wallets (2014)
- P. Rusnak, BIP84: Derivation scheme for P2WPKH based accounts (2017)
- A. Chow, BIP86: Key Derivation for Single Key P2TR Outputs (2021)
- A. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3rd ed. (2023), ch. 5