Firmar una transacción sin procesar con múltiples entradas

Así que estoy creando una transacción P2PKH simple y después de investigar sobre esto, encontré algunas publicaciones y respuestas útiles aquí; Pude gastar con éxito un solo P2PKH UTXO, pero realmente se complica cuando trato de gastar transacciones con múltiples entradas. He pasado un día entero en esto.

Todas las transacciones están en Bitcoin Testnet.

Salidas que estoy canjeando:

  1. Hash de Tx: 9742ed783bfec215ec6484d82dae20fba582229e54c49e06d662a91ead3f6a54 Índice: 0 scriptPubKey: OP_DUP OP_HASH160 81f52d4061313b6f63549efc03f3df6cb6f0149e OP_CHECKVERIFY OP_CHECKVERIFY

  2. Hash de Tx: 40dbd3c25073cb7222becead1eb9bb2195cf309cf5b24af559f3391168ec6318 Índice: 0 scriptPubKey: OP_DUP OP_HASH160 81f52d4061313b6f63549efc03f3df6cb6f0149e OP_EQUALVERCKSIG

Ahora leí una respuesta de aquí que sugería que si usaba múltiples entradas, uno debería reemplazar scriptSig para que el resto de las entradas (las que no están firmadas) se vacíen; Y he probado estas variaciones hasta ahora:

1. Reemplazar scriptSig para entradas con "00"

Entonces, solo la entrada (UTXO) que se está firmando tendrá su scriptPubKey, y otras entradas deben tener "00" en su lugar.

Serialized input #1 when signed:
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
19
76a91481F52D4061313B6F63549EFC03F3DF6CB6F0149E88ac
ffffffff
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
00
ffffffff
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
01000000

y...

Serialized input #2 when signed:
01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
00
ffffffff
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
19
76a914A17C43FE0E1F8E660B044C9538E2CEF4ABFDCED288ac
ffffffff
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000
01000000

transacción principal con ambas entradas firmadas: (las firmas sin el sufijo del tipo de código hash 01 y las claves públicas están en negrita)

01000000
02
546a3fad1ea962d6069ec4549e2282a5fb20ae2dd88464ec15c2fe3b78ed4297
00000000
6a
4730440220E4A366646391B3CFB06C0C4B0343E678B560BE8A2D20418233DEE863986105E502207245C5BA3DB516E59B95764C1716F5B39850E20429F08B91389C4780CE45430E 0121 025F69830D2BA35D04CA9EFB3EA46AA2645BBBDCB592A189A539480657C9696137
ffffffff
1863ec681139f359f54ab2f59c30cf9521bbb91eadcebe2272cb7350c2d3db40
00000000
6a
4730440220C41C498D0CA55E38FE85DD158FDE82BB451068124E2B3AA2391D861BA9281EDD0220165712ADF71B19DF525583D8F48B82DFF06B2E556C17A583F4D5C54E99412C6B 0121 039F9AF4A84A8D5C35DD7A5628F8C2DC1894C2B4BDD4815DAFFDCBC9102FE2BA26
ffffffff
01
c0fb390000000000
19
76a914DD02C23FF4C3FFC6DA1C74B7EA5BCB0891B0E98288ac
00000000

ahora la decodificación de la transacción en bruto funciona, pero al intentar transmitirla, bitcoind da estos errores:

mandato-script-verify-flag-failed (La firma debe ser cero para la operación fallida CHECK(MULTI)SIG) (código 16)

o

non-mandatory-script-verify-flag (firma DER no canónica) (código 64)

He probado diferentes variantes:

  1. Reemplace scriptPubKey de las entradas que no se firman solo con "00"
  2. Reemplace scriptPubKey de las entradas que no se firman solo con ""
  3. Eliminar el número de secuencia de las entradas "ffffff"

Pero nada parece funcionar. ¿Qué estoy haciendo mal? Su ayuda será apreciada :)

Respuestas (1)

y otras entradas deben tener "00" en su lugar.

Tenga en cuenta que reemplaza "scriptsig" con "vacío" y es 0x00el tamaño del script vacío.

non-mandatory-script-verify-flag (firma DER no canónica) (código 64)

El problema aquí es la codificación DER utilizada en sus firmas. rlos valores en una firma son positivos y dado que cada rvalor que tiene tiene su conjunto de bits más significativo, necesitan un precedente 0x00para decirle al decodificador DER que los números son positivos:

0xE4 = 0b11100100 
0xC4 = 0b11000100 

Cada firma debe cambiar a esto:483045022100E4A3...

¡¡¡Tienes razón!!! Me estaba volviendo loco con la preparación de transacciones mientras el problema era del lado de la biblioteca ECDSA. ¡Gracias compañero!