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

Стоит рассмотреть самый распространенный замок в истории Биткоина, P2PKH, строка за строкой. Он говорит: дублируйте то, что находится наверху, вычислите hash160 этого, добавьте в стек этот хэш, который я сохранил, проверьте, что они равны, и остановитесь, если нет, и, наконец, проверьте подпись.
Тот, кто хочет потратить, предоставляет две вещи: подпись и открытый ключ. Они оба сначала добавляются в стек, а затем запускается замок. Дублирование существует, потому что открытый ключ будет использоваться дважды: один раз для превращения в хэш и сравнения с адресом, другой — для проверки подписи. Сравнение хэшей — это момент, когда сеть подтверждает, что этот открытый ключ действительно принадлежит адресу. Проверка подписи — это момент, когда она подтверждает, что тот, кто представил ключ, также имеет соответствующий закрытый ключ.
Обратите внимание на то, что только что произошло. Два вопроса из Модуля 4 — этот адрес принадлежит этому ключу, и эта подпись принадлежит этому ключу — не являются скрытыми правилами в программе узлов. Они написаны, в миниатюре, внутри самой монеты.
Современный формат, P2WPKH, делает то же самое с меньшим количеством слов. Замок становится просто маркером версии, за которым следует hash160, а подпись и открытый ключ передаются в отдельной области транзакции, называемой свидетельством. Узел распознает шаблон и применяет ту же проверку, не требуя её записи. Меньше байтов, та же гарантия, меньшая комиссия.
Теперь самое важное: что Script не делает. У него нет циклов. Ни одна инструкция не возвращается назад, ни одна программа не может выполнить один и тот же фрагмент дважды. Каждое выполнение завершается, и завершается быстро, на любом узле в мире. Это ограничение не является леностью проектирования: оно гарантирует, что проверка блока занимает предсказуемое время, и что никто не сможет заблокировать сеть, написав замок, который никогда не заканчивается.

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

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