Является ли значение «Истина» в середине стека действительной транзакцией?

Если в середине выполнения scriptSig + scriptPubKey мы получим значение «True», а в стеке остались значения или операторы, транзакция действительна? Или стек должен быть пустым + верхний результат равен «Истина»? Я считаю, что это не потому, что кто-то может просто отправить сценарий разблокировки с «OP_TRUE» и разблокировать любой UTXO.

Ответы (2)

В отличие от книги 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).