Schnorr Signature — цифровой способ одобрить конкретное сообщение, не раскрывая приватного ключа. Кошелёк создаёт подпись этим секретным ключом; остальным для проверки достаточно соответствующего открытого ключа. В Bitcoin подпись помогает подтвердить право потратить монеты, но не заменяет другие проверки транзакции. Вариант для Bitcoin определяет BIP340; он используется с Taproot.
Алиса хочет отправить биткоины Бобу. Кошелёк — приложение или устройство для получения и отправки биткоинов. Кошелёк собирает транзакцию и закрытым ключом подписывает данные, предусмотренные выбранным режимом подписи. Затем узел проверяет подпись и все остальные условия расходования. Узел — программа, которая проверяет транзакции и блоки и обменивается данными с другими участниками сети. Сама по себе действительная подпись не удостоверяет личность Алисы по документам, правильность получателя или наличие достаточных неизрасходованных средств: это отдельные вопросы. Подписанный платёж всё ещё может оказаться непреднамеренной ошибкой. [5] [3] [10] [11]
BIP340, авторами которого являются Pieter Wuille, Jonas Nick и Tim Ruffing, точно определяет подпись Шнорра для Bitcoin. BIP341 включает её в правила расходования Taproot, активированные в основной сети Bitcoin (Mainnet) на блоке 709632 в 2021 году. Блок объединяет транзакции в пакет, добавляемый в общую историю. Это два уровня: алгоритм подписи и условия расходования. Старые выходы и SegWit v0 по-прежнему используют ECDSA, прежний алгоритм подписи; обновление не заменило их подписи задним числом. [1] [2] [11]
Байт — обычная единица объёма данных. Вариант для Bitcoin использует эллиптическую кривую secp256k1 — математическую структуру для работы с ключами и подписями. BIP340 задаёт фиксированный формат подписи длиной 64 байта. Открытый ключ записывается как 32 байта координаты x; x-only не означает пропуска проверки безопасности. Правила также однозначно определяют, какой вариант точки кривой должен использовать проверяющий. Компактный и точно описанный формат удобен программам, но по этим двум числам нельзя определить размер всей транзакции. [1] [12]
Кошелёк подписывает не расплывчатое «согласен». Режим sighash определяет, какие данные транзакции образуют подписываемое сообщение. SIGHASH_DEFAULT защищает сведения обо всех входах и выходах, подобно SIGHASH_ALL: какие ранее полученные монеты расходуются и какие новые суммы с условиями расходования создаются. Изменение охваченных данных делает подпись недействительной. Это не означает подписание каждого байта, например других подписей. Остальные допустимые режимы имеют иной охват. Сама подпись занимает 64 байта; для режима, отличного от стандартного, добавляется байт типа, поэтому этот элемент занимает 65 байт. Это по-прежнему не размер всего входа или транзакции. [2]
При подписании создаётся секретное значение nonce. Его повторное использование для разных сообщений с одним ключом может раскрыть закрытый ключ. Поэтому BIP340 точно описывает получение nonce и рекомендует вспомогательные случайные данные для дополнительной защиты реализации. Пользователь не придумывает nonce и не записывает её в резервную копию. Ею управляет проверенная библиотека подписи; импровизация здесь способна сломать даже корректную криптографию. [1] [9]
Математическая структура подписей Шнорра позволяет строить протоколы, в которых несколько людей согласуют сообщение и создают общую подпись. Пример — MuSig2 по BIP327. В базовом варианте этого протокола нужен вклад каждого члена выбранной группы. Он требует координации, правильной обработки ключей и собственного безопасного порядка работы с nonce. Просто сложить произвольные готовые подписи недостаточно. Поддержка Schnorr Signature сама по себе ещё не означает, что кошелёк умеет организовать такое сотрудничество. [8]
Taproot предлагает разные пути расходования. При key path сеть проверяет подпись относительно открытого ключа, записанного в выходе. За ним может стоять один человек или сотрудничающая группа. При script path раскрывается выбранный скрипт — программа с условиями, которым должен отвечать платёж. Tapscript — вариант этого скриптового языка для Taproot. Инструкция OP_CHECKSIGADD проверяет одну подпись и при успехе прибавляет единицу к текущему счётчику. Повторяя её, можно проверить несколько отдельных подписей и требуемое количество. Такой скриптовый Multisig отличается от одной агрегированной подписи. У конкретного кошелька выясняйте, кто должен сотрудничать, что станет публичным и какое восстановление останется возможным при потере ключа. [7] [2]
В сети без центрального арбитра один узел не должен принимать подпись, которую другой отклоняет из-за иного прочтения байтов. Поэтому BIP340 подробно определяет допустимые ключи, подписи и процедуру проверки. Он также позволяет batch verification — совместную проверку нескольких подписей ради экономии вычислений. Это не переписывает их записи в блокчейне и не объединяет подписи разных входов транзакции. [1]
Общая подпись key-path может выглядеть как подпись одного ключа. Поэтому по самой подписи не всегда видно, сколько людей договорились. Однако суммы, связи между входами и выходами и время транзакции обычно остаются наблюдаемыми. Schnorr Signature не шифрует платёж. Приватность зависит также от использования Taproot, поведения кошелька и обстоятельств платежа. [2] [3]
Обычному пользователю нужен кошелёк, который верно показывает получателя, сумму и комиссию и обеспечивает надёжное восстановление. Разработчик дополнительно проверяет точную поддержку BIP340, тестовые векторы, работу с nonce и поведение при сбоях. Название алгоритма не гарантирует качество всего продукта. Хорошая библиотека, например libsecp256k1, выполняет криптографические вычисления, но не решает за человека, следует ли одобрять показанный платёж. [4] [9] [6]
Для полной картины прочитайте эту статью вместе с Taproot, MuSig2, Multisig, Bitcoin Script. На эту статью также ссылаются SHA-256, Opcode, MuSig2, Nostr.