Orden de firma multisig del núcleo de Bitcoin

Tengo una pregunta técnica sobre la función signrawtransaction en el núcleo de Bitcoin al firmar una transacción parcialmente firmada.

He probado diferentes escenarios y signrawtransaction siempre ordenará las firmas de la manera correcta en scriptSig, independientemente del orden en que se firme la transacción una por una.

¿Se logra esto analizando el scriptSig de la transacción parcialmente firmada al firmar, y luego verificando cada firma en el scriptSig de transacciones parcialmente firmadas con todas las claves públicas en el script redimido y finalmente ordenándolas correctamente? ¿O hay una mejor manera de hacer esto?

Desafortunadamente, no entiendo cómo se hace esto al leer el código C del núcleo de bitcoin.

Respuestas (1)

Las firmas deben ordenarse de la misma manera que las claves públicas. De lo contrario, la transacción no es válida. Así es como funciona OP_CHECKMULTISIG(VERIFY).

Por supuesto, puede usar las claves privadas para firmar en cualquier orden, porque las firmas son independientes.

Gracias por tu respuesta. Sé que el orden en el scriptSig final debe tener en cuenta el script redimido. Pero, ¿la función signrawtransaction de Bitcoin Core deserializa el scriptSig parcialmente firmado y ordena las firmas en consecuencia? Esto se hace ejecutando el algoritmo de verificación de firma en cada firma proporcionada y cada clave pública posible del script de redimir?
Por ejemplo: con un multisig 2 de 3 (A, B, C), primero firmamos la transacción sin procesar recién creada con la clave pública C. Ahora este tx parcialmente firmado se firma con la clave pública B. Para colocar la firma de B en el scriptSig parcialmente firmado que contiene la firma de C, signrawtransaction primero debe verificar a qué clave pública pertenece la firma ya dada para saber si la firma de B debe colocarse antes o después.
>>>...realmente ejecutando el algoritmo de verificación de firma en cada firma provista y cada posible clave pública del redimirScript? <<< Sí. github.com/bitcoin/bitcoin/blob/master/src/script/sign.cpp#L228
De hecho, puede implementar su propio algoritmo para firmar transacciones multisig. Puede usar algunos "marcadores de posición" y reemplazarlos con firmas más adelante. El formato de transacción sin firmar sin procesar no es una regla de consenso :)
¡Gracias! Estoy implementando la función de firma en otro programa y quiero mantener la compatibilidad con la forma en que Core firma multisig. me ha ayudado mucho tu informacion!
Enlace permanente para referencia futura: github.com/bitcoin/bitcoin/blob/…