¿Cómo identifico de manera única una transacción (para protegerla contra la maleabilidad)?

Las transacciones que transmito pueden ser manipuladas por cualquier persona que mire el mempool (más información aquí ).

Esto descarta el uso txidpara la identificación de transacciones.

¿Cómo puedo identificar mis transacciones para asegurarme de que mi aplicación las rastree, incluso si los txidcambios en el momento en que la transacción se extrae en un bloque?

Seguimiento de los UTXO:s que gasta y los resultados que crea.

Respuestas (2)

Este es un problema interesante, que ha sido estudiado y discutido bastante dentro de la comunidad bitcoin.

La forma básica de hacer esto es realizar un seguimiento de un TXID normalizado junto con el TXID real utilizado en el protocolo. Luego, para calcular la identificación normalizada de una transacción, la serializa:

  • Con los txid de las entradas reemplazados por su transacción normalizada
  • Eliminación de scriptSigs (ya que esas son las partes más maleables de una transacción)

La única advertencia es que esto no es necesario para las transacciones de coinbase, ya que scriptSig no es maleable (dado que ya está en un bloque) y no hay txid reales en las entradas. Tampoco desea eliminar el scriptSig de la transacción de coinbase porque contiene la altura del bloque (por BIP34), lo que garantiza que el TXID (y el TXID normalizado) serán únicos. Por lo tanto, para las transacciones de base de monedas, la identificación de la transacción normalizada es la misma que la identificación de la transacción (nTXID == TXID).


Nota: esto es mucho trabajo para realizar un seguimiento de las identificaciones normalizadas para cada transacción. Todavía no se ha implementado en Bitcoin Core, y la implementación de su propia versión puede llevar mucho tiempo.

Si puede garantizar que el conjunto de salidas en todas las transacciones dentro de su sistema será único (es decir, está usando nuevas direcciones de recepción y nuevas direcciones de cambio para cada transacción), entonces podría usar un hash del conjunto de salidas como un identificador único. Esto sería más específico para su caso de uso, como una solución temporal, mientras que Bitcoin Core aún no tiene soporte para identificaciones de transacciones normalizadas.

Algunos recursos adicionales:

No estoy seguro de si ayudaría el hash de las salidas, ya que cualquiera podría crear un hash de las mismas salidas para atacar mi sistema (les costaría bitcoin, pero no mucho; mi aplicación siempre enviará la cantidad mínima de BTC). ¿Qué pasa con el hash de las entradas?
@bvpx, muy buen punto. Bueno, las entradas son las partes que son maleables, por lo que es difícil incluir los datos de entrada. Tenga en cuenta que las entradas tienen (prevout txid, prevout index, scriptSig y número de secuencia). Prevout txid y scriptSig son ocasionalmente maleables, y los otros dos no son tan únicos. No es una buena opción :(

Todavía puede usar el txidpara identificarlo en su base de datos. Solo debe asegurarse de esperar suficientes confirmaciones para confiar en la transacción y que otras partes no puedan "malearla". Si recibe 2 transacciones que tienen las mismas entradas/salidas pero diferentes identificadores de transacción, entonces simplemente conserva una (tal vez la primera) y descarta la otra. En otras palabras, identifica las transacciones como quieras, solo recuerda no confiar en las no confirmadas.