¿Cómo saber si una transacción es válida?

Entiendo que hay un par de cosas que deben verificarse para que una transacción sea válida: la transacción anterior tenía que ser correcta, ningún OP puede invalidar la transacción, etc., pero ¿hay una lista completa de lo que uno debe verificar? saber si una transacción es válida?

Por ejemplo, ¿la transacción debe tener una estructura específica para gastar, como que el script de TxIn debe compilarse en el mensaje codificado, y el script de TxOut debe ejecutar correctamente OP_Checksig en ese mensaje en particular? De lo contrario, uno podría simplemente soltar el mensaje de TxIn, enviar su propio mensaje malicioso y ejecutar OP_Checksig en eso.

¿Qué pasos requiere el protocolo que siga un cliente para verificar si la transacción es válida?

No está claro lo que estás preguntando. ¿Por "válido" quiere decir que el cliente no considerará un bloque inválido si contiene esa transacción? ¿O por "válido" quiere decir que el cliente predeterminado incluirá esa transacción en los bloques que genera? ¿O por "válido" quiere decir que el cliente predeterminado lo transmitirá a otros nodos? ¿O algo mas? Hay diferentes comprobaciones de las transacciones para decidir si son "válidas" para una serie de propósitos diferentes. Por ejemplo, considere una transacción que gasta monedas que aún no están disponibles pero que podrían estarlo. En algunos sentidos, eso es válido. En algunos, todavía no.
@DavidSchwartz Supongo que todo lo anterior sería útil, pero principalmente estaba pensando en incluir las transacciones en el bloque.

Respuestas (3)

En la wiki de bitcoin , hay una lista bastante completa de comprobaciones de validación realizadas por el cliente Satoshi: Protocol_rules .

También hay una sección específica sobre la verificación de transacciones.

Recomiendo usar la biblioteca bitcore construida por BitPay que tiene una función de transacción.verificar() que funciona bien.

También puede intentar decodificar una transacción hexadecimal usando esta herramienta de cifrado de bloques y si se decodifica correctamente y todos los componentes de una transacción válida están allí, entonces su transacción debería estar lista para continuar.

Entiendo que hay un par de cosas que deben verificarse para que una transacción sea válida: la transacción anterior tenía que ser correcta, ningún OP puede invalidar la transacción, etc., pero ¿hay una lista completa de lo que uno debe verificar? saber si una transacción es válida?

Verifica la cadena, si se remonta a una generación, es válida. Debe esperar una confirmación para grabarlo en piedra.

¿Qué pasos requiere el protocolo que siga un cliente para verificar si la transacción es válida?

https://github.com/bitcoin/bitcoin/tree/master/src

Bueno, bastante más que "una [única] confirmación" para "grabarlo en piedra".
Aunque técnicamente tiene razón al decir que necesita verificar la cadena hasta la generación, esto no es útil. Los clientes solo almacenan la parte de la cadena que han verificado como válida, y lo único que deben verificar es si se conecta correctamente con las transacciones en ella. Además, las transacciones nunca son completamente inamovibles, pero cada confirmación reduce significativamente la posibilidad de revertir más.
No ha habido y probablemente no habrá un solo ataque de Chain Fork. No vale la pena, es poco probable, no ha sucedido. fEl único ataque al cliente o cadena de Bitcoin fue un desbordamiento de enteros al principio de los tiempos.