HD Wallet вычисляет множество связанных ключей из одной секретной основы — сида. Приватные ключи подписывают платежи, а из соответствующих публичных ключей кошелёк создаёт адреса получения. Поэтому он может использовать новые адреса без отдельной резервной копии для каждого из них.
Алиса открывает экран получения, и кошелёк показывает адрес. На него приходит 10 000 сатоши — мелких единиц биткоина. Для следующего платежа приложение предлагает другой адрес, который получает 20 000 сатоши. Если это её единственные ещё не потраченные поступления, кошелёк покажет в сумме 30 000 сатоши. Новый адрес не создал отдельного счёта, а прежние деньги никуда автоматически не переместились. Приложение управляет ключами для обоих поступлений. HD Wallet делает это удобным. HD означает Hierarchical Deterministic: иерархический, потому что ключи образуют разветвлённую структуру, и детерминированный, потому что одинаковые сид и путь дают одинаковые ключи, в том числе при восстановлении. Путь — последовательность чисел, указывающая программе, какую ветвь и какой ключ вычислить. Обычно Алисе не приходится разбираться с ним при получении платежа, но восстановление должно использовать правильные пути. Одна копия исходного секрета поэтому может охватывать и будущие адреса; настройки кошелька всё равно нужно сохранить. Новые адреса помогают избегать повторного использования адресов, но сами по себе не гарантируют анонимности. [1] [12]
Расширенный публичный ключ, обычно называемый xpub, позволяет вычислять публичные ключи части этой структуры. Он не содержит приватных ключей для подписания платежей. Поэтому одного xpub недостаточно для расходования средств; чтобы создавать конкретные адреса, приложению также нужно знать их формат. Кошелёк watch-only с подходящим xpub может создавать адреса и отслеживать платежи без ключей подписи. Однако утечка xpub может связать прошлые и будущие адреса этой ветви, балансы и транзакции. Делитесь лишь нужной ветвью. Даже правильный xpub не мешает взломанному компьютеру показывать чужой адрес. Проверяйте адрес получения на надёжном устройстве подписи, которому известен этот кошелёк. [1] [12] [14]
Магазин может создавать отдельный адрес для каждого заказа. Сайту нужны адреса, но не ключи для расходования выручки. BIP32 отделяет эту ветвь получения от остального кошелька. Предложение написал Pieter Wuille; дата присвоения — 11 февраля 2012 года. Это стандарт кошельков, а не правило консенсуса. Слова резервной копии BIP39, типы скриптов и полная процедура восстановления относятся к другим уровням. [1] [11] [12]
BIP32 добавляет к ключу 256-битный chain code — 32 байта для дальнейшего вывода. Приватная форма состоит из скаляра k кривой secp256k1 и chain code c; публичная использует K = point(k) и то же c. Главный ключ создаётся HMAC-SHA512 с точной строкой «Bitcoin seed» в качестве ключа функции и сидом в качестве данных. Левые 32 байта — кандидат приватного ключа, правые 32 — chain code. Ноль или значение не меньше порядка кривой n означает недействительный главный ключ. [1]
Вывод — это вычисление, а не поиск в сохранённом списке. Есть обычный вывод и вывод hardened. При обычном следующие публичные ключи можно вычислить из родительского расширенного публичного ключа; шаг hardened требует родительского расширенного приватного ключа. CKDpriv вычисляет I = HMAC-SHA512(cpar, data), делит результат на IL и IR и прибавляет parse256(IL) к родительскому приватному ключу по модулю n. IR становится новым chain code. Обычная ветвь использует serP(Kpar) || ser32(i), hardened — 0x00 || ser256(kpar) || ser32(i), где i ≥ 2^31. CKDpub создаёт только обычные публичные ветви, прибавляя point(parse256(IL)) к Kpar. Другой номер ветви меняет последующие ключи. [1]
Из xpub можно выводить публичные ключи, пока путь не пересекает шаг hardened. Но есть важный компромисс: родительский xpub вместе с утёкшим приватным ключом обычного дочернего узла позволяет вычислить родительский приватный ключ. Под угрозой оказываются и другие его ветви. Hardened блокирует этот обратный расчёт, но не защищает от кражи сида, слабого генератора случайных чисел или подтверждения вредоносной транзакции. [1]
В mainnet стандартная публичная запись начинается с xpub, приватная — с xprv; их версии 0x0488B21E и 0x0488ADE4. До Base58Check запись занимает 78 байт: версия 4, глубина 1, отпечаток родительского ключа 4, номер дочернего ключа 4, chain code 32 и данные ключа 33. Результат содержит 111 символов. Короткий отпечаток помогает сопоставлять ключи, но не доказывает идентичность. Префиксы ypub/zpub из SLIP132 иногда обозначают тип скрипта; смена префикса сама по себе не меняет ключи и правила кошелька. [1] [9]
BIP43 отвёл первый уровень hardened для назначения. BIP44 использует m / 44' / coin_type' / account' / change / address_index. После счёта идёт ветвь 0 для получения или 1 для сдачи, затем номер адреса. Апостроф или h означает индекс, увеличенный на 2^31. Поиск BIP44 применяет gap limit 20: останавливается после 20 последовательных неиспользованных адресов получения. BIP48 описывает Multisig, BIP84 — назначение 84' для нативного SegWit, BIP86 — 86' для Taproot с одним ключом. Эти соглашения не записаны в самом сиде и не навязываются узлами. [2] [3] [4] [5] [6]
Одни ключи не определяют скрипт, защищающий монеты. Output Descriptor может записывать происхождение ключей, пути, конструкцию вроде wpkh(), нужное число подписей, других участников Multisig и контрольную сумму. Multipath descriptor может объединять ветви получения и сдачи. Сид одного участника не восстановит остальные xpub и общие правила. Сохраните также проверенный публичный дескриптор или экспорт конфигурации и защищайте их конфиденциальность. Если экспорт содержит приватные ключи, обращайтесь с ним как с секретом. [7] [8] [10] [13]
Сид позволяет заново вывести ключи, но приложению нужны формат сида, использованная BIP39 passphrase, сеть, тип скрипта, coin type, счета, обе ветви и диапазон поиска. Multisig требует ещё и общей конфигурации. Нулевой баланс не обязательно означает потерю монет: причиной может быть другой путь. Безопасный тест на надёжном устройстве должен найти нужные UTXO, то есть ещё не потраченные выходы транзакций, и проверить подпись. Никогда не вводите настоящий сид или слова резервной копии в веб-инструмент либо обычный компьютер онлайн. [3] [7] [10] [11]
BIP32 учитывает редкие недействительные результаты: parse256(IL) ≥ n, нулевой дочерний приватный ключ или публичную точку на бесконечности. Тогда пробуют следующий индекс. При восстановлении чаще недостаёт пути, ветви сдачи или поддерживаемого типа скрипта. До перехода проверьте обнаружение монет и небольшой пробный перевод. Сохраняйте исходную копию и конфигурацию, пока новый способ не заработает. xprv позволяет получить ключи для подписания, xpub раскрывает финансовые связи, а дескриптор описывает построение кошелька. [1] [7] [9] [10]
Для полной картины прочитайте эту статью вместе с Кошелёк, Seed Phrase, Extended Public Key (xpub), Derivation Path, Gap Limit, Bitcoin. На эту статью также ссылаются Биткоин-адрес, BIP 39, Cold Storage, Watch-only Wallet.