Перейти к содержимому
buybitcoinsmart

Глоссарий / Справочник разработчика

Скрипт публичного ключа

Другие названия: Pubkey script, scriptPubKey, скрипт блокировки.

Что такое скрипт публичного ключа?
Скрипт публичного ключа представляет собой короткий фрагмент Bitcoin Script, прикрепленный к каждому выходу транзакции и задающий условия, которые должны быть выполнены, прежде чем биткоины в этом выходе снова смогут перемещаться.

Биткоины хранятся не в адресе; они находятся в выходах, каждый из которых защищен скриптом публичного ключа. Bitcoin Core называет это поле scriptPubKey, и для обычного современного выхода оно имеет длину 22 или 34 байта. Когда вы даете кому-то адрес, вы передаете ему рецепт скрипта публичного ключа, который запишет его кошелек.

Как это работает

Каждый выход в сериализованной транзакции состоит из трех элементов подряд: восемь байт стоимости в сатоши, префикс длины и сам скрипт публичного ключа. Ничто в выходе не называет получателя. Получателем является сам скрипт, а адрес представляет собой лишь кодировку с контрольной суммой нескольких байт внутри него.

Пять шаблонов охватывают почти все, что есть в блокчейне сегодня. Устаревший замок pay-to-public-key-hash занимает 25 байт и включает четыре опкода вокруг хеша длиной 20 байт. Замок pay-to-script-hash занимает 23 байта и заканчивается на OP_EQUAL. Нативный SegWit намеренно устроен проще: байт версии, за которым следует одна вставка данных, 22 байта для одного ключа и 34 байта для хеша скрипта, без какой-либо логики в самом выходе. Taproot также занимает 34 байта: байт версии и ключ длиной 32 байта.

Политика ретрансляции распознает этот короткий список и отказывается передавать что-либо иное, поэтому нельзя придумать собственный формат выхода и ожидать, что кошелек его оплатит. Консенсус здесь мягче политики, но практический результат таков: пять шаблонов составляют все меню.

Название осталось от прошлого, как окаменелость. В самых ранних транзакциях скрипт действительно содержал публичный ключ: выход coinbase генезис-блока занимает 67 байт и содержит несжатый ключ длиной 65 байт, за которым следует OP_CHECKSIG, и это можно прочитать в исходном коде самого Bitcoin Core. Оплата по хешу, а не по ключу, стала нормой в 2011 году, и сегодня большинство скриптов публичного ключа вообще не содержат публичного ключа, а лишь фиксируют обязательство на него.

Где это встречается

Попросите любой узел декодировать сырую транзакцию, и каждый выход будет нести объект scriptPubKey с четырьмя полями: читаемая человеком сборка, сырой шестнадцатеричный вид, строка типа и адрес, которому соответствует тип. Обозреватели блоков показывают то же самое, обычно под названием locking script или output script.

Здесь же размещается настройка кошелька для наблюдения. Импорт адреса означает указание вашей программе, какие скрипты публичного ключа ей сканировать в блокчейне, поэтому дескриптор, определение, порождающее все семейство скриптов, которые может создать ключ, заменил импорт адрес за адресом в серьезных инструментах.

Практический навык чтения краток. Если скрипт начинается с 0 и содержит 20 байт, кто-то потратит его одной подписью и дешевым входом. Если он содержит 32 байта, за ним стоит контракт, которого вы не видите. Если он начинается с 1 и содержит 32 байта, это Taproot, и это может быть один ключ или целое дерево условий с одинаковым обликом.

Скрипт публичного ключа vs скрипт подписи

Скрипт публичного ключа ставит вопрос, а скрипт подписи пытается на него ответить, и их пишут разные люди в разное время. Тот, кто отправляет вам деньги, пишет скрипт публичного ключа по адресу, который вы ему дали, и оплачивает его байты. Вы пишете скрипт подписи позже, когда тратите, и платите за эти байты сами. Поэтому отправка на адрес Taproot стоит отправителю несколько больше, чем отправка на устаревший адрес, но экономит вам значительно больше, когда вы в итоге перемещаете биткоины. Кроме того, оба скрипта выполняются отдельно, а не как одна объединенная программа; это изменение было внесено в 2010 году после того, как первоначальное совместное исполнение оказалось уязвимым для эксплуатации.

Не путать с

Часто задаваемые вопросы

Являются ли адрес биткоина и скрипт публичного ключа одним и тем же?

Нет. Адрес представляет собой кодировку, которую отправляющий кошелек превращает обратно в скрипт публичного ключа. У некоторых скриптов, например у простого выхода OP_RETURN, адреса нет вовсе, поэтому обозреватели иногда показывают выход со скриптом, но без получателя.

Почему он называется скриптом публичного ключа, если не содержит публичного ключа?

Название происходит из 2009 года, когда выходы действительно содержали необработанный публичный ключ, за которым следовал OP_CHECKSIG. Оплата по хешу ключа заменила этот шаблон в 2011 году, но имя поля scriptPubKey осталось в коде и документации.

Связанные термины

Еще в разделе «Справочник разработчика»

Читать эту страницу на английском