Введение в технологию Блокчейн. Тимур Сергеевич Машнин
значение дополнительных данных из стека и игнорирует его.
Это всего лишь причуда языка биткойнов, и с этим приходится иметь дело, добавляя в стек дополнительную фиктивную переменную.
Ошибка была в первоначальной реализации, и затраты на ее исправление намного выше, чем причиненный ущерб, как мы увидим позже.
На данный момент эта ошибка считается просто особенностью биткойна.
Чтобы выполнить скрипт на стековом языке программирования, все, что нам понадобится, это стек, в который мы можем вносить данные и из которого можем извлекать данные.
Нам не нужна никакая дополнительная память или переменные.
Это делает скрипт простым в вычислении.
В скрипте существует два типа инструкций: инструкции данных и коды операций или опкоды.
Когда в скрипте появляется инструкция данных, эти данные просто вставляются в верхнюю часть стека.
С другой стороны, опкоды выполняют некоторую функцию, часто беря данные, находящиеся вверху стека, как входные данные.
Теперь давайте посмотрим, как выполняется Bitcoin скрипт.
Здесь мы показываем состояние стека после каждой инструкции.
Первые две инструкции в этом скрипте – это инструкции данных – подпись и публичный ключ этой подписи.
Они были указаны в элементе scriptSig или входном скрипте.
Как мы уже сказали, когда мы видим инструкцию данных, мы просто вносим данные в стек.
Дальше идет скрипт scriptPubKey.
Здесь сначала у нас есть команда дублирования OP_DUP, поэтому мы просто вносим копию публичного ключа в верхнюю часть стека.
Следующей инструкцией является OP_HASH160, в которой говорится, что нужно вытолкнуть из стека верхнее значение, вычислить его криптографический хеш и внести результат в верхнюю часть стека.
Когда эта команда завершит выполнение, мы заменим публичный ключ на вершине стека его хешем.
Здесь речь идет о публичном ключе текущего владельца биткойнов.
Затем мы вносим в стек хэш публичного ключа, который был указан в предыдущей транзакции как получатель монет и который должен использоваться для создания подписи, чтобы потратить полученные монеты.
Таким образом, на данный момент в верхней части стека есть два значения.
Существует хэш публичного ключа, который был указан в выходном скрипте, и хэш публичного ключа, который используется при трате монет и который указан во входном скрипте.
На этом этапе мы запускаем команду EQUALVERIFY, которая проверит, что эти два значения в верхней части стека равны.
Если это не так, произойдет ошибка, и скрипт прекратит выполнение.
В нашем примере мы будем считать, что они равны, то есть получатель монет использовал правильный публичный ключ.
Эта инструкция потребляет те два элемента данных, которые находятся в верхней части стека.
И теперь стек содержит два элемента – подпись и публичный ключ, который использовался для этой подписи.
Мы уже проверили, что этот публичный ключ является публичным ключом, который требуется,