Transacción Segwit: firma DER no canónica

Error (al enviar)
código de error: -26
mensaje de error:
64: non-mandatory-script-verify-flag (firma DER no canónica)

Transacción010000000001020dcc23ccdb3665779a7657577cd33c5c0660e969ea2ffaf5438c58306ebc9dd201000000fd880100473044022075e1c8751f948b71a79e864040b8e9698e257f0dd65acb3cb6da852a1da8d96602204767d05ac1b75e1f85963c117e51cc8869711e1fe307b51cfdd7763b39e38aa9014730440220647678c47d4a4be2a5f70044e4cf5bf547fb513311401819a114e5a1e72e642002204e9f3847cb2789493446b96dce62acb7abdad06655aefef084bb0d6a49bc99c001473044022079be75240f2a1519559fc3eacfdbeee123403466879d720b9e7f68a45a2b3bef0220585ea1c34766d57e54103ec5102c8fd0925ee2bc1a847797176da9e878d21448014cad53210289d20d3d6e36f28537af3521ce05548fb16baf7d47ac67fbf318db6ed983b9ba21034712e706c1643ec0e9519edf093578886bac1c9c17893138a76111d9a14a2f1b2102a21047ac1a83c8cce21475240b2107a11d76212573a86f0dffe44cdd326f4dab2103430166298971c6282241ef46e866fa9077b4a48eafe4b370e94aef24050dda13210329446142884a33e6100603c6eead5300ec5cf438437f8374ea76dda2daced12855aeffffffff49508924c21b25ee2ff6aed61ccc202793aa992d3e033f12f2bf4a94d6346d0100000000232200207677cf0e71ff26dc2ac7e6b93a5f6b893d39c05a1367ca100cde7a62713ddb4affffffff0240420f00000000001976a9140d7ca1e17524d6c96209cf503fb053613cecf8f688acc0b606000000000017a914fa1cee87827866df00431b5c9a3506b5e31ef4ed87000500473045022100cd569e7f8e5fb6490ef3240d68abdd147f0c3ce4e77bcfd59f587b9a14848bdb02207fe31882d22518af84d3961809b6133c06b34ce6f91c1e579dcff0c58b7519d347304502210099699d11f3fa427c2739580de08fc3a305202a6b1f39c01d8f82e6ad8a9b191902205153041c9a291b81c3ef94cba9d22f3a8df6ee45faab13407ec8a56843051043483045022100b57e36875906add1edeb57badc92f5b4287f9e33b609fad5ae35912cdc0596ff022073338c6e14637dfc11abdb18c2396a58b8e537670d06084981799f64bcd7c3f401ad53210289d20d3d6e36f28537af3521ce05548fb16baf7d47ac67fbf318db6ed983b9ba21034712e706c1643ec0e9519edf093578886bac1c9c17893138a76111d9a14a2f1b2102a21047ac1a83c8cce21475240b2107a11d76212573a86f0dffe44cdd326f4dab2103430166298971c6282241ef46e866fa9077b4a48eafe4b370e94aef24050dda132102c877ef10e8dc5ca83f06263971f133f71e01e9b2a91a4184eb730026f2c3968f55ae00000000

Pregunta
¿Qué hay de malo con las firmas aquí?

Mis pensamientos y un poco de contexto
Así que básicamente tenemos dos entradas aquí. Ambos son de direcciones multisig. La diferencia es que el segundo es solo P2WSH . Lo primero es muy probable que esté bien. La segunda es mi preocupación. Entonces, veamos las firmas de los testigos para la segunda entrada.

Tenemos tres firmas:

  • 3045022100cd569e7f8e5fb6490ef3240d68abdd147f0c3ce4e77bcfd59f587b9a14848bdb02207fe31882d22518af84d3961809b6133c06b34ce6f91c1e579dc751c53
  • 304502210099699d11f3fa427c2739580de08fc3a305202a6b1f39c01d8f82e6ad8a9b191902205153041c9a291b81c3ef94cba9d22f3a8df6ee45faab13407ec8a51043
  • 3045022100b57e36875906add1edeb57badc92f5b4287f9e33b609fad5ae35912cdc0596ff022073338c6e14637dfc11abdb18c2396a58b8e537670d06084981799c3f4bcd

Los dos primeros son generados por billeteras de hardware. El tercero es creado por Bitcoin Core. Básicamente, cada una de estas firmas afirma ser 0x45 (69 bytes de largo). Pero el tercero tiene 01 adicional al final.

Preguntas
¿Es esta la razón del error?
Si no, ¿cuál es este byte adicional?
¿Alguna pista de lo que está mal con esta transacción?

Respuestas (1)

El byte "01" al final es el byte de tipo sighash (específicamente, 01 significa SIGHASH_ALL, lo que indica que todas las entradas y salidas están firmadas). Se requiere dicho byte para todas las firmas en los scripts de Bitcoin (tanto en firmas heredadas como segwit). Sin embargo, ese byte es parte de la firma codificada en DER; se adjunta a ella.

Presumiblemente, su billetera de hardware produce la firma DER sin el tipo sighash, y cualquier software que use para construir la transacción real es responsable de agregarla.

Ensamblé esta transacción manualmente y fue mi culpa por no agregar sighashes a las firmas. La transacción sigue siendo incorrecta, pero al menos ocurre un error diferente :) Parece que las firmas generadas son simplemente incorrectas. Pero su respuesta resuelve el problema descrito aquí. Gracias.