в чем разница между OP_CHECKMULTISIG и OP_CHECKMULTISIGVERIFY

Я хотел бы узнать разницу, объясненную как можно проще, между OP_CHECKMULTISIG/OP_CHECKMULTISIGVERIFY и OP_CHECKSIG/OP_CHECKSIGVERIFY. Единственное объяснение, которое я нашел: то же, что и OP_CHECKMULTISIG (или то же, что и OP_CHECKSIG), за исключением того, что OP_VERIFY выполняется позже.

Для OP_VERIFY: пометить транзакцию как недействительную, если значение верхнего стека не соответствует действительности.

Можно ли это лучше объяснить? Чем отличаются OP_CHECKMULTISIGVERIFY и OP_CHECKMULTISIG на практике и в логике создания скриптов? Каковы эффекты (за и против) выполнения OP_VERIFY после или до? Примеры будут высоко оценены.

Ответы (1)

OP_CHECKMULTISIG, OP_CHECKSIG, OP_EQUAL помещают в стек значение true или false. Это означает, что вы можете использовать их с OP_IF или подобным, он не должен немедленно завершать выполнение, если он ложный. OP_VERIFY, как вы цитируете, пометит транзакцию как недействительную для верхнего элемента стека.

Это означает, что каждый скрипт с расширенной логикой и несколькими OP_IF и OP_ENDIF должен заканчиваться OP_VERIFY в случае, если между if и endifs есть только OP_CHECKSIG и OP_CHECKMULTISIG?
Это означает, что следующий сценарий недействителен: IF 2 <Ключ Алисы> <Ключ Боба> 2 CHECKMULTISIGVERIFY ELSE <Ключ Боба> CHECKSIGVERIFY SHA256 <хэш_секрета> EQUALVERIFY ENDIF
Вы использовали VERIFY в этом скрипте, вы хотели? Вам не нужно заканчивать OP_VERIFY, скрипт все еще будет действителен в конце, если в стеке находится ненулевое (истинное) значение. Версии VERIFY в основном используются для того, чтобы пометить его как недействительный на ранней стадии, а не для оценки всего сценария, например, вы можете использовать «return false»; на Java или С++
Спасибо. В моем примере второе условие после else (предоставление секрета) даже не будет проверяться, если первое условие не выполняется, потому что checkmultisigverify немедленно завершит скрипт. Понял?
Ага, правильно :)
Большое спасибо. Это сбивало с толку, потому что в bip65 на github есть такой пример: IF <service pubkey> CHECKSIGVERIFY ELSE <expiry time> CHECKLOCKTIMEVERIFY DROP ENDIF <user pubkey> CHECKSIG, но, возможно, здесь ошибка в документации.