Derivation Path — точная последовательность шагов для вывода конкретного ключа из исходного. Представьте папки на компьютере: правильного диска недостаточно, если открыть не те папки. Но ключи вычисляются математически, а не ищутся в сохранённых файлах. Одинаковые исходные данные и путь дают одинаковый результат. Другой путь может вести в другую часть того же кошелька. Это не платёжный адрес, пароль или замена резервной копии.
Анна восстанавливает кошелёк, а программа спрашивает путь, о котором раньше не приходилось задумываться. Кошелёк — приложение или устройство для получения и отправки биткоинов. m/0/7 выглядит сложно, но читается по порядку: m — главный приватный узел, от него выводится ключ 0, а уже от этого ключа — ключ 7. Узел здесь означает место в дереве ключей, а не компьютер в сети Bitcoin. Числа — индексы, порядковые позиции, а не суммы или номера транзакций. Стандарт BIP 32 использует расширенный ключ: кроме самого ключа он содержит chain code, дополнительные данные для вывода других ключей. Поэтому одна запись пути без исходного ключа не позволяет подписать платёж. [1] [10]
Возьмём m/84'/0'/0'/0/7. Первая часть после m обозначает BIP 84 для нативного SegWit, способа построения адресов и расходования средств. Затем идут Bitcoin mainnet, основная сеть с настоящими биткоинами, счёт 0, внешняя ветвь получения 0 и индекс 7. Это восьмая адресная позиция, поскольку отсчёт идёт с нуля. Счёт отделяет группу средств, ветвь определяет назначение адресов. В структуре BIP 44 ветвь 1 предназначена для собственной сдачи, суммы, остающейся у отправителя после платежа. Первые три шага отмечены апострофом и являются hardened, последние два — обычные. Что меняет этот знак? [2] [5]
Приватный ключ — секретное числовое значение, с помощью которого кошелёк создаёт цифровую подпись, разрешающую потратить средства. Hardened обозначает вывод, которому нужен приватный ключ вышестоящего уровня. На обычном шаге дочерний открытый ключ можно вывести и из xpub, расширенного открытого ключа. С нужным типом скрипта это позволяет строить адреса без возможности подписывать платежи. Сам xpub не может пройти шаг hardened. По BIP 380 записи 0' и 0h означают одно и то же, но не обычный 0. Для технических читателей: BIP 32 делит 32-битовые индексы на обычные от 0 до 2^31−1 и hardened от 2^31 до 2^32−1; знак превращает ноль в индекс 2^31. Пропуск меняет вычисление, а не только вид записи. [1] [7] [10]
BIP 43 называет первый уровень hardened словом purpose — назначение структуры. Согласованные значения помогают кошелькам понимать обычное применение ветви. Для ориентира: 44' обозначает традиционный P2PKH, платёж, защищённый хешем открытого ключа; 49' — P2SH-P2WPKH, SegWit в старой оболочке для совместимости; 84' — нативный P2WPKH; 86' — single-key P2TR, конструкцию Taproot с одним внутренним ключом. Это разные способы задать условия расходования денег. Само число не превращает путь в соответствующий скрипт и не навязывает его через консенсус сети. Программа должна действительно построить нужный выход. Не все кошельки используют эти соглашения. [3] [2] [4] [5] [6]
Анна может подключить только xpub одного счёта, чтобы видеть поступления, вместо всего кошелька. Если он происходит из m/84'/0'/0', то уже находится на уровне счёта. До предыдущего примера остаётся относительный суффикс /0/7. Повторное добавление всего пути от корня начнёт дальнейший вывод не с того места; к тому же шаги hardened из xpub выполнить невозможно. Экспортированный расширенный ключ содержит глубину в дереве и fingerprint родителя, короткую идентификационную метку, но не полную запись прошлых шагов. Поэтому недостающий исходный путь не всегда можно просто прочитать из самого xpub. [1] [7]
Descriptor описывает ключи и условия расходования, чтобы программа построила отслеживаемые выходы. BIP 380 позволяет перед ключом в квадратных скобках записать fingerprint и путь его происхождения. Это уже выполненные шаги. Суффикс после ключа задаёт дальнейший вывод; звёздочка * может означать ряд потомков. Fingerprint занимает четыре байта и допускает коллизии: у разных ключей бывает одна и та же короткая метка. Она не доказывает личность и не заменяет ключ. Bitcoin Core 29.0 предоставляет deriveaddresses через RPC, программный интерфейс узла. Команда вычисляет адреса по описанию descriptor и указанному при необходимости диапазону; само вычисление не проверяет баланс и не отправляет средства. [7] [1] [9]
Без исходных данных путь сам по себе не создаёт ваши ключи. Передача xpub — другое дело: получатель может выводить открытые ключи доступной ветви и с нужным типом скрипта отслеживать её адреса. Это не даёт права расходовать, но приватность может пострадать. BIP 32 предупреждает и о менее очевидном риске: родительский xpub вместе с утёкшим приватным ключом потомка, достижимого обычными шагами, может раскрыть расширенный приватный ключ родителя. Граница hardened блокирует именно этот способ вернуться к родителю. Она не делает утёкший ключ недействительным и не спасает средства, которыми он управляет. [1]
Вернёмся к восстановлению. Seed Phrase — слова резервной копии. По BIP 39 из них вместе с необязательной passphrase получается seed, исходный секрет для создания ключей. Passphrase — дополнительный секретный текст, а не обычный пароль приложения. С другим seed тот же путь даёт другие ключи. Также должны совпадать сеть, счёт, ветвь и тип скрипта. Программе нужно проверить достаточно адресов и истории: Gap Limit останавливает поиск после ряда неиспользованных адресов. Нулевой баланс сам по себе не доказывает потерю ключей. Анна может сравнить результат с известным адресом получения и прежними платежами. Принятие пути означает лишь, что программа умеет его обработать, а не что нашла весь исходный кошелёк. [8] [2] [7]
Для полной картины прочитайте эту статью вместе с HD Wallet, Extended Public Key (xpub), Gap Limit, Output Descriptor, BIP 39, Seed Phrase. На эту статью также ссылаются HD Wallet, Watch-only Wallet, Change Address, Extended Public Key (xpub).