60 / 736XPUB

Extended Public Key (xpub)

Расширенный публичный ключ BIP32

Хочется видеть поступления на телефоне, но не передавать ему ключи, позволяющие тратить деньги. Для этого и пригодится xpub: с ним можно готовить адреса и наблюдать за определённой частью кошелька без доступа к приватным ключам для подписи. Однако слово «публичный» не означает, что его стоит выкладывать на всеобщее обозрение.

Extended Public Key (xpub) соответствует BIP32 — правилам организации ключей в кошельке. Он позволяет вычислять другие публичные ключи в определённой части кошелька, а при наличии нужных правил адресов — готовить адреса для приёма и отслеживать платежи. Для расходования средств нужна цифровая подпись: криптографическое разрешение транзакции. Её создают приватным ключом, которого в xpub нет. Поэтому xpub не заменяет приватные ключи или Seed Phrase — резервную копию кошелька, записанную последовательностью слов.

Анна хранит ключи своего Bitcoin-кошелька на аппаратном устройстве и хочет с телефона проверить, заплатил ли клиент. Она переносит на телефон публичную конфигурацию выбранного аккаунта: в ней есть xpub, но нет приватных ключей. Телефон становится Watch-only Wallet: отслеживает нужные адреса, готовит новый адрес и может собрать неподписанную транзакцию. Для отправки денег по-прежнему нужна подпись устройства с секретными ключами. Точно так же интернет-магазин может выдавать разные адреса для заказов, не храня на сервере ключи для расходования средств. Такое разделение ограничивает последствия взлома сервера, но не решает всё: злоумышленник может показать покупателю свой адрес для нового платежа. [1] [5]

Обычно человеку, который собирается вам заплатить, достаточно дать один Bitcoin-адрес. Xpub открывает гораздо более широкий обзор. Зная xpub аккаунта и правила его адресов, можно получать адреса для приёма и сдачи, связывать их историю и остатки средств. Это относится к ветви, ключи которой можно вычислить из этого xpub, а не автоматически ко всем аккаунтам кошелька. Если передать xpub бухгалтерскому сервису или стороннему обозревателю блоков, тот может сохранить копию и наблюдать за будущими платежами. Отключение связи в приложении уже переданную копию не отзывает. Поэтому для отдельного платежа обычно хватает одного адреса; предоставляйте более широкий обзор только при понятной необходимости. [1] [5]

Кошелёк BIP32 строит дерево ключей из одного исходного значения. «Ветвь» здесь означает группу производных ключей, а не участок сети или цепочки блоков. Из xpub можно двигаться вниз только через шаги non-hardened. Другой тип, Hardened Derivation, требует приватных данных и создаёт границу, которую один xpub не пересечёт. В обычной структуре BIP44 такая граница стоит перед каждым аккаунтом. Поэтому экспорт xpub одного аккаунта сам по себе не открывает остальные. Важен и уровень экспорта: xpub только ветви получения позволяет видеть меньше, чем xpub всего аккаунта, который обычно охватывает также адреса сдачи. [1] [6]

Из одинаковых публичных ключей можно получить разные Bitcoin-адреса, применив разные правила. Выход транзакции — это запись суммы и условий, на которых её можно потратить в дальнейшем. Приложению нужно знать тип выходов, например Native SegWit или Taproot, а также ветвь и номера для вывода ключей. Префиксы ypub и zpub по SLIP-0132 могут подсказать тип адресов, но не описывают кошелёк целиком. Output Descriptor передаёт настройки точнее: это текстовое описание ключей и правил создания адресов и условий расходования. В нём могут быть происхождение ключа, путь вывода и контрольная сумма для обнаружения опечаток. Она проверяет целостность записи, а не надёжность отправителя. Не всякий descriptor содержит только публичные данные: в нём может быть и приватный ключ. Перед передачей важно различать эти варианты. [2] [3] [4]

Сначала проверьте сеть, выбранный аккаунт, тип адресов и путь вывода — инструкции, указывающие место ключа в дереве. Сравните несколько адресов получения с исходным кошельком. Для аппаратного кошелька используйте доверенный экран устройства по инструкции производителя. Совпадения названия аккаунта недостаточно. Нулевой баланс после импорта не обязательно означает потерю денег: возможно, выбран другой аккаунт или тип адресов либо проверяется слишком узкий диапазон их номеров. Не вводите слова восстановления на случайном сайте ради решения этой проблемы. Если нужен только просмотр, ищите экспорт публичной конфигурации, а не Seed Phrase или xprv, то есть расширенного приватного ключа. [4] [5]

Сам xpub не является ключом для подписи. Но в BIP32 есть важная связь: родительский xpub, в документации parent xpub, вместе с приватным ключом потомка non-hardened позволяет вычислить родительский приватный ключ. Для более далёкого потомка все шаги до этого родителя должны быть non-hardened, а соответствующий путь должен быть известен для вычисления. Это не кража по одному лишь знанию адреса. Опасно сочетание утёкших публичных данных и секретного ключа из той же ветви. Так злоумышленник может получить и другие ключи, производные от этого родительского ключа. Границы hardened разделяют аккаунты, но не защищают приватный ключ, который уже раскрыт. [1]

Кошелёк Multisig может требовать, например, две подписи из трёх ключей. Но знать, что вы способны восстановить два ключа, ещё недостаточно. Для воспроизведения правильных условий расходования нужны также публичные данные остальных участвующих ключей, их порядок, необходимое число подписей и правила вывода. Поэтому вместе с секретными резервными копиями сохраняют конфигурацию кошелька, например публичный descriptor со всеми нужными xpub. Сама конфигурация не даёт права тратить, но может оказаться необходимой для восстановления. Master fingerprint — идентификатор исходного ключа из восьми шестнадцатеричных символов — помогает сопоставить настройки. Это не гарантированно уникальное удостоверение: разные ключи могут иметь одинаковый fingerprint. [4] [5]

Публичный ключ позволяет проверять подписи, созданные соответствующим приватным ключом. BIP32 добавляет к нему chain code — 32-байтовое значение для вывода следующих ключей. Эта пара образует расширенный публичный ключ. Формат для передачи также содержит версию и положение в дереве: глубину, fingerprint непосредственного родителя и номер дочернего ключа. Это не то же самое, что полный путь от первого ключа кошелька. Поэтому xpub — не отдельный адрес получения, не пароль аккаунта и не список транзакций. Наблюдающий кошелёк ищет транзакции в цепочке для соответствующих адресов. [1]

Функция CKDpub по BIP32 принимает публичный ключ родителя, его chain code и номер потомка. С помощью HMAC-SHA512, криптографического вычисления с этими входными данными, она подготавливает значения для следующего публичного ключа и нового chain code. Номера, доступные для публичного вывода, лежат от 0 до 2³¹−1. Номера hardened начинаются с 2³¹ и в путях обычно отмечаются апострофом или буквой h; для них CKDpub с одним xpub недостаточно. Повторение допустимых шагов даёт потомков экспортированного ключа, но не его братьев или предков. Если возникает редкий недопустимый результат, описанный в BIP32, реализация переходит к следующему индексу. Обычному пользователю не нужно выполнять эти вычисления вручную; важно правильно перенести конфигурацию. [1]

До текстового кодирования стандартная запись BIP32 занимает 78 байтов: версия 4, глубина 1, fingerprint родителя 4, номер потомка 4, chain code 32 и данные ключа 33 байта. Base58Check добавляет контрольную сумму и превращает запись в 111 символов. Публичный вариант для основной сети Bitcoin начинается с xpub, для тестовой — с tpub. Соответствующие приватные варианты начинаются с xprv и tprv. Tpub не означает Taproot. Префикс определяется байтами версии и сам по себе не описывает все правила адресов. При импорте программа должна проверять также корректность публичного ключа, а не только первые буквы или длину. [1] [3]

Для полной картины прочитайте эту статью вместе с HD Wallet, Watch-only Wallet, Приватность в Bitcoin, Derivation Path, Bitcoin, Output Descriptor. На эту статью также ссылаются HD Wallet, Cold Storage, Watch-only Wallet, Output Descriptor.

DOC · 001BIP 32 — Hierarchical Deterministic WalletsСпецификация DOC · 002BIP 380 — Output Script Descriptors General OperationСпецификация DOC · 003SLIP-0132 — Registered HD Version BytesСпецификация DOC · 004Bitcoin Core — Output DescriptorsДокументация DOC · 005Trezor — What Is a Public Key (XPUB)?Документация DOC · 006BIP 44 — Multi-Account Hierarchy for Deterministic WalletsСпецификация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией