scriptcode, scriptsig, путаница с pubkeyscript

Я несколько дней бился головой о стол, пытаясь правильно понять протокол segwit.

Еще одно препятствие застало меня врасплох, и я изо всех сил пытаюсь понять концепцию «scriptCode:», используемую в примерах подписи bip0143 https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki# Спецификация

Я понимаю, что scriptPubKey - это в основном условия блокировки, накладываемые на вывод при их расходовании. И я также понимаю, что scriptSig должен выкупить ранее заблокированный вывод (предназначенный для моего pubkey/pubkeyhash).

Я довольно хорошо разобрался с тем, что только что сказал выше, когда элементы данных scriptSig помещаются в стек, а затем оцениваются pubKeyHash и т. д. Но теперь есть это странное поле «scriptCode», которое выглядит подозрительно идентичным p2pkh pubKeyScript.

Итак, я пришел к выводу, что он просто используется одинаково в каждом hashPreImage:

DUP  HASH160  <keyhash>  EQUALVERIFY  CHECKSIG

Но потом я начал думать о порядке оценки стека и снова запутался. Каков порядок оценки стека? Это: отправка данных scriptSig> оценка pubKeyScript> scriptCode? А если есть данные свидетелей? Когда это помещается в стек? Или я тут совсем не в теме?

Еще одна вещь, которая меня смущает, это оценка p2sh-p2wpkh. Я не понимаю, почему scriptSig должен быть толчком redeemScript:

 0 <20-byte-key-hash>

вновь подчеркивая мой главный вопрос. Я борюсь с концепцией scriptCode и порядком оценки сценария в целом. Я хотел бы знать, всегда ли scriptCode имеет один и тот же формат, если я планирую подписывать только p2sh-p2wpkh, pk2pkh, pk2pkh

Ответы (1)

Порядок выполнения такой:

  • scriptSig/witness для создания начального стека
  • scriptPubKey (который может вызвать оценку redeemScript в случае P2SH и вызов скрипта-свидетеля в случае P2WSH)

scriptCode — это просто имя для «исполняемого кода». Внутри оценки scriptPubKey он равен scriptPubKey. Внутри оценки redeemScript он равен redeemScript. Внутри оценки сценария свидетеля он равен сценарию свидетеля.

Хорошо, я немного лучше понимаю порядок выполнения. Но я до сих пор не понимаю, что такое scriptCode. Это просто scriptPubKey при подписании ввода? Возможно, вам придется объяснить мне это в упрощенном виде, почему он используется. Я знаю, что он проверяет подпись результирующего стека, содержащего публичный ключ и подпись, но для чего дублирование (OP_DUP) и отправка данных? Я думал, что это дело с сопоставлением ключа OP_HASH160 уже было сделано свидетелем + scriptsig + scriptPubKey.
Причина, по которой он используется, является исторической. Просто так бывает. Да, когда вы подписываете ввод, он равен сценарию, который содержит код операции CHECKSIG, который будет проверять вашу подпись.
Я тоже не совсем понимаю это, насколько я понимаю, scriptCode в примере bip143 p2sh (p2pkh) никогда не используется при выполнении во время выполнения? Насколько я понимаю, свидетель (<signature> <pubkey>) и scriptSig (<0 <20-byte-key-hash-compressed-pub-key>>) помещаются в стек, затем scriptPubKey: HASH160 <20- byte-script-hash> EQUAL выполняется, что в итоге приводит к выполнению <signature> <pubkey> CHECKSIG. В какой момент этот scriptCode выполняется или выполняется?