30 / 736BIP32

HD Wallet

Иерархический детерминированный кошелёк

Кошелёк может предлагать новый адрес для каждого платежа без новой резервной копии ключей после каждого поступления. HD Wallet выводит целое дерево ключей из одного исходного секрета. Для восстановления нужно также знать, какую часть дерева использовал кошелёк.

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.

DOC · 001BIP 32 — Hierarchical deterministic walletsСпецификация DOC · 002BIP 43 — Purpose field for deterministic walletsСпецификация DOC · 003BIP 44 — Multi-account hierarchyСпецификация DOC · 004BIP 48 — Multi-script hierarchy for multisig walletsСпецификация DOC · 005BIP 84 — Native SegWit derivationСпецификация DOC · 006BIP 86 — Single-key Taproot derivationСпецификация DOC · 007BIP 380 — Output script descriptorsСпецификация DOC · 008BIP 389 — Multipath descriptor key expressionsСпецификация DOC · 009SLIP 132 — Registered HD version bytesСпецификация DOC · 010Bitcoin Core — Output descriptorsДокументация DOC · 011BIP 39 — Mnemonic code for deterministic keysСпецификация DOC · 012Bitcoin Developer Guide — WalletsДокументация DOC · 013Bitcoin Optech — Output script descriptorsДокументация DOC · 014Trezor Learn — Hierarchical deterministic walletsДокументация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией