Пути деривации BIP-44: как кошельки генерируют адреса
Когда вы настраиваете криптовалютный кошелёк и он генерирует seed-фразу, этот один seed должен создавать тысячи адресов в десятках разных блокчейнов — каждый со своим приватным ключом, публичным ключом и форматом адреса. BIP-44 определяет организационную структуру, которая делает это возможным: иерархическое дерево ключей, производных от одного корня, со стандартизированной записью пути, обеспечивающей совместимость кошельков.
Понимание путей деривации необходимо всем, кому нужно восстановить средства в другом кошельке, управлять мультивалютным портфелем или разбираться с «пропавшими» балансами после восстановления seed-фразы.
Иерархия деривации ключей
BIP-32: основа
BIP-44 основан на BIP-32 (Hierarchical Deterministic Wallets), который определяет метод получения неограниченного дерева пар ключей из одного мастер-ключа. BIP-32 ввёл две фундаментальные концепции:
Деривация дочерних ключей — из любого расширенного ключа (приватного или публичного ключа вместе с chain code) можно получить дочерние ключи по разным индексам. Каждый дочерний ключ, в свою очередь, может порождать собственные дочерние ключи, формируя дерево.
Hardened и normal деривация — normal деривация позволяет получать дочерние публичные ключи из родительского публичного ключа (полезно для watch-only кошельков). Hardened деривация требует родительский приватный ключ и обеспечивает более сильную изоляцию безопасности между ветками. Hardened-индексы по соглашению записываются с апострофом (например, 44').
BIP-43: поле Purpose
BIP-43 установил соглашение использовать первый уровень дерева деривации для указания «purpose» — по сути, используемого стандарта BIP. BIP-44 использует purpose 44', BIP-49 использует 49' (для совместимых с SegWit P2SH-адресов), BIP-84 использует 84' (для нативного SegWit), а BIP-86 использует 86' (для Taproot).
BIP-44: полный путь
BIP-44 определяет путь деривации из пяти уровней:
m / purpose' / coin_type' / account' / change / address_index
Каждый уровень имеет конкретное значение:
| Уровень | Поле | Hardened | Описание |
|---|---|---|---|
| 1 | Purpose | Да (44') | Определяет стандарт деривации |
| 2 | Coin Type | Да | Определяет криптовалюту |
| 3 | Account | Да | Разделяет средства на логические аккаунты |
| 4 | Change | Нет (0 или 1) | Внешняя (0) или внутренняя сдача (1) |
| 5 | Address Index | Нет (0, 1, 2...) | Последовательный номер адреса |
Purpose (44')
Для стандартной деривации BIP-44 поле purpose всегда равно 44'. Другие распространённые значения:
49'— BIP-49 (P2SH-wrapped SegWit)84'— BIP-84 (Native SegWit / Bech32)86'— BIP-86 (Taproot / P2TR)
Они определяют разные типы адресов и описаны в соответствующих BIP.
Coin Type
Coin type указывает, к какой криптовалюте относятся производные ключи. Зарегистрированные coin type включают:
| Монета | Coin Type | Префикс пути |
|---|---|---|
| Bitcoin | 0' | m/44'/0' |
| Bitcoin Testnet | 1' | m/44'/1' |
| Litecoin | 2' | m/44'/2' |
| Dogecoin | 3' | m/44'/3' |
| Ethereum | 60' | m/44'/60' |
| Ethereum Classic | 61' | m/44'/61' |
| Cosmos | 118' | m/44'/118' |
| Solana | 501' | m/44'/501' |
| Cardano | 1815' | m/44'/1815' |
| Polkadot | 354' | m/44'/354' |
Полный реестр coin type поддерживается в SLIP-44 и содержит более 1 000 записей.
Account
Уровень account позволяет создавать отдельные логические аккаунты в одном кошельке, как несколько банковских счетов. По умолчанию используется account 0':
m/44'/0'/0'— Bitcoin Account 0m/44'/0'/1'— Bitcoin Account 1m/44'/60'/0'— Ethereum Account 0
Для аккаунтов используется hardened-деривация, то есть знание расширенного публичного ключа одного аккаунта не раскрывает ключи другого аккаунта. Это обеспечивает приватную изоляцию между аккаунтами.
Change
Уровень change различает:
- 0 (External chain) — адреса, которые вы даёте другим для получения платежей.
- 1 (Internal chain) — адреса, которые кошелёк использует внутри для возврата сдачи самому себе.
В UTXO-модели Bitcoin при трате выхода транзакции должен быть израсходован весь выход целиком. Если вы отправляете 0.5 BTC из выхода на 1 BTC, оставшиеся 0.5 BTC отправляются на адрес сдачи, контролируемый вашим кошельком. Цепочка change держит эти адреса отдельно от адресов получения для удобства и приватности.
Ethereum и другие account-based блокчейны не используют change chain таким же образом, потому что у них нет UTXO-модели. Кошельки Ethereum обычно используют только внешнюю цепочку (change = 0).
Address Index
Address index — это последовательный номер адреса в цепочке. Кошельки увеличивают этот счётчик каждый раз, когда генерируется новый адрес:
m/44'/0'/0'/0/0— First receiving addressm/44'/0'/0'/0/1— Second receiving addressm/44'/0'/0'/0/2— Third receiving addressm/44'/0'/0'/1/0— First change addressm/44'/0'/0'/1/1— Second change address
Пути деривации для основных криптовалют
Bitcoin
Bitcoin использует несколько путей деривации, соответствующих разным типам адресов:
| Standard | Path | Address Type | Prefix | Example |
|---|---|---|---|---|
| BIP-44 | m/44'/0'/0' | Legacy (P2PKH) | 1... | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa |
| BIP-49 | m/49'/0'/0' | SegWit-compat (P2SH-P2WPKH) | 3... | 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy |
| BIP-84 | m/84'/0'/0' | Native SegWit (P2WPKH) | bc1q... | bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 |
| BIP-86 | m/86'/0'/0' | Taproot (P2TR) | bc1p... | bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297 |
Важно для восстановления: если вы восстановили seed-фразу в новом кошельке и не видите баланс, возможно, кошелёк сканирует другой путь деривации, чем использовал ваш исходный кошелёк. Попробуйте переключаться между типами адресов Legacy, SegWit и Taproot или вручную указать путь деривации.
Ethereum
Ethereum обычно использует один путь деривации:
m/44'/60'/0'/0/0 — First account
m/44'/60'/0'/0/1 — Second account (some wallets)
Однако некоторые кошельки (например, Ledger Live) выводят несколько аккаунтов на уровне account:
m/44'/60'/0'/0/0 — Account 0
m/44'/60'/1'/0/0 — Account 1
m/44'/60'/2'/0/0 — Account 2
В то время как другие (например, MetaMask) увеличивают address index:
m/44'/60'/0'/0/0 — Account 1
m/44'/60'/0'/0/1 — Account 2
m/44'/60'/0'/0/2 — Account 3
Эта несогласованность может вызывать путаницу при восстановлении. Всегда фиксируйте, какое ПО кошелька создало вашу seed-фразу.
Solana
Solana использует Ed25519 (другая эллиптическая кривая, чем secp256k1) с путём:
m/44'/501'/0' — Phantom, Solflare
m/44'/501'/0'/0' — Some implementations
Cardano
Cardano использует другую схему деривации ключей (Ed25519-BIP32 / CIP-1852) с путём:
m/1852'/1815'/0'/0/0 — First payment address
m/1852'/1815'/0'/2/0 — First staking key
Обратите внимание на поле purpose 1852' (CIP-1852, назван в честь года рождения Ada Lovelace) вместо 44'.
Hardened и normal деривация
Понимание разницы между hardened и normal деривацией критично для безопасности.
Normal (Non-Hardened) Derivation
- Использует индексы от 0 до 2^31 - 1.
- Дочерние публичные ключи можно получить из родительского расширенного публичного ключа без родительского приватного ключа.
- Преимущество: позволяет использовать watch-only кошельки (например, сервер может генерировать новые адреса получения, используя только xpub, никогда не храня приватные ключи).
- Риск: если злоумышленник получит и дочерний приватный ключ, и родительский расширенный публичный ключ, он сможет вычислить родительский приватный ключ и все соседние приватные ключи.
Hardened Derivation
- Использует индексы от 2^31 до 2^32 - 1 (записываются как 0' через 2^31 - 1').
- Для получения дочерних ключей требуется родительский расширенный приватный ключ.
- Преимущество: компрометация дочернего ключа не компрометирует родителя или соседние ключи.
- Риск: нельзя получить дочерние публичные ключи только из родительского расширенного публичного ключа (на этом уровне нет watch-only функциональности).
Почему BIP-44 использует hardened-деривацию для первых трёх уровней
Purpose, coin type и account — все hardened (44'/0'/0'), потому что:
- Компрометация приватного ключа адреса (на non-hardened уровне 5) не должна компрометировать аккаунт.
- Аккаунты должны быть изолированы друг от друга.
- Разные монеты должны быть изолированы друг от друга.
Уровни change и address index — non-hardened (0/0), чтобы watch-only кошельки могли генерировать адреса получения без мастер-приватного ключа.
Gap limit
Кошельки не сканируют бесконечное количество адресов. Спецификация BIP-44 вводит понятие «gap limit» — количество последовательных неиспользованных адресов, которое кошелёк просканирует перед остановкой. Стандартный gap limit равен 20.
Если вы сгенерировали адреса с 0 по 25, но средства когда-либо получали только адреса 0, 5, 10 и 25, кошелёк:
- Сканирует адрес 0 — есть транзакции, продолжает.
- Сканирует адреса 1–4 — неиспользованы, но в пределах gap limit.
- Сканирует адрес 5 — есть транзакции, сбрасывает счётчик gap.
- Продолжает, пока не встретит 20 последовательных адресов без транзакций.
Проблема: если вы сгенерировали много адресов за пределами gap limit (часто бывает у платёжных процессоров для мерчантов), при восстановлении кошелёк может не найти все ваши средства. Во время восстановления может потребоваться увеличить gap limit в настройках кошелька.
Используйте SafeSeed Key Derivation Tool, чтобы интерактивно изучать пути деривации BIP-44. Введите seed-фразу (используйте тестовую, не настоящую) и посмотрите, как разные пути деривации создают разные адреса для разных монет. Вся обработка выполняется в вашем браузере.
Расширенные ключи: xpub, ypub, zpub
Расширенные ключи кодируют материал ключа вместе с метаданными о пути деривации:
| Prefix | Standard | Address Type | Network |
|---|---|---|---|
| xpub / xprv | BIP-44 | Legacy (P2PKH) | Mainnet |
| ypub / yprv | BIP-49 | SegWit-compat (P2SH-P2WPKH) | Mainnet |
| zpub / zprv | BIP-84 | Native SegWit (P2WPKH) | Mainnet |
| tpub / tprv | BIP-44 | Legacy (P2PKH) | Testnet |
Префикс сообщает ПО кошелька, какой тип адреса нужно выводить. Если вы экспортируете xpub и импортируете его в кошелёк, который ожидает zpub, вы увидите другие (некорректные) адреса.
Предупреждение о приватности расширенных публичных ключей
Передача xpub (или ypub/zpub) позволяет получателю:
- Выводить все прошлые и будущие адреса получения.
- Отслеживать всю вашу историю транзакций и баланс.
- Связывать ваши адреса между собой, уничтожая преимущества приватности от использования нового адреса на каждую транзакцию.
Никогда не делитесь расширенными публичными ключами, кроме случаев, когда вы полностью доверяете стороне в вопросах финансовой приватности (например, вашему бухгалтеру или watch-only кошельку на вашем собственном сервере).
Частые проблемы с путями деривации
«Я восстановил seed-фразу, но баланс нулевой»
Это самая частая проблема пути деривации. Возможные причины:
- Неверный тип адреса — вы использовали SegWit-адреса (BIP-84,
m/84'/0'/0'), а новый кошелёк сканирует Legacy-пути (BIP-44,m/44'/0'/0'). Переключите тип адреса. - Неверный coin type — некоторые кошельки в ранних реализациях использовали coin type 0 для всех монет.
- Неверный account — вы могли использовать account 1 или выше.
- Gap limit — использованные адреса были за пределами стандартного gap limit 20.
- Пользовательский путь деривации — некоторые кошельки используют нестандартные пути.
«Два моих кошелька показывают разные адреса из одной seed-фразы»
Если два кошелька генерируют разные адреса из одной seed-фразы, они используют разные пути деривации или типы адресов. Проверьте настройки деривации в обоих кошельках.
Чеклист восстановления
При восстановлении кошелька из seed-фразы:
- Убедитесь, что кошелёк поддерживает BIP-39.
- Выберите правильный тип адреса (Legacy, SegWit или Taproot).
- Проверьте, что путь деривации совпадает с исходным кошельком.
- Увеличьте gap limit, если вы использовали много адресов.
- Проверьте все аккаунты (не только account 0), если вы создавали несколько аккаунтов.
Продвинутое: пользовательские пути деривации
Некоторые продвинутые сценарии требуют пользовательских путей деривации:
- Multisig-настройки — BIP-48 определяет пути деривации для multisig-кошельков:
m/48'/0'/0'/2'(для native SegWit multisig). - Lightning Network — некоторые реализации Lightning используют пользовательские пути деривации для ключей каналов.
- Приватные кошельки — Wasabi и другие кошельки с фокусом на приватность могут использовать специальные пути.
Всегда документируйте используемые пути деривации. Если вы не можете восстановить точный путь, вы не сможете восстановить средства.
FAQ
Что такое путь деривации в криптовалютах?
Путь деривации — это структурированная запись, которая задаёт, как вывести конкретный ключ или адрес из master seed в иерархически детерминированном (HD) кошельке. Он следует формату m/purpose'/coin_type'/account'/change/address_index, где каждый уровень сужает выбор до конкретного ключа в дереве деривации.
Почему разные криптовалюты используют разные coin type?
Разные coin type гарантируют, что одна и та же seed-фраза создаёт отдельные, несвязанные ключи для каждого блокчейна. Это предотвращает случайные межсетевые конфликты и гарантирует, что компрометация ключей в одной сети не влияет на ключи в другой.
Можно ли использовать одну и ту же seed-фразу для Bitcoin и Ethereum?
Да. Одна и та же seed-фраза BIP-39 может выводить ключи и для Bitcoin, и для Ethereum (и многих других криптовалют). Они используют разные пути деривации — Bitcoin: m/44'/0'/0', Ethereum: m/44'/60'/0' — поэтому производные ключи и адреса полностью независимы.
Что означает апостроф (') в путях деривации?
Апостроф указывает на hardened-деривацию. Hardened-деривация требует родительский приватный ключ и обеспечивает более сильную изоляцию безопасности: компрометация дочернего ключа не раскрывает родительские или соседние ключи. Non-hardened уровни (без апострофа) позволяют выводить дочерние публичные ключи из родительского публичного ключа.
Почему после восстановления seed-фразы кошелёк показывает нулевой баланс?
Самая частая причина — несовпадение пути деривации. Ваш исходный кошелёк мог использовать другой тип адреса (Legacy vs. SegWit vs. Taproot), и каждый из них использует свой путь деривации. Попробуйте переключить тип адреса в кошельке восстановления или вручную указать путь деривации из исходного кошелька.
Что такое gap limit и почему это важно?
Gap limit — это количество последовательных неиспользованных адресов, которое кошелёк сканирует, прежде чем решить, что больше использованных адресов нет. Стандарт BIP-44 устанавливает значение 20. Если вы сгенерировали много адресов (например, как мерчант, принимающий платежи), часть адресов с балансом может быть за пределами gap limit и не видна при восстановлении. Увеличьте gap limit в настройках кошелька, чтобы найти их.
Все ли кошельки используют BIP-44?
Большинство современных кошельков поддерживают BIP-44 или его последователей (BIP-49, BIP-84, BIP-86). Однако некоторые кошельки используют проприетарные пути деривации. Например, Electrum использует собственную мнемонику и схему деривации. Всегда фиксируйте, какой кошелёк создал вашу seed-фразу и какие пути деривации он использует.