Разъяснение по скрипту P2SH, как он выполняется в биткойн-ядре?

Этот вопрос является продолжением моего вчерашнего поста .

Сегодня у меня вопрос по выполнению P2SH поэтому пример скрипта должен быть таким

OP_0 <A Signature> <B Signature> OP_2 <Public key A> <Public key B> 
<Public key C> OP_3 OP_CHECKMULTISIG
OP_HASH160 <ScriptSig Hash> OP_EQUAL

или если используется ключ P2SH, он должен быть таким (я думаю, что в этом скрипте что-то осталось для преобразования hash160 внутри ключа P2SH, верно?)

OP_0 <A Signature> <B Signature> OP_2 <Public key A> <Public key B> 
<Public key C> OP_3 OP_CHECKMULTISIG
OP_HASH160 <P2SH key> OP_EQUAL

Теперь, если я правильно понял, симуляция казни делится на две фазы.

  1. Хэш scriptSigравен хешу внутриscriptPubKey

Моделирование

  • Поместите в scriptSigстек, так что теперь стек<A sig> <B sig> <A pubkey> <B pubkey> <C pubkey>
  • Вычислите hash160с данными внутри стека, так что теперь состояние стека<scriptSig hash>
  • Ставим scriptSigожидаемый хеш, теперь статус стека<hash scriptsig> <hash scriptsigexpected>
  • вернуть результат оператора OP_EQUAL(true или false)

  1. будет scriptSigвыполняться, например, скрипт с мультиподписью

Моделирование

  • положить в стек scriptSig, статус стека<A Signature> <B Signature>
  • нажмите открытые ключи, этот статус стека<A Signature> <B Signature> <Public key A> <Public key B> <Public key C>
  • применить OP_CHECKMULTISIGоператор и получить результат

Мои вопросы:

  • С ключом P2SH исполнение такое же? если нет, какова форма P2SH с ключом P2SH?

Кроме того, я прочитал этот пост , но не думаю, что он содержит этот ответ.

Если мой пример сценария неверен, извините за исправления

Ответы (1)

Давайте рассмотрим это шаг за шагом. Предположим, вы хотите заблокировать несколько биткойнов в мультиподписи 2 из 3.

Шаги блокировки

  1. Создайте сценарий с несколькими подписями: OP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG.
  2. Хэшируйте мультиподписной скрипт, с помощью HASH160которого вы получаете multi-sig_scripthash.
  3. Base58 Проверьте multi-sig_scripthashверсию 0x05, указав адрес, начинающийся с 3....
  4. Будет . scriptPubKey_OP_HASH160 <multi-sig_scripthash> OP_EQUAL

Разблокировка шагов

  1. Ваш стек начнется с <signatures><redeemScript>. Подпись есть OP_0 <sig_A> <sig_B>и redeemScriptесть OP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG.

  2. Начиная с версии 0.3.7, Bitcoin Core сначала выполняет сценарий разблокировки и просматривает полученный стек. Так ваш <signatures>и <redeemScript>оцениваются вместе в первую очередь. Это приведет к оценке с несколькими подписями.

  3. В обычных случаях описанный выше шаг должен просто возвращать 1, поскольку подписи удовлетворяют требованиям redeemScript. Но с P2SH есть предостережение, добавленное BIP-16 . Всякий раз, когда у вас есть OP_HASH160 <hash> OP_EQUALсценарий блокировки, он служит идентификатором P2SH. Поэтому перед оценкой <signatures>with <redeemScript>копируется redeemScriptиз стека в другой. Затем выполняется оценка того, что находится в стеке ( <signatures><redeemScript>в нашем случае). В случае успеха замените текущий стек на только что redeemScript. Следовательно, вместо 1 у вас <redeemScript>наверху стека.

  4. Вы работаете OP_HASH160на redeemScript. Стек сейчас<hash160_of_redeemScript>

  5. Вы нажимаете <expectedredeemScripthash>. Стек сейчас<hash160_of_redeemScript><expectedredeemScripthash>

  6. Вы запускаете OP_EQUAL, что приводит к оценке и возвращает 1 на вершину стека.

Спасибо за ваш ответ, у меня есть вопрос, существует ли какой-то оператор внутри биткойн-скрипта для расчета Base58Check?
Кодировка @vincenzopalazzo Base58check предназначена для удобочитаемости. Люди должны различать, является ли сгенерированный/отправляемый адрес P2PKH или P2SH. Это не имеет никакого значения внутри программного обеспечения.
Моя ошибка, я перешел к этой заметке «Примечание: если вы просто вставите адрес, начинающийся с 3, программа автоматически рассчитает scriptPubKey, как указано выше».
@vincenzopalazzo Я имел в виду, что как пользователь вы просто вводите адрес, начинающийся с 3. Программное обеспечение кошелька затем переводит его в scriptPubKey.
@vincenzopalazzo в качестве дополнительного разъяснения: адреса не передаются по сети и не сохраняются в блокчейне. Адреса предназначены только для удобочитаемости. Поэтому, когда пользователь вводит адрес, начинающийся с 3.., программное обеспечение кошелька декодирует проверку base58, извлекает redeem_script_hash и использует OP_HASH160 <redeem_scripthash> OP_EQUALв качестве scriptPubKey. Если ваш адрес начинается с 1, программное обеспечение кошелька будет использовать его OP_DUP OP_HASH160 <redeem_scripthash> OP_EQUALVERIFY OP_CHECKSIGкак scriptPubKey.
Да, спасибо за разъяснения, вы мне помогли :)