Глоссарий / Справочник разработчика
Контрольная сумма дескриптора
- Что такое контрольная сумма дескриптора?
- Контрольная сумма дескриптора представляет собой восьмисимвольный код после знака # в дескрипторе вывода, код BCH, который ловит опечатки и ошибки копирования до того, как кошелек импортирует не те ключи.
Определено в BIP-380.
Код стоит в конце дескриптора, после одного знака #, в том же алфавите из 32 символов, что и bech32. BIP-380 гарантирует, что любая ошибка, затрагивающая три символа или меньше, будет поймана в дескрипторе длиной до 49 154 символов, а случайная ошибка остается незамеченной примерно один раз на триллион. Без этой проверки один неверный символ в резервной копии мультиподписи оставит вас наблюдать за адресами, на которых ничего нет.
Как это работает
Контрольная сумма дескриптора представляет собой код BCH, вычисляемый по тексту дескриптора, а не хеш от него, и именно это дает гарантии обнаружения ошибок. BIP-380 задает входной алфавит из 95 символов и делит его на три группы, помещая в первую символы без собственной защиты: цифры, скобки, слеши, звездочку-шаблон и строчные буквы от a до h, куда попадают ключи в шестнадцатеричной кодировке и пути деривации. В тексте спецификации говорится о трех группах по 32, хотя ее эталонный код использует 32, 32 и 31.
Каждый символ дает один символ кода, свою позицию внутри группы, и после каждого третьего символа вставляется четвертый, несущий три номера групп в объединенном виде, так что три символа разворачиваются в четыре. Изменение, которое только перемещает символ внутри его группы или только меняет группу, в которой он находится, затрагивает ровно один символ кода. Поэтому ошибка регистра считается ровно ошибкой одного символа, и поэтому один символ, набранный в верхнем регистре, всегда ловится.
Гарантии снижаются по мере роста строки. Ошибка в одном символе обнаруживается всегда; две или три обнаруживаются всегда до 49 154 символов, четыре до 507 символов, пять до 77 символов, при этом код настроен так, чтобы минимизировать необнаруженные ошибки в пять символов вплоть до 387. Файл descriptors.md в Bitcoin Core указывает границу в четыре ошибки как 501 символ, а не 507, и оценивает остаточный риск примерно как один на триллион. Дескриптор с одним ключом в этом документе занимает 140 символов, что укладывается в каждую границу; его пример мультипути 2 из 3 занимает 439, выходя за окно пяти символов и оставаясь внутри окна четырех.
Расширенные ключи уже защищают себя сами. BIP-380 отмечает, что xpub выходит за пределы первой группы и несет собственный механизм контрольной суммы, так что выражение ключа оказывается защищено дважды.
Где это встречается
Тестовые векторы BIP-380 представляют собой самый короткий способ увидеть, как контрольная сумма дескриптора выполняет свою работу. Допустимая строка: raw(deadbeef)#89f8spxm, а среди почти верных вариантов, которые спецификация отвергает, есть отсутствие контрольной суммы, один знак #, контрольная сумма из девяти символов, контрольная сумма из семи символов, raw(deedbeef) со старой контрольной суммой без изменений и полезная нагрузка с символом вне входного алфавита.
Bitcoin Core выводит контрольную сумму при выдаче дескриптора и требует ее при приеме. Каждый вызов RPC, возвращающий дескриптор, добавляет эти восемь символов, тогда как только некоторые требуют ее на входе, среди них deriveaddresses и importdescriptors. Для строки, которую вы набрали или правили вручную, правильную контрольную сумму возвращает getdescriptorinfo.
При разборе контрольная сумма остается необязательной, и BIP-380 допускает, чтобы приложения отвергали дескрипторы без нее. Рассчитывайте увидеть ее, когда переносите схему мультиподписи между координатором, запасной машиной и листом бумаги: эти восемь символов представляют собой единственную часть, которая подтверждает, что остальное дошло в целости.
Контрольная сумма дескриптора vs bech32
Контрольная сумма bech32 защищает адрес, а контрольная сумма дескриптора защищает определение кошелька, и задействованные размеры объясняют разницу в устройстве. BIP-173 ограничивает строку bech32 90 символами и отводит под контрольную сумму последние шесть символов части данных, используя тот же алфавит из 32 символов. У дескриптора такого ограничения нет, и он должен охватывать еще скобки, запятые, кавычки и пробелы, поэтому BIP-380 разворачивает текст в символы позиций с чередующимся символом группы и отводит восемь.
Оба записывают этот результат в одном алфавите, qpzry9x8gf2tvdw0s3jn54khce6mua7l, и отсюда начинается путаница. Отказывает разное. Адресу bech32, не прошедшему свою контрольную сумму, нельзя заплатить; дескриптор, не прошедший свою, представляет собой кошелек, который нельзя восстановить.