Введение в технологию Блокчейн
Шрифт:
Bitcoin язык скриптов был создан специально для биткойнов и называется просто «Скрипт».
Он имеет много общего с языком под названием Forth, который является старым, простым, основанным на стеках языком программирования.
Но вам не нужно изучать Форт, чтобы понимать скрипты биткойнов.
Язык Script был создан, чтобы иметь что-то простое и компактное, но с собственной поддержкой криптографических операций.
Поэтому в нем существуют специальные инструкции для вычисления хеш-функций, а также для вычисления и проверки подписей.
Язык Script
Это означает, что каждая инструкция выполняется ровно один раз, линейно.
В частности, в языке Script биткойнов нет циклов.
Таким образом, количество инструкций в скрипте дает нам верхнюю оценку того, сколько времени потребуется для запуска скрипта и сколько памяти он может использовать.
Этот язык не имеет возможности вычислять произвольно мощные функции.
И по замыслу, именно майнеры должны запускать эти скрипты, которые предоставляются произвольными участниками сети.
Поэтому мы не хотим дать этим произвольным участникам возможность представить сценарий, который может иметь бесконечный цикл.
Таким образом, чтобы проверить, правильно ли новая транзакция потребляет выход предыдущей транзакции, мы создаем комбинированный скрипт, добавляя скрипт scriptPubKey предыдущей транзакции снизу к скрипту scriptSig новой транзакции.
Обратите внимание, что <pubKeyHash?> содержит ?'.
Мы используем это обозначение, чтобы указать, что мы позже проверим, что это значение равно хешу публичного ключа, который предоставлен во входном скрипте.
Есть только два возможных результата при выполнении скрипта биткойнов.
Он либо успешно выполняется без ошибок, и в этом случае транзакция действительна.
Или, если во время выполнения скрипта есть какая-либо ошибка, тогда вся транзакция будет недействительной и не должна приниматься в цепочку блоков.
Язык скриптов биткойнов очень маленький.
В нем есть только 256 инструкций, и каждая из них представлена одним байтом.
Байт состоит из восьми бит. Используя один байт, можно закодировать один символ из 256 возможных (256 = 2 в 8 степени). Таким образом, один байт равен одному символу, то есть 8 битам.
Из этих 256 инструкций, 15 в настоящее время отключены, и 75 зарезервированы.
Зарезервированные инструкции еще не получили никакого специального значения.
Многие из основных инструкций – это те, которые вы ожидаете в любом языке программирования.
Там есть базовая арифметика, базовая логика, такая как ‘if’ и ‘then, выброс ошибки, возврат return.
Наконец, существуют криптографические инструкции, которые включают хеш-функции, инструкции для проверки подписи, а также специальную и важную инструкцию CHECKMULTISIG, которая позволяет проверять несколько подписей в одной инструкции.
Для
Чтобы эта инструкция выполнялась корректно, должно быть не менее t подписей от t из n этих открытых ключей, которые действительны. В этой инструкции мы можем определить компактным образом, что t из n указанных открытых ключей должны дать правильные подписи, чтобы транзакция была действительной.
Позже мы рассмотрим несколько примеров того, как используются мультиподписи.
Кстати, существует ошибка в реализации мультиподписи, и она была там все время.
Инструкция CHECKMULTISIG выталкивает значение дополнительных данных из стека и игнорирует его.
Это всего лишь причуда языка биткойнов, и с этим приходится иметь дело, добавляя в стек дополнительную фиктивную переменную.
Ошибка была в первоначальной реализации, и затраты на ее исправление намного выше, чем причиненный ущерб, как мы увидим позже.
На данный момент эта ошибка считается просто особенностью биткойна.
Чтобы выполнить скрипт на стековом языке программирования, все, что нам понадобится, это стек, в который мы можем вносить данные и из которого можем извлекать данные.
Нам не нужна никакая дополнительная память или переменные.
Это делает скрипт простым в вычислении.
В скрипте существует два типа инструкций: инструкции данных и коды операций или опкоды.
Когда в скрипте появляется инструкция данных, эти данные просто вставляются в верхнюю часть стека.
С другой стороны, опкоды выполняют некоторую функцию, часто беря данные, находящиеся вверху стека, как входные данные.
Теперь давайте посмотрим, как выполняется Bitcoin скрипт.
Здесь мы показываем состояние стека после каждой инструкции.
Первые две инструкции в этом скрипте – это инструкции данных – подпись и публичный ключ этой подписи.
Они были указаны в элементе scriptSig или входном скрипте.
Как мы уже сказали, когда мы видим инструкцию данных, мы просто вносим данные в стек.
Дальше идет скрипт scriptPubKey.
Здесь сначала у нас есть команда дублирования OP_DUP, поэтому мы просто вносим копию публичного ключа в верхнюю часть стека.
Следующей инструкцией является OP_HASH160, в которой говорится, что нужно вытолкнуть из стека верхнее значение, вычислить его криптографический хеш и внести результат в верхнюю часть стека.
Когда эта команда завершит выполнение, мы заменим публичный ключ на вершине стека его хешем.
Здесь речь идет о публичном ключе текущего владельца биткойнов.