Если в середине выполнения scriptSig + scriptPubKey мы получим значение «True», а в стеке остались значения или операторы, транзакция действительна? Или стек должен быть пустым + верхний результат равен «Истина»? Я считаю, что это не потому, что кто-то может просто отправить сценарий разблокировки с «OP_TRUE» и разблокировать любой UTXO.
В отличие от книги Mastering Bitcoin, в биткойн-скрипте нет логического значения «True». Выполненный сценарий транзакции действителен, если верхний элемент, оставшийся в стеке на момент завершения выполнения, отличен от нуля. Для борьбы с пластичностью транзакций BIP62 (версия транзакции 3) также вводит дополнительное требование достоверности, согласно которому стек не должен содержать дополнительных элементов данных, а только одно ненулевое значение.
Я подозреваю, что у вас может быть неправильное представление о том, как выполняется скрипт и что содержится в стеке во время выполнения.
Во-первых, помните, что полный скрипт создается путем сложения двух частичных скриптов в следующем порядке: scriptSig + scriptPubKey.
Каждый элемент полного скрипта является либо значением, помещаемым в стек, либо операцией, которая проверяет и/или манипулирует стеком.
Действительный сценарий выполняется слева направо до тех пор, пока не будет достигнут конец или операция не укажет на сбой. Если сценарий завершается без какой-либо операции, указывающей на ранний сбой, то вершина стека (самая) указывает на сбой/успех. Как уже сказал пользователь Биткойн , любое ненулевое значение считается успешным, а любые элементы ниже вершины стека (в настоящее время) игнорируются.
Если бы кто-то попытался создать tx, чей scriptSig был бы просто OP_TRUE, весь скрипт обычно выглядел бы так:
OP_TRUE OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
Первый шаг скрипта помещается 1
в стек, затем он дублируется, а затем дубликат сверху хэшируется. После выполнения этих первых трех инструкций скрипта вы получите:
Stack:
HASH160(1) <-- stack top
1
Remaining (unexecuted) script: <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
Next <PubkeyHash>
помещается в стек, а затем сравниваются два верхних элемента ( <PubkeyHash>
и HASH160(1)
), что приводит к сбою сценария.
Короче говоря, поскольку scriptPubKey добавляется после scriptSig, scriptSig не имеет возможности "переопределить" то, что scriptPubKey сообщает интерпретатору скрипта в конечном итоге выполнить. (Нет такой инструкции, как «немедленный выход с успехом», которую мог бы включить scriptSig.)
Наконец, пользователь Биткойн также упомянул, что BIP62 изменяет правило «в конце концов игнорировать все, кроме вершины стека». Вероятно, однажды это станет правдой (и в любом случае это не будет иметь никакого значения в этом примере), однако на сегодняшний день правила в BIP62 еще не реализованы (за исключением одного, также упомянутого в BIP66).