Перейти к основному содержимому

Пути деривации 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Описание
1PurposeДа (44')Определяет стандарт деривации
2Coin TypeДаОпределяет криптовалюту
3AccountДаРазделяет средства на логические аккаунты
4ChangeНет (0 или 1)Внешняя (0) или внутренняя сдача (1)
5Address 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Префикс пути
Bitcoin0'm/44'/0'
Bitcoin Testnet1'm/44'/1'
Litecoin2'm/44'/2'
Dogecoin3'm/44'/3'
Ethereum60'm/44'/60'
Ethereum Classic61'm/44'/61'
Cosmos118'm/44'/118'
Solana501'm/44'/501'
Cardano1815'm/44'/1815'
Polkadot354'm/44'/354'

Полный реестр coin type поддерживается в SLIP-44 и содержит более 1 000 записей.

Account

Уровень account позволяет создавать отдельные логические аккаунты в одном кошельке, как несколько банковских счетов. По умолчанию используется account 0':

  • m/44'/0'/0' — Bitcoin Account 0
  • m/44'/0'/1' — Bitcoin Account 1
  • m/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 address
  • m/44'/0'/0'/0/1 — Second receiving address
  • m/44'/0'/0'/0/2 — Third receiving address
  • m/44'/0'/0'/1/0 — First change address
  • m/44'/0'/0'/1/1 — Second change address

Пути деривации для основных криптовалют

Bitcoin

Bitcoin использует несколько путей деривации, соответствующих разным типам адресов:

StandardPathAddress TypePrefixExample
BIP-44m/44'/0'/0'Legacy (P2PKH)1...1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
BIP-49m/49'/0'/0'SegWit-compat (P2SH-P2WPKH)3...3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy
BIP-84m/84'/0'/0'Native SegWit (P2WPKH)bc1q...bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
BIP-86m/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'), потому что:

  1. Компрометация приватного ключа адреса (на non-hardened уровне 5) не должна компрометировать аккаунт.
  2. Аккаунты должны быть изолированы друг от друга.
  3. Разные монеты должны быть изолированы друг от друга.

Уровни change и address index — non-hardened (0/0), чтобы watch-only кошельки могли генерировать адреса получения без мастер-приватного ключа.

Gap limit

Кошельки не сканируют бесконечное количество адресов. Спецификация BIP-44 вводит понятие «gap limit» — количество последовательных неиспользованных адресов, которое кошелёк просканирует перед остановкой. Стандартный gap limit равен 20.

Если вы сгенерировали адреса с 0 по 25, но средства когда-либо получали только адреса 0, 5, 10 и 25, кошелёк:

  1. Сканирует адрес 0 — есть транзакции, продолжает.
  2. Сканирует адреса 1–4 — неиспользованы, но в пределах gap limit.
  3. Сканирует адрес 5 — есть транзакции, сбрасывает счётчик gap.
  4. Продолжает, пока не встретит 20 последовательных адресов без транзакций.

Проблема: если вы сгенерировали много адресов за пределами gap limit (часто бывает у платёжных процессоров для мерчантов), при восстановлении кошелёк может не найти все ваши средства. Во время восстановления может потребоваться увеличить gap limit в настройках кошелька.

Инструмент SafeSeed

Используйте SafeSeed Key Derivation Tool, чтобы интерактивно изучать пути деривации BIP-44. Введите seed-фразу (используйте тестовую, не настоящую) и посмотрите, как разные пути деривации создают разные адреса для разных монет. Вся обработка выполняется в вашем браузере.

Расширенные ключи: xpub, ypub, zpub

Расширенные ключи кодируют материал ключа вместе с метаданными о пути деривации:

PrefixStandardAddress TypeNetwork
xpub / xprvBIP-44Legacy (P2PKH)Mainnet
ypub / yprvBIP-49SegWit-compat (P2SH-P2WPKH)Mainnet
zpub / zprvBIP-84Native SegWit (P2WPKH)Mainnet
tpub / tprvBIP-44Legacy (P2PKH)Testnet

Префикс сообщает ПО кошелька, какой тип адреса нужно выводить. Если вы экспортируете xpub и импортируете его в кошелёк, который ожидает zpub, вы увидите другие (некорректные) адреса.

Предупреждение о приватности расширенных публичных ключей

Передача xpub (или ypub/zpub) позволяет получателю:

  • Выводить все прошлые и будущие адреса получения.
  • Отслеживать всю вашу историю транзакций и баланс.
  • Связывать ваши адреса между собой, уничтожая преимущества приватности от использования нового адреса на каждую транзакцию.

Никогда не делитесь расширенными публичными ключами, кроме случаев, когда вы полностью доверяете стороне в вопросах финансовой приватности (например, вашему бухгалтеру или watch-only кошельку на вашем собственном сервере).

Частые проблемы с путями деривации

«Я восстановил seed-фразу, но баланс нулевой»

Это самая частая проблема пути деривации. Возможные причины:

  1. Неверный тип адреса — вы использовали SegWit-адреса (BIP-84, m/84'/0'/0'), а новый кошелёк сканирует Legacy-пути (BIP-44, m/44'/0'/0'). Переключите тип адреса.
  2. Неверный coin type — некоторые кошельки в ранних реализациях использовали coin type 0 для всех монет.
  3. Неверный account — вы могли использовать account 1 или выше.
  4. Gap limit — использованные адреса были за пределами стандартного gap limit 20.
  5. Пользовательский путь деривации — некоторые кошельки используют нестандартные пути.

«Два моих кошелька показывают разные адреса из одной seed-фразы»

Если два кошелька генерируют разные адреса из одной seed-фразы, они используют разные пути деривации или типы адресов. Проверьте настройки деривации в обоих кошельках.

Чеклист восстановления

При восстановлении кошелька из seed-фразы:

  1. Убедитесь, что кошелёк поддерживает BIP-39.
  2. Выберите правильный тип адреса (Legacy, SegWit или Taproot).
  3. Проверьте, что путь деривации совпадает с исходным кошельком.
  4. Увеличьте gap limit, если вы использовали много адресов.
  5. Проверьте все аккаунты (не только 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-фразу и какие пути деривации он использует.

Связанные руководства