Глоссарий / Справочник разработчика
Скрипт подписи
Другие названия: scriptSig, Скрипт разблокировки.
- Что такое скрипт подписи?
- Скрипт подписи представляет собой данные разблокировки, которые вход несет, чтобы удовлетворить скрипт публичного ключа выхода, который он тратит, а в современных входах SegWit он пуст.
Каждый вход в транзакции указывает на более ранний выход и должен доказать, что ему разрешено его потратить. Bitcoin Core называет это поле scriptSig; во входе legacy pay-to-public-key-hash оно содержит подпись размером 71 или 72 байта и публичный ключ размером 33 байта, примерно 107 байт. С появлением SegWit это доказательство обычно находится в другом месте, и в этом в основном причина, по которой вывод на адрес bech32 стоит вам меньше.
Как это работает
Скрипт подписи выполняется первым и оставляет свои результаты в стеке, чтобы их использовал скрипт выхода. Они не выполняются как одна объединенная программа: они выполняются последовательно, и стек передается от одного к другому; это разделение было введено в 2010 году, после того, как исходный дизайн оказался уязвим для эксплуатации.
Политика ретрансляции требует, чтобы это поле содержало только вставки данных. Никаких условий, никакой арифметики, никакого опкода, который выполняет работу. Ограничение существует потому, что тот, кто тратит, полностью управляет этими байтами, и если позволить атакующему выполнять логику на входе, снова открываются проблемы, которые сеть закрыла давно. Pay-to-script-hash превращает это правило в требование консенсуса, а не в предпочтение, поскольку скрипт выкупа должен приходить как последняя простая вставка данных.
Его размер полностью зависит от того, что он разблокирует. Вход legacy с одним ключом несет подпись и ключ. Вложенный вход SegWit несет ровно 23 байта, одну вставку данных с программой свидетеля размером 22 байта, а все остальное переносит в свидетель. Нативный вход bech32 или bech32m не несет ничего: сериализованное поле представляет собой один байт нулевой длины.
Есть один вход, скрипт подписи которого не является доказательством чего-либо. Единственный вход транзакции coinbase не имеет более раннего выхода для разблокировки, поэтому поле используется как свободное пространство размером от 2 до 100 байт, и с BIP-34 оно должно начинаться с высоты блока. Майнеры подписывали там сообщения, голоса и шутки с 2009 года.
Где это видно
Декодируйте любую транзакцию, и каждый вход покажет объект scriptSig с представлением в виде ассемблера и в шестнадцатеричном виде. Во входах нативного SegWit или Taproot оба представления являются пустыми строками, а отдельное поле свидетеля содержит данные; эта визуальная асимметрия является самым быстрым способом на глаз определить, какой формат адреса использовался в старой транзакции.
Это также объясняет широко неверно понимаемый эпизод истории. Поскольку scriptSig входил в расчет идентификатора транзакции, третья сторона могла повторно закодировать подпись, не делая ее недействительной, и изменить идентификатор уже транслированной транзакции. Mt. Gox приостановила вывод средств в феврале 2014 года и возложила вину именно на такое поведение, хотя последующий академический анализ цепочки обнаружил, что объем транзакций, подвергшихся малеабельности, был слишком мал, чтобы объяснить пропавшие биткоины. SegWit положил конец спору в августе 2017 года, полностью исключив данные разблокировки из расчета идентификатора.
Скрипт подписи vs данные свидетеля
Скрипт подписи и данные свидетеля несут один и тот же вид доказательства, и SegWit перенес эту задачу с одного на другое, не изменив того, что означает подпись. Важные для вас различия: цена и постоянство. Байты свидетеля оплачиваются по одной весовой единице каждый, тогда как байты скрипта подписи стоят четыре, поэтому идентичное расходование с одним ключом занимает примерно 148 виртуальных байт, когда доказательство находится в scriptSig, и примерно 68, когда оно находится в свидетеле. Данные свидетеля также находятся вне идентификатора транзакции, поэтому идентификатор расхода нельзя изменить в пути. Вход legacy по-прежнему использует старое поле, поэтому биткоины, лежащие на адресе, начинающемся с 1, незаметно стоят дороже при каждом их перемещении.