Hosted on hyper.media via the Hypermedia Protocol.
Hash-Preimage para una transacción con múltiples inputs
En el artículo sobre las Firmas Digitales, en el apartado técnico, dejé un pequeño detalle sin tratar: ¿Qué sucede con la proto-transacción cuando hay más de un input? ¿De qué manera se firma una transacción si cada input tiene su propia clave privada? Antes de nada, hay que tener en cuenta el importante rol del "SigHash". El "SigHash" nos indica que partes de la transacción se firman digitalmente. Normalmente se firma toda la transacción para que sea imposible modificar cualquiera de sus partes; pero en otras ocasiones, solo se firma una parte concreta de la transacción, permitiendo que se puedan aportar mas fondos (añadir nuevos inputs) o se pueda determinar a donde van los fondos (modificar los outputs). Aunque suena raro, estas funcionalidades son muy utilizadas, sobre todo en transacciones colaborativas. Como decía, normalmente se firma digitalmente toda la transacción, lo que se indica con el "SigHash ALL". Si intentas reconstruir la proto-transacción (sobre la cual se generan las firmas) en una transacción que tenga múltiples inputs (SigHash ALL), siguiendo el mismo enfoque que para una transacción de un solo input (también SigHash ALL), la verificación de las firmas digitales resultará en error. Este error ocurre porque, en una transacción con múltiples inputs, cada uno corresponde a una clave privada distinta, y al firmar con cada clave cabría esperar que la proto-transacción mantuviera la misma estructura. Sin embargo, en lugar de utilizar la misma proto-transacción para todas las firmas, el proceso sigue una lógica algo particular: Es decir, para cada input, la proto-transacción que se ha firmado con la clave privada correspondiente es distinta. ¿Por qué se diseñó de esta forma? Puede haber varias razones: optimizar el proceso de firma, prevenir errores o evitar que scripts incorrectos sean firmados involuntariamente... aunque la verdad nunca la sabremos: Ask Satoshi Puedes probar a verificar las firmas digitales de una transacción "SigHash ALL" con múltiples inputs P2PKH y P2PK (y cualquier cantidad de outputs de cualquier tipo), con el siguiente código que he preparado: Además, con la función getPreimage(índice*), el código te devolverá la proto-transacción (preimage) sobre la que se firmó ese input en cuestión. *El índice corresponde al input deseado: 0 para el primer input, 1 para el segundo, y así sucesivamente. **Proto-transacción = Hash-Preimage
14 Feb