Итак, я создаю простую транзакцию P2PKH, и после того, как я исследовал это, нашел несколько полезных сообщений и ответов здесь; Мне удалось успешно провести один P2PKH UTXO, но это действительно усложняется, когда я пытаюсь провести транзакцию с несколькими входами. Я потратил на это целый день.
Все транзакции проходят в Bitcoin Testnet.
Выходы, которые я выкупаю:
Хэш передачи: 9742ed783bfec215ec6484d82dae20fba582229e54c49e06d662a91ead3f6a54 Индекс: 0
Хэш передачи: 40dbd3c25073cb7222becead1eb9bb2195cf309cf5b24af559f3391168ec6318 Индекс: 0 scriptPubKey: OP_DUP OP_HASH160 81f52d4061313b6f63549efc03f3df6cb6f0149e
Теперь я прочитал здесь ответ, в котором предлагалось, чтобы при использовании нескольких входов нужно было заменить scriptSig для остальных входов (неподписанных) на пустые; И я пробовал эти варианты до сих пор:
1. Замена scriptSig для входов на "00"
Таким образом, только вход (UTXO), который подписывается, будет иметь свой scriptPubKey, а другие входы должны иметь «00».
Serialized input #1 when signed:
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
19
76a91481F52D4061313B6F63549EFC03F3DF6CB6F0149E88ac
ffffffff
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
00
ffffffff
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
01000000
и...
Serialized input #2 when signed:
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
00
ffffffff
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
19
76a914A17C43FE0E1F8E660B044C9538E2CEF4ABFDCED288ac
ffffffff
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
01000000
основная транзакция с обоими входами подписана: (подписи без суффикса типа хеш-кода 01 и открытые ключи выделены жирным шрифтом)
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
6a
4730440220E4A366646391B3CFB06C0C4B0343E678B560BE8A2D20418233DEE863986105E502207245C5BA3DB516E59B95764C1716F5B39850E20429F08B91389C4780CE45430E 0121 025F69830D2BA35D04CA9EFB3EA46AA2645BBBDCB592A189A539480657C9696137
ffffffff
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
6a
4730440220C41C498D0CA55E38FE85DD158FDE82BB451068124E2B3AA2391D861BA9281EDD0220165712ADF71B19DF525583D8F48B82DFF06B2E556C17A583F4D5C54E99412C6B 0121 039F9AF4A84A8D5C35DD7A5628F8C2DC1894C2B4BDD4815DAFFDCBC9102FE2BA26
ffffffff
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
теперь декодирование необработанной транзакции работает, но при попытке ее трансляции bitcoind выдает следующие ошибки:
required-script-verify-flag-failed (подпись должна быть нулевой для неудачной операции CHECK(MULTI)SIG) (код 16)
или
non-mandatory-script-verify-flag (неканоническая подпись DER) (код 64)
Пробовал разные варианты:
но ничего не работает. Что я делаю не так? Ваша помощь будет оценена :)
и другие входы должны иметь «00».
Имейте в виду, что вы заменяете «scriptsig» на «пусто», а это 0x00
размер пустого скрипта.
non-mandatory-script-verify-flag (неканоническая подпись DER) (код 64)
Проблема здесь в кодировке DER, используемой в ваших подписях. r
значения в подписи положительны, и, поскольку каждое r
значение, которое у вас есть, имеет свой старший бит, им нужно предшествующее сообщение, 0x00
чтобы сообщить DER-декодеру, что числа положительны:
0xE4 = 0b11100100
0xC4 = 0b11000100
Каждая подпись должна измениться на это:483045022100E4A3...
Фуркан Сиддики