Глоссарий / Транзакции и комиссии
Цифровая подпись
Другие названия: Подпись, подпись ECDSA.
- Что такое Цифровая подпись?
- Цифровая подпись является доказательством, созданным с помощью приватного ключа, того, что тот, кто авторизовал транзакцию биткоина, распоряжался ключом, к которому были привязаны ее монеты, и того, что детали не были изменены.
Биткоин больше не использует только ECDSA. Биткоины на адресах, начинающихся с 1, 3 или bc1q, разблокируются подписями ECDSA длиной 71 или 72 байта; биткоины на адресах bc1p используют подписи Schnorr длиной 64 байта, действующие с ноября 2021 года. В любом случае подпись доказывает распоряжение ключом и никогда не доказывает, кем является человек.
Как это работает
Для создания подписи нужны три составляющие: приватный ключ, одноразовое случайное число, называемое nonce, и хеш транзакции в том виде, в каком он обрезан флагом, выбранным для этого входа.
Результат представляет собой пару чисел, вычисленных на кривой secp256k1, эллиптической кривой, которую биткоин использует с самого первого выпуска. Проверка выполняет ту же арифметику в обратном порядке с использованием публичного ключа, и узел выполняет ее внутри кода операции скрипта OP_CHECKSIG. Ни на одном этапе ничего не шифруется, и подпись ничего не раскрывает о приватном ключе, стоящем за ней.
Две используемые схемы упаковывают эту пару по-разному. Подпись ECDSA обернута в DER, поэтому она занимает 71 или 72 байта, а не фиксированную длину, и последний байт вообще не является частью подписи: это флаг, указывающий, какие части транзакции покрыты. Подпись Schnorr по BIP340 занимает ровно 64 байта без обертки, а байт флага полностью опускается, когда применяется значение по умолчанию, поэтому 65 байт появляются только тогда, когда подписывающий хочет чего-то необычного.
Именно nonce и становится источником проблем. Используйте один и тот же дважды с одним и тем же ключом, и приватный ключ вычисляется школьной алгеброй, и это не теоретическая тревога: 11 августа 2013 года bitcoin.org опубликовал предупреждение об ошибке Android, из-за которой кошельковые приложения на затронутых смартфонах генерировали повторяющиеся значения, и в результате биткоины были украдены. Теперь кошельки выводят nonce детерминированно из ключа и сообщения, следуя RFC 6979 для ECDSA и эквивалентному правилу внутри BIP340.
Где это видно
Каждый ваш расход содержит как минимум одну подпись. В обозревателе блоков это длинная шестнадцатеричная строка в witness входа segwit или в скрипте разблокировки входа старого формата, а завершающий 01 у подписей ECDSA является флагом, а не частью математики.
Подписи работают и вне транзакций. Подпись простого сообщения ключом, стоящим за адресом, доказывает, что вы распоряжаетесь этим адресом, не перемещая ни одного сатоши; так биржи проверяют адрес вывода, так составляются подтверждения резервов (Proof of Reserves) и так продавец на одноранговой площадке показывает, что адрес действительно его. Исходный формат работал только для адресов, начинающихся с 1; BIP322 распространяет подпись сообщений на все типы адресов, используемые сегодня.
Это различие важно всякий раз, когда кто-то просит вас что-то подписать. Подписанное сообщение не может переместить биткоины. Подпись транзакции может переместить их все, и единственный надежный способ узнать, о какой из них просят, состоит в том, чтобы прочитать экран аппаратного кошелька, а не сайта.
Цифровая подпись vs хеш подписи
Хеш подписи является входным значением; подпись является выходным. Ваш кошелек сначала строит хеш, покрывающий определенное подмножество транзакции, затем подписывает этот хеш, поэтому подпись ничего не говорит о частях, которые хеш оставил вне себя. Это не техническая формальность. Именно в этом причина существования флагов sighash, и это объясняет, как две подписи одной транзакции могут защищать совершенно разные вещи.