Envió un tx sin procesar que ya estaba en la cadena de bloques para probarlo. Obtuve 'entradas faltantes' en lugar de 'ya existe'. ¿Por qué?

En un intento por comprender mejor las transacciones sin procesar, etc., fui a ver tx 518c41d5e59114f6a23383afbe95f02cdd09cb50cabd8390bdd9162a890435b3 en su forma sin procesar :

01000000017871f56f7be2743293abb1adccf21526265e4ad793fddbc08508417293fd6b4e000000006a47304402201f3b98d55c16a1ff9e66cbdd5533fd74d18362477f50dbce357d66e1233ba469022066fd837cf7e1e030f5aab0f22fec06c7d98ee948fd8b9aba185512426079e0a201210284ca3e364bebb4cafb9fa76624927078e16a4244314f824ea8acff0ef1ba4627ffffffff0220a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac81f1d909000000001976a914db4c1f7949870fae5cdc366a45e2ea39c084547c88ac00000000

Luego traté de enviar ese formulario sin procesar, solo copié y pegué en mi programa de billetera bitcoin para "sendrawtransaction" y obtuve el error missing inputs (code -25). Esto parece extraño en sí mismo porque, dado que se trata de una copia y pegado exactos de la transacción sin procesar que está en la cadena de bloques, ¿no debería faltar nada en absoluto? Además, ¿no debería recibir el error "la transacción ya existe"? ¿O no entiendo algo sobre cómo se envían las transacciones sin procesar?

Respuestas (1)

Bitcoin Core no tiene idea de qué transacciones ya existen en la cadena. No mantiene un índice completo, porque... no es necesario. De hecho, cuando se ejecuta en modo de poda, ni siquiera tiene la cadena o sus transacciones.

Lo único que tiene es el conjunto de salidas de transacciones no gastadas. Dado que está intentando reproducir una transacción existente, todas las entradas ya han sido gastadas por su instancia anterior. Como resultado, la respuesta esperada y correcta es que faltan entradas, es decir, su transacción es un gasto doble y, por lo tanto, no es válida.

Diría que esta es una de las ventajas del modelo UTXO: una repetición y un doble gasto son lo mismo, y no hay necesidad de distinguir.

En ese caso, ¿cuál es el punto de fHaveChain en github.com/bitcoin/bitcoin/blob/master/src/rpc/… que arroja RPC_TRANSACTION_ALREADY_IN_CHAIN?
@MeshCollider Si lo estoy leyendo bien, si algunas de las salidas de la transacción existen en la cadena de bloques y no se gastaron, entonces sendrawtransaction falla con ese error, en lugar de fallar con el error de entradas faltantes.