Подписи Шнорра в Биткоине: что это и зачем
На текущий момент для генерации пар ключей и для подписи транзакций в Биткоине используется алгоритм ECDSA, алгоритм цифровой подписи на эллиптических кривых. Сам алгоритм по-прежнему надёжен, но он слишком сложный, что значительно ограничивает использование некоторых его механик. BIP-340 вводит подписи Шнорра вместо подписей ECDSA, при этом оставляя ECDSA для генерации пар ключей. Зачем это нужно?
1. Улучшенная безопасность. Алгоритм подписей Шнорра проще, чем ECDSA, и требует меньше обоснований надежности, что снижает количество возможных векторов атаки. Подписи, сделанные ECDSA, могут быть изменены (например другими нодами, передающими транзакцию по сети) даже без доступа к приватному ключу. Эта проблема была частично решена Segwit’ом, а подписи Шнорра окончательно делают подделку невозможной.
2. Новые возможности. Уникальное свойство подписей Шнорра — линейность: подписи можно складывать между собой, а полученную в результате подпись можно проверить ключом, полученным в результате сложения соответствующих публичных ключей. Это открывает новые механики построения мультиподписи и делает их более безопасными.
Что изменится:
1. Закодированные подписи станут короче. Сейчас длина подписи варьируется и занимает обычно 71 байт. Со Шнорром длина будет 64 байта. Благодаря этому транзакции будут занимать чуть меньше места в блоке.
2. Размер публичного ключа уменьшишься с 33 байт до 32 (за счёт того, что y-координата ключа отбрасывается полностью). Мелочь, а приятно.
3. Верифицировать подписи пачкой станет эффективнее.
4. У подписей Шнорра будет полная и точная спецификация. Отсутствие четкой спецификации кодирования ECDSA-подписей и создавало возможность для их изменения.
5. Биткоин продолжит использовать ту же эллиптическую кривую (secp256k1) и те же хеш-функции, что используются сегодня.
Что всё это даёт пользователям? В основном это улучшенные механики мультиподписи.
С мультиподписями в Биткоине изначально было туго. Сначала их нужно было создавать вручную, по-очереди подписывая транзакцию. Потом появился оператор OP_CHECKMULTISIG, который позволял реализовать логику мультиподписи на контрактах Биткоина. Но у этого способа есть один недостаток: используется метод P2SH, перевод биткоинов на хэш скрипта. Чтобы потом вывести эти Биткоины, скрипт нужно раскрыть вместе со всеми адресами-участниками подписи.
Подписи Шнорра позволяют участникам мультиподписи создать общий публичный ключ, перевод на который они и подписывают. Такая транзакция ничем не отличается от обычного перевода биткоинов. Но пока только для схемы n-из-n, т. е. когда подпись должны поставить все участники, а не какое-то минимальное количество.
Следующая мощная штука это adaptor signatures, что можно перевести примерно как частичная подпись. Такая подпись позволяет совершать передачу биткоинов off-chain: сначала вы переводите биткоины на какой-то адрес, а потом, когда, например, покупатель биткоинов выполнит свои обязательства, вы передаёте ему некое число, зная которое он сможет вывести биткоины на свой адрес. Передаются не ключи, а именно число, которое позволяет воссоздать полную подпись. Такими подписями можно соединять транзакции в атомарных свопах и создавать платежные каналы. При этом транзакции ничем не будут отличаться от обычных платежей (P2PKH).
Ну и последняя фишка: протокол слепых подписей, позволяющий подписывать транзакции (и в принципе любые данные) не видя самой транзакции. Это может быть полезно в ситуации, когда требуется подпись третьей стороны, которая не должна ничего знать о параметрах транзакции. Но слипые подписи Шнорра уязвимы к некоторым видам атак.
В итоге, вроде бы небольшое, но очень важное изменение, которое расширяет криптографические алгоритмы Биткоина и улучшает работу с подписями. Обращу внимание на одну очень важную деталь: криптографические алгоритмы забирают в себя логику запрограммированных алгоритмов. Это довольно интересное явление, которое, я надеюсь, мы будет обсуждать ещё не раз.
На текущий момент для генерации пар ключей и для подписи транзакций в Биткоине используется алгоритм ECDSA, алгоритм цифровой подписи на эллиптических кривых. Сам алгоритм по-прежнему надёжен, но он слишком сложный, что значительно ограничивает использование некоторых его механик. BIP-340 вводит подписи Шнорра вместо подписей ECDSA, при этом оставляя ECDSA для генерации пар ключей. Зачем это нужно?
1. Улучшенная безопасность. Алгоритм подписей Шнорра проще, чем ECDSA, и требует меньше обоснований надежности, что снижает количество возможных векторов атаки. Подписи, сделанные ECDSA, могут быть изменены (например другими нодами, передающими транзакцию по сети) даже без доступа к приватному ключу. Эта проблема была частично решена Segwit’ом, а подписи Шнорра окончательно делают подделку невозможной.
2. Новые возможности. Уникальное свойство подписей Шнорра — линейность: подписи можно складывать между собой, а полученную в результате подпись можно проверить ключом, полученным в результате сложения соответствующих публичных ключей. Это открывает новые механики построения мультиподписи и делает их более безопасными.
Что изменится:
1. Закодированные подписи станут короче. Сейчас длина подписи варьируется и занимает обычно 71 байт. Со Шнорром длина будет 64 байта. Благодаря этому транзакции будут занимать чуть меньше места в блоке.
2. Размер публичного ключа уменьшишься с 33 байт до 32 (за счёт того, что y-координата ключа отбрасывается полностью). Мелочь, а приятно.
3. Верифицировать подписи пачкой станет эффективнее.
4. У подписей Шнорра будет полная и точная спецификация. Отсутствие четкой спецификации кодирования ECDSA-подписей и создавало возможность для их изменения.
5. Биткоин продолжит использовать ту же эллиптическую кривую (secp256k1) и те же хеш-функции, что используются сегодня.
Что всё это даёт пользователям? В основном это улучшенные механики мультиподписи.
С мультиподписями в Биткоине изначально было туго. Сначала их нужно было создавать вручную, по-очереди подписывая транзакцию. Потом появился оператор OP_CHECKMULTISIG, который позволял реализовать логику мультиподписи на контрактах Биткоина. Но у этого способа есть один недостаток: используется метод P2SH, перевод биткоинов на хэш скрипта. Чтобы потом вывести эти Биткоины, скрипт нужно раскрыть вместе со всеми адресами-участниками подписи.
Подписи Шнорра позволяют участникам мультиподписи создать общий публичный ключ, перевод на который они и подписывают. Такая транзакция ничем не отличается от обычного перевода биткоинов. Но пока только для схемы n-из-n, т. е. когда подпись должны поставить все участники, а не какое-то минимальное количество.
Следующая мощная штука это adaptor signatures, что можно перевести примерно как частичная подпись. Такая подпись позволяет совершать передачу биткоинов off-chain: сначала вы переводите биткоины на какой-то адрес, а потом, когда, например, покупатель биткоинов выполнит свои обязательства, вы передаёте ему некое число, зная которое он сможет вывести биткоины на свой адрес. Передаются не ключи, а именно число, которое позволяет воссоздать полную подпись. Такими подписями можно соединять транзакции в атомарных свопах и создавать платежные каналы. При этом транзакции ничем не будут отличаться от обычных платежей (P2PKH).
Ну и последняя фишка: протокол слепых подписей, позволяющий подписывать транзакции (и в принципе любые данные) не видя самой транзакции. Это может быть полезно в ситуации, когда требуется подпись третьей стороны, которая не должна ничего знать о параметрах транзакции. Но слипые подписи Шнорра уязвимы к некоторым видам атак.
В итоге, вроде бы небольшое, но очень важное изменение, которое расширяет криптографические алгоритмы Биткоина и улучшает работу с подписями. Обращу внимание на одну очень важную деталь: криптографические алгоритмы забирают в себя логику запрограммированных алгоритмов. Это довольно интересное явление, которое, я надеюсь, мы будет обсуждать ещё не раз.