Bitcoin Forum
April 25, 2024, 11:54:07 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Проводка транзакции OP_HASH160 (HASH) OP_EQUAL  (Read 165 times)
mrxtraf (OP)
Member
**
Offline Offline

Activity: 255
Merit: 27


View Profile WWW
November 16, 2020, 10:32:13 PM
 #1

Технический вопрос по скрипту и комбинации OP_HASH160 (HASH) OP_EQUAL.
В подписи транзакции должна быть строка (STRING) с которой должно получится соответствие rimemd160(hash256(STRING)) = HASH.

Как я понял их мануалов.
То что указывается в строке подписи попадает в стек. Будем считать это строка STRING2.
Получается следующий алгоритм проверки.
Строка STRING2 попадает в стёк. Сразу ПыСы, до него могло быть добавлен несколько строк данных, которые не являются скриптами. Просто данные.
Далее она начинает обрабатываться как скрипт. И если она не является скриптом, то не будет принята транзакция.
Скрипт строки STRING2 отрабатывается и остается в стеке, работает с предыдущими данными из стека. И при положительном результате остается в стеке как есть, при этом удаляются предыдущие данные.
Далее идет выполнение скрипта первичного вывода.
Операция OP_HASH160 берет из стека топовый параметр и изменяет его на rimemd160(hash256(STRING))
Операция (HASH) добавляет HASH в топ стека.
Операция OP_EQUAL проверяет два последних верхних параметра на соответствие. Удаляет их. И устанавливает в стек true(1) или false(0) в зависимости от результата.

Вопрос.
Есть строка STRING которая соответствует rimemd160(hash256(STRING)) = HASH, но сама не является скриптом.
Возможно ли провести транзакцию с такими данными?
1714046047
Hero Member
*
Offline Offline

Posts: 1714046047

View Profile Personal Message (Offline)

Ignore
1714046047
Reply with quote  #2

1714046047
Report to moderator
1714046047
Hero Member
*
Offline Offline

Posts: 1714046047

View Profile Personal Message (Offline)

Ignore
1714046047
Reply with quote  #2

1714046047
Report to moderator
1714046047
Hero Member
*
Offline Offline

Posts: 1714046047

View Profile Personal Message (Offline)

Ignore
1714046047
Reply with quote  #2

1714046047
Report to moderator
In order to get the maximum amount of activity points possible, you just need to post once per day on average. Skipping days is OK as long as you maintain the average.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714046047
Hero Member
*
Offline Offline

Posts: 1714046047

View Profile Personal Message (Offline)

Ignore
1714046047
Reply with quote  #2

1714046047
Report to moderator
~DefaultTrust
Copper Member
Sr. Member
****
Offline Offline

Activity: 1540
Merit: 487

Stop the war!


View Profile
November 17, 2020, 07:42:19 AM
 #2

Если скрипт дает тру, то транзакция тру, если скрипт на выходе фальшь, то транзакции нет. Пиши скрипт и проверяй. В чем вопрос?
Строка это строка, скрипт это скрипт. С чего вдруг строка должна обрабатываться как скрипт?

Do not trust bitcointalk fascists: leonello; Snork1979; ivan1975
mrxtraf (OP)
Member
**
Offline Offline

Activity: 255
Merit: 27


View Profile WWW
November 17, 2020, 10:22:55 AM
 #3

Если скрипт дает тру, то транзакция тру, если скрипт на выходе фальшь, то транзакции нет. Пиши скрипт и проверяй. В чем вопрос?
Строка это строка, скрипт это скрипт. С чего вдруг строка должна обрабатываться как скрипт?
Если я отправляю на подпись со строкой. Получаю ответ.
Code: -26, Error: mandatory-script-verify-flag-failed (Opcode missing or not understood)

И вообще вы знаете как работает комбинация выхода?
OP_HASH160 (HASH) OP_EQUAL

И чем допустим отличается?
OP_HASH160 от OP_HASH256

Ещё раз.
Есть выход OP_HASH160 (HASH) OP_EQUAL
Знаем строку с которой получается комбинация rimemd160(hash256(STRING)) = HASH  что эквивалентно OP_HASH160(STRING) = HASH
Вопрос.
Как использовать данный выход в качестве входа и как его "подписать"? Что нужно указать в подписи чтобы проверка прошла успешно?

ПыСы. Если разбираетесь поврехтностно в вопросе, лучше не писать что решение банально.
Пробовал много разных вариантов.
ПыСы2. Гугл не помогает, потому что практически везде это комбинация используется только для мултисигов. И всё. Других примеров нет!
~DefaultTrust
Copper Member
Sr. Member
****
Offline Offline

Activity: 1540
Merit: 487

Stop the war!


View Profile
November 17, 2020, 10:38:19 AM
Last edit: November 17, 2020, 11:15:02 AM by ~DefaultTrust
 #4


Ещё раз.
Есть выход OP_HASH160 (HASH) OP_EQUAL
Знаем строку с которой получается комбинация rimemd160(hash256(STRING)) = HASH  что эквивалентно OP_HASH160(STRING) = HASH
Вопрос.
Как использовать данный выход в качестве входа и как его "подписать"? Что нужно указать в подписи чтобы проверка прошла успешно?

Строка должна быть не просто строкой, а скриптом который даст тру. Например, если хочется впихнуть в скрипт строку, то скрипт должен быть чем-то вроде:
OP_PUSHDATA длина_строки
строка
OP_DROP
публичный ключ
OP_CHECKSIGVERIFY

С подписью все сложно. В нативном клиенте нет способа подписать нестандартный скрипт. Нужно использовать сторонний софт или либы.

Но для тестов ты же можешь отправлять не подписанные транзакции. Тогда пиши просто:
OP_PUSHDATA длина_строки
строка
OP_DROP
OP_TRUE

Do not trust bitcointalk fascists: leonello; Snork1979; ivan1975
mrxtraf (OP)
Member
**
Offline Offline

Activity: 255
Merit: 27


View Profile WWW
November 17, 2020, 11:19:34 AM
 #5

Строка должна быть не просто строкой, а скриптом который даст тру. Например, если хочется впихнуть в скрипт строку, то скрипт должен быть чем-то вроде:
OP_SIZE_длина_строки
строка
OP_DROP
публичный ключ
OP_CHECKSIGVERIFY

С подписью все сложно. В нативном клиенте нет способа подписать нестандартный скрипт. Нужно использовать сторонний софт или либы.

Но для тестов ты же можешь отправлять не подписанные транзакции. Тогда пиши просто:
OP_SIZE_длина_строки
строка
OP_DROP
OP_TRUE
Так есть возможность или нет?

Просто по документации, допустим есть команда
OP_PUBKEYHASH   253   0xfd   Represents a public key hashed with OP_HASH160.
Правда она относится к разряду.
Pseudo-words
These words are used internally for assisting with transaction matching. They are invalid if used in actual scripts.


Тут вопрос наверное в другом. Что выполняется первым?
OP_HASH160 (HASH) OP_EQUAL
Или
Скрипт подписи.

Если скрипт выхода OP_HASH160 (HASH) OP_EQUAL первый, то вариантов нет. Если наоборот, то тогда можно пробовать что-то мудрить со стеком.
~DefaultTrust
Copper Member
Sr. Member
****
Offline Offline

Activity: 1540
Merit: 487

Stop the war!


View Profile
November 17, 2020, 11:36:06 AM
 #6

Сначала проверяется хэш скрипта
Потом выполняется скрипт.
Чего добиться-то хочешь? Записать строку? Я тебе показал как - пиши скрипт, хэшируй, отправляй на хэш бабки, забирай бабки скриптом.
Если хочешь с подписями, то используй сторонние либы. Без подписей можно все стандартной корой сделать.

Do not trust bitcointalk fascists: leonello; Snork1979; ivan1975
A-Bolt
Legendary
*
Offline Offline

Activity: 2311
Merit: 2297


View Profile
November 17, 2020, 11:36:18 AM
Merited by Symmetrick (3), mrxtraf (1)
 #7

Как я понял их мануалов.

Вы как-то не совсем правильно поняли.

ScriptSig для P2SH-входа имеет следующий формат:
Code:
<Sig1> <Sig2> ... <SigN> <redeemScript>
Знаки < > означают операцию помещения в стек того, что находятся между ними. То есть, <SigN> и <redeemScript> - это байтовые массивы, которые помещаются в стек один за другим в виде элементов данных.

Итак, на первом этапе в стек помещаются Sig1, ... SigN и последним в стек запихивается redeemScript. Далее происходит выполнение scriptPubKey, котрый для P2SH-выхода выглядит так:
Code:
OP_HASH160 <redeemScriptHash> OP_EQUAL

Первый оператор - OP_HASH160 хеширует содержимое вершины стека, а там находится redeemScript, и помещает результат в стек. Следующий оператор - OP_EQUAL сравнивает redeemScriptHash, предварительно помещённый в стек, с результатом оператора OP_HASH160, помещённым в стек ещё раньше. В случае неравенства - в стек помещается 0. На этом выполнение скрипта завершается и его результат, находящийся на вершине стека проверяется: если 0 - транзакция считается недействительной и на этом всё. В случае равенства - OP_EQUAL записывает на вершину стека 1, транзакция (на данном этапе) считается действительной и происходит переход ко второму этапу.

На первом этапе проверяется соответсвие между хешем redeemScript, записанным в scriptPubKey, и самим redeemScript, записанным в scriptSig. Тем самым подтверждается право на выполнение redeemScript.

На втором этапе в стеке имеются такие данные:
Code:
<Sig1> <Sig2> ... <SigN> <redeemScript>

RedeemScript извлекается из стека и выполняется уже как скрипт, использующий данные, находящиеся в стеке - <Sig1> ... <SigN>. Тут опять же, если результатом выполнения скрипта является 0, то транзакция считается недействительной и наоборот.

Во втором этапе реализуется логика скрипта redeemScript. Если это m-of-n multisig, то проверяется право на трату выхода подписям <Sig1> ... <SigN>.
mrxtraf (OP)
Member
**
Offline Offline

Activity: 255
Merit: 27


View Profile WWW
November 17, 2020, 11:43:39 AM
 #8

Как я понял их мануалов.

Вы как-то не совсем правильно поняли.

ScriptSig для P2SH-входа имеет следующий формат:
Code:
<Sig1> <Sig2> ... <SigN> <redeemScript>
Знаки < > означают операцию помещения в стек того, что находятся между ними. То есть, <SigN> и <redeemScript> - это байтовые массивы, которые помещаются в стек один за другим в виде элементов данных.

Итак, на первом этапе в стек помещаются Sig1, ... SigN и последним в стек запихивается redeemScript. Далее происходит выполнение scriptPubKey, котрый для P2SH-выхода выглядит так:
Code:
OP_HASH160 <redeemScriptHash> OP_EQUAL

Первый оператор - OP_HASH160 хеширует содержимое вершины стека, а там находится redeemScript, и помещает результат в стек. Следующий оператор - OP_EQUAL сравнивает redeemScriptHash, предварительно помещённый в стек, с результатом оператора OP_HASH160, помещённым в стек ещё раньше. В случае неравенства - в стек помещается 0. На этом выполнение скрипта завершается и его результат, находящийся на вершине стека проверяется: если 0 - транзакция считается недействительной и на этом всё. В случае равенства - OP_EQUAL записывает на вершину стека 1, транзакция (на данном этапе) считается действительной и происходит переход ко второму этапу.

На первом этапе проверяется соответсвие между хешем redeemScript, записанным в scriptPubKey, и самим redeemScript, записанным в scriptSig. Тем самым подтверждается право на выполнение redeemScript.

На втором этапе в стеке имеются такие данные:
Code:
<Sig1> <Sig2> ... <SigN> <redeemScript>

RedeemScript извлекается из стека и выполняется уже как скрипт, использующий данные, находящиеся в стеке - <Sig1> ... <SigN>. Тут опять же, если результатом выполнения скрипта является 0, то транзакция считается недействительной и наоборот.

Во втором этапе реализуется логика скрипта redeemScript. Если это m-of-n multisig, то проверяется право на трату выхода подписям <Sig1> ... <SigN>.
Всё, вопрос закрыт.
Большое спасибо.
Просто в некоторых местах описывалось, что <redeemScript> исполняется перед OP_HASH160 <redeemScriptHash> OP_EQUAL.
Теперь всё понятно.
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!