61 / 736DESC

Output Descriptor

Дескриптор выхода

Восстановить ключи — ещё не всегда значит найти нужные адреса. Кошельку также нужны правила, по которым он их создавал. Output Descriptor точно записывает эти правила, чтобы другой совместимый кошелёк мог их прочитать. Это особенно важно, когда ты самостоятельно хранишь средства с помощью нескольких ключей.

Output Descriptor — это текстовое описание ключей и правил, по которым кошелёк должен создавать выходы Bitcoin: записи сумм и условий последующего расходования средств. Оно помогает воссоздать правильные адреса и найти связанные с ними платежи. Это не транзакция и не полная резервная копия. Описание может содержать только публичные данные либо также секретные ключи.

Анна меняет приложение, в котором следит за своим аппаратным кошельком. Она хочет видеть свои средства в новом приложении, не вводя слова восстановления в компьютер. Слова восстановления, или Seed Phrase, — это резервная копия, из которой можно восстановить ключи кошелька. Публичный descriptor подскажет новому приложению, какие публичные ключи использовать и как получить те же адреса. Представь точную инструкцию по построению адресов, а не ещё один пароль. Для обычного кошелька программа нередко сама определяет стандартные настройки. Но при необычной конфигурации или Multisig (кошелёк с несколькими ключами для подписи) полагаться на догадки нельзя. Descriptor ничего не переводит и не меняет уже полученные платежи. Он описывает правила, которые необходимо сохранить при восстановлении. [1] [8]

Приватный ключ позволяет создать цифровую подпись, разрешающую расходование средств. Публичный ключ позволяет проверить эту подпись, но не создать её. Публичный descriptor может содержать xpub — данные, позволяющие получать новые публичные ключи, но не подписывать платежи. Это подходит для Watch-only Wallet: он наблюдает за платежами, однако сам отправить их не может. Такой экспорт всё равно стоит защищать ради приватности: он способен связать множество твоих адресов и их историю. Другой descriptor может содержать xprv, расширенный приватный ключ, либо WIF, способ записи отдельного приватного ключа. Это уже секретные данные, которые при соответствующих условиях могут позволить расходование средств. Не отправляй их в онлайн-проверку и не храни как безобидную заметку. Публичная конфигурация не заменяет резервных копий, необходимых для подписи. [1] [8]

После импорта Анна сравнивает несколько адресов получения с исходным кошельком. Для аппаратного кошелька она проверяет адреса на доверенном экране устройства по инструкции производителя. Также проверяет настройку ветви сдачи — той части, куда при оплате возвращается неиспользованный остаток. Одинакового названия счёта недостаточно. Прежде чем полагаться на новую копию, Анна проверяет весь процесс восстановления своего кошелька, не раскрывая секретные ключи без необходимости. Если приложение не поддерживает descriptor или показывает другие адреса, сначала нужно разобраться с совместимостью, сетью и настройками. Переписывать незнакомое выражение наугад — небезопасное исправление. [5] [8]

Для кошелька, требующего две подписи из трёх, недостаточно иметь два набора слов восстановления и помнить, что «было два из трёх». Чтобы воссоздать правильные условия расходования, нужны публичные данные всех трёх ключей, правила их получения и точный тип скрипта. Скрипт задаёт условия, которые нужно выполнить для расходования средств. Техническая запись multi(k,...) использует указанный порядок ключей; k — необходимое число подписей. Вариант sortedmulti(k,...) при построении каждого скрипта сортирует полученные публичные ключи по их байтам. Это разные правила, а не взаимозаменяемые названия. Поэтому сохраняй полный экспорт конфигурации, а резервные копии ключей для подписи защищай отдельно. Списка названий устройств недостаточно. [2] [8]

После символа # могут стоять восемь символов checksum — контрольной суммы, определённой в BIP380. Она позволяет программе обнаруживать многие ошибки копирования. Но это не подпись автора, не шифрование и не доказательство того, что descriptor принадлежит тебе. Тот, кто намеренно подставит собственные ключи, сможет вычислить и новую правильную сумму. Поэтому проверять текст нужно вместе с адресами и происхождением конфигурации. Если приложение сообщает об ошибке суммы, сначала заново получи исходный экспорт. Простое создание новой суммы может лишь согласовать её с уже повреждённым текстом. [1]

Перед ключом может быть [fingerprint/path] — информация о его происхождении, или key origin. Fingerprint — короткий идентификатор исходного ключа; path — путь, по которому получен ключ, записанный дальше. Это помогает подписывающему устройству найти нужный ключ. После xpub может идти другой путь для получения отдельных адресов. У этих частей разные задачи, это не просто подпись к счёту. Разные ключи могут случайно иметь одинаковый fingerprint, поэтому он не подтверждает подлинность устройства. Публичный экспорт также не может произвольно проходить через Hardened Derivation — шаг, требующий приватных данных. Экспортирующее приложение должно выбрать подходящий уровень ключа. [1]

Звёздочка в /* означает последовательную подстановку чисел, например 0, 1 и 2. Такой ranged descriptor описывает больше одного адреса; при конкретной операции программа задаёт обрабатываемый диапазон индексов. Запись <0;1> по BIP389 может охватывать две ветви, обычно получение и сдачу, если приложение её поддерживает. Но сам descriptor не ведёт список использованных адресов и не запоминает следующий свободный номер. Gap limit — количество последовательных неиспользованных адресов, после которых поиск прекращается, — тоже не становится частью выражения автоматически. Неиспользованный означает без истории транзакций: адрес, на который поступали средства, позднее потраченные, не считается неиспользованным. Поэтому при восстановлении могут понадобиться состояние кошелька и поиск в достаточно широком диапазоне. [5] [6] [9]

Выход транзакции содержит scriptPubKey — скрипт, задающий условия последующего расходования. Descriptor объясняет, как его построить. Выражение wpkh(KEY) описывает Native SegWit с одним ключом; KEY здесь условное обозначение, а не настоящий ключ. Обёртка sh(wpkh(KEY)) меняет формат выхода и адрес, хотя ключ остаётся прежним. Есть также pk(), pkh(), wsh(), addr() и raw(). Это не взаимозаменяемые варианты: например, addr() описывает известный адрес, но сам не добавляет недостающие данные для расходования его средств. Этот раздел — справка по настройке, а не требование к новичку писать descriptor вручную. [1] [8]

Выход Taproot можно потратить подписью ключа либо по прикреплённым скриптовым условиям, если они в нём есть. Запись tr(KEY) задаёт внутренний ключ без доступной для расходования скриптовой ветви; tr(KEY,TREE) добавляет дерево скриптов. Значит, сохранить нужно не только перечень ключей. Важно и то, как скрипты сгруппированы в дереве: изменение группировки может изменить общий хеш Merkle root и итоговый адрес, даже если сами условия остались прежними. При этом не каждая перестановка ветвей меняет результат. Miniscript помогает записывать и анализировать условия, а multi_a описывает несколько подписей в Tapscript, скриптовом языке Taproot. Ни одно из них само по себе не заменяет полного экспорта конфигурации. [3] [8]

RPC — это интерфейс для передачи команд программе из другой программы или командной строки. В Bitcoin Core 29 RPC-команда getdescriptorinfo разбирает запись. Она возвращает публичную форму без приватных ключей и поля checksum, isrange, issolvable и hasprivatekeys. Последнее сообщает, содержал ли ввод приватный ключ; issolvable не означает, что у тебя есть секретные ключи для подписи. Команда deriveaddresses позволяет сравнить полученные адреса. При импорте importdescriptors также принимает timestamp, active, internal, range и next_index: начальное время поиска истории, признак активной конфигурации, принадлежность к внутренней ветви сдачи, диапазон и следующий индекс адреса. Rescan — повторный поиск транзакций в цепочке. Слишком поздний timestamp может пропустить старые платежи; сама смена descriptor не переводит и не удаляет их. После импорта нужна новая резервная копия кошелька. Эти команды следует выполнять в собственной доверенной установке программы, а не в чужой веб-форме. [5] [7] [8]

Для полной картины прочитайте эту статью вместе с Кошелёк, Watch-only Wallet, Multisig, PSBT, Miniscript, Bitcoin. На эту статью также ссылаются Watch-only Wallet, Extended Public Key (xpub), PSBT, Самостоятельное хранение.

DOC · 001BIP 380 — Generic Output Script DescriptorsСпецификация DOC · 002BIP 383 — multi() and sortedmulti() DescriptorsСпецификация DOC · 003BIP 386 — tr() Output Script DescriptorsСпецификация DOC · 004Bitcoin Core — Output DescriptorsДокументация DOC · 005Bitcoin Core RPC — importdescriptorsДокументация DOC · 006BIP 389 — Multipath DescriptorsСпецификация DOC · 007Bitcoin Core 29 RPC — getdescriptorinfoДокументация DOC · 008Bitcoin Core 29 — Output DescriptorsДокументация DOC · 009BIP 44 — Multi-Account Hierarchy for Deterministic WalletsСпецификация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией