Средний Урок 2 4 мин чтения

Скрипт: маленький язык, который запирает каждую монету

Каждый выход имеет замок, написанный строчными буквами, а тратить — значит представить ключ, который он принимает.

Каждая монета биткоина заблокирована программой. Она крошечная, преднамеренно простая и выполняется миллиарды раз в день, не привлекая внимания. Язык, на котором она написана, называется Script, был разработан Сатоши вместе с остальным, и понимание его означает понимание того, что именно доказывает транзакция.

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

Только верхний лист можно положить и только верхний лист можно снять.

Стоит рассмотреть самый распространенный замок в истории Биткоина, P2PKH, строка за строкой. Он говорит: дублируйте то, что находится наверху, вычислите hash160 этого, добавьте в стек этот хэш, который я сохранил, проверьте, что они равны, и остановитесь, если нет, и, наконец, проверьте подпись.

Тот, кто хочет потратить, предоставляет две вещи: подпись и открытый ключ. Они оба сначала добавляются в стек, а затем запускается замок. Дублирование существует, потому что открытый ключ будет использоваться дважды: один раз для превращения в хэш и сравнения с адресом, другой — для проверки подписи. Сравнение хэшей — это момент, когда сеть подтверждает, что этот открытый ключ действительно принадлежит адресу. Проверка подписи — это момент, когда она подтверждает, что тот, кто представил ключ, также имеет соответствующий закрытый ключ.

Обратите внимание на то, что только что произошло. Два вопроса из Модуля 4 — этот адрес принадлежит этому ключу, и эта подпись принадлежит этому ключу — не являются скрытыми правилами в программе узлов. Они написаны, в миниатюре, внутри самой монеты.

Современный формат, P2WPKH, делает то же самое с меньшим количеством слов. Замок становится просто маркером версии, за которым следует hash160, а подпись и открытый ключ передаются в отдельной области транзакции, называемой свидетельством. Узел распознает шаблон и применяет ту же проверку, не требуя её записи. Меньше байтов, та же гарантия, меньшая комиссия.

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

Цилиндр играет один раз и останавливается. Нет возврата к началу.

Он также не видит ничего за пределами транзакции. Он не знает сегодняшнюю дату по часам, не проверяет цену, не сохраняет память между транзакциями. Всё, что он решает, он решает с тем, что находится перед ним.

В рамках этих ограничений можно сделать больше, чем кажется. Script требует несколько подписей, и именно так существует мультиподпись из предыдущего урока. Script блокирует монету до определенной даты или до тех пор, пока не пройдет определенное количество блоков — OP_CHECKLOCKTIMEVERIFY, добавленный в 2015 году, буквально является банковским сейфом с часами XIX века, написанным в программном обеспечении. И Script блокирует монету за секретом, освобождая её для того, кто раскроет данные, которые производят определенный хэш, механизм, который поддерживает всю сеть Lightning.

Дверь не подчиняется никому до назначенного времени.

В августе 2010 года Сатоши отключил около пятнадцати инструкций языка одновременно, среди них те, которые объединяли или делили данные, из-за страха перед поведением, которое никто не смог должным образом проанализировать. Решение до сих пор критикуется теми, кто хотел бы более выразительный язык, и защищается теми, кто предпочитает сеть, достаточно маленькую, чтобы её можно было полностью аудировать. Обсуждение остаётся открытым и честным с обеих сторон.

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