Комбинируя скрипт транзакции расходования Sig и скрипт транзакции финансирования PubKey, мы получаем:
<OP_0> <sig A> <sig C> <redeemScript> <OP_HASH160> <redeemScriptHash> <OP_EQUAL>
Пошаговое выполнение этого скрипта:
1)OP_0 и две подписи добавляются в стек, оставленные на потом.
2) RedeemScript добавляется в стек.
3) OP_HASH160 хэширует наш redeemScript.
4) redeemScriptHash добавляется в стек.
5) OP_EQUAL сравнит OP_HASH160(redeemScript) и redeemScriptHash и проверит их на равенство. Это подтверждает, что наша расходная транзакция предоставляет правильный сценарий погашения.
6) Теперь можно оценить наш redeemScript:
<OP_2> <A pubkey> <B pubkey> <C pubkey> <OP_3> <OP_CHECKMULTISIG>
7) OP_CHECKMULTISIG просмотрит 3 открытых ключа и 2 подписи в стеке и сравнит их одну за другой. Как указывалось ранее, порядок подписей здесь имеет значение и должен соответствовать порядку, в котором были предоставлены открытые ключи.
8) OP_0 включен только для устранения ошибки «не на единицу» в Bitcoin Core при использовании OP_CHECKMULTISIG.
я прочитал несколько ответов, связанных с этой темой, и я также прочитал BIP16, но я до сих пор не могу понять, как после проверки с помощью <OP_EQUAL>
вычисляется <redeemScript>
с помощью , <OP_HASH160>
и <redeemScriptHash>
сценарий продолжается с проверкой<sig A> <sig C>
После процедуры, которую я уже описал, в стеке остаются только следующие части: <OP_0> <sig A> <sig C>
Как эти подписи будут проверены после того, <redeemScript>
как они будут извлечены из стека?
Другими словами, мой вопрос связан с шагом 6. Теперь можно оценить наш redeemScript: как он был удален из стека...
Я сам искал эту информацию, и мне пришлось копаться в исходном коде биткойнов, чтобы найти ответ — нигде больше я его не нашел.
В биткойне есть жестко запрограммированная логика проверки P2SH:
Стек резервируется между шагами 2 и 3 (как правило, между выполнением scriptSig и scriptPubKey).
После выполнения и проверки обоих сценариев стек восстанавливается из более ранней резервной копии, сценарий погашения извлекается из стека, десериализуется, выполняется и проверяется. Это делается внутренним биткойн-кодом, а не каким-либо скриптом.
Соответствующий исходный код: https://github.com/bitcoin/bitcoin/blob/6fef85bfa3cd7f76e83b8b57f9e4acd63eb664ec/src/script/interpreter.cpp
Стек резервируется на 1493 и восстанавливается на 1529, где и начинается все волшебство.