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, Самостійне зберігання.