Подписание необработанной транзакции с несколькими входами

Итак, я создаю простую транзакцию P2PKH, и после того, как я исследовал это, нашел несколько полезных сообщений и ответов здесь; Мне удалось успешно провести один P2PKH UTXO, но это действительно усложняется, когда я пытаюсь провести транзакцию с несколькими входами. Я потратил на это целый день.

Все транзакции проходят в Bitcoin Testnet.

Выходы, которые я выкупаю:

  1. Хэш передачи: 9742ed783bfec215ec6484d82dae20fba582229e54c49e06d662a91ead3f6a54 Индекс: 0

  2. Хэш передачи: 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)

Пробовал разные варианты:

  1. Замените scriptPubKey входов, которые не подписаны, просто на «00».
  2. Замените scriptPubKey входов, которые не подписаны, просто на ""
  3. Удалить порядковый номер из входов "ffffff"

но ничего не работает. Что я делаю не так? Ваша помощь будет оценена :)

Ответы (1)

и другие входы должны иметь «00».

Имейте в виду, что вы заменяете «scriptsig» на «пусто», а это 0x00размер пустого скрипта.

non-mandatory-script-verify-flag (неканоническая подпись DER) (код 64)

Проблема здесь в кодировке DER, используемой в ваших подписях. rзначения в подписи положительны, и, поскольку каждое rзначение, которое у вас есть, имеет свой старший бит, им нужно предшествующее сообщение, 0x00чтобы сообщить DER-декодеру, что числа положительны:

0xE4 = 0b11100100 
0xC4 = 0b11000100 

Каждая подпись должна измениться на это:483045022100E4A3...

Ты прав!!! Я сходил с ума по подготовке транзакции, в то время как проблема была со стороны ECDSA lib. Спасибо тебе, друг!