¿Es posible agregar una entrada de transacción a una transacción en el mempool?

¿Es posible agregar una entrada a una transacción que está en el mempool?

Por ejemplo, si alguien está pagando 1 BTC a su amigo, puedo obtener los datos hexadecimales sin procesar de esta transacción del mempool antes de que se extraiga.

Luego puedo firmar una transacción no gastada (digamos 3 BTC) con mi propia clave privada, enumerarla como entrada y obtener los datos hexadecimales sin procesar para esto. Luego, puedo agregar una salida de 3 BTC a la dirección de otra persona (a quien quiero pagar) y volver a transmitir esta nueva transacción a la red.

¿Qué impide que esto suceda?

Respuestas (4)

Respuesta corta: no, esto es imposible.

Respuesta más larga: algunas transacciones permiten cambiar las entradas utilizadas (entradas ANYONECANPAY). También es posible tener entradas que no firmen las salidas que se están creando (SIGHASH_NONE). Sin embargo, una transacción donde todas las entradas son de este tipo, no valen nada, ya que cualquiera podría cambiar las salidas para acreditarse a sí mismo.

Por lo general, cuando se utilizan las firmas SIGHaSH_ALL normales, se firma prácticamente todo lo relacionado con una transacción (qué monedas de entrada se utilizan (y en qué orden), qué scripts de salida se crean, qué valor asignarles... Todo excepto las firmas ellos mismos realmente (que es lo que causa la maleabilidad involuntaria).

Si una firma de entrada está marcada ANYONECANPAY, no firma las otras monedas de entrada que se están utilizando. Esto significa que puede crear una transacción que signifique "Quiero que se pague x e y, pero no me importa quién proporcione los fondos para hacerlo". Si todas las firmas en una transacción son CUALQUIERA PUEDE PAGAR, podría agregar entradas adicionales (o eliminar las entradas existentes. Sin embargo, solo aumentar los fondos de entrada los quemaría como tarifa.

Por otro lado, está SIGHASH_NONE, que hace que una firma no firme las salidas de la transacción. Esto puede parecer que permite lo que desea, pero en caso de que cada firma sea SIGHASH_NONE, la transacción es completamente insegura, ya que cualquiera podría reemplazar el lugar al que van las salidas.

Entonces, incluso si una combinación de estos permitiría en teoría lo que sugiere, no es cierto para las transacciones típicas y, de hecho, sería completamente inseguro.

Gracias. Sin embargo, he mirado el código durante más de una hora y todavía no veo dónde están firmadas las salidas. Estoy buscando específicamente aquí: github.com/bitcoin/bitcoin/blob/master/src/… ... parece que solo las entradas están firmadas. ¿Puede señalar una línea de código que aclare que los resultados de las transacciones también están firmados?
Además, puedo "simplemente creerte", pero no veo nada en el código que evite el tipo de comportamiento por el que pregunto. Específicamente, ¿qué impide que alguien agregue una entrada a una transacción SIGHASH_ALL no minada? Decir "todo está firmado" no responde completamente a mi pregunta, siento que me estoy perdiendo algo importante. ¿Todas las entradas están firmadas con cada clave privada que aparece en la transacción? Por lo que puedo decir, cada entrada se firma individualmente y los datos de esa firma se almacenan independientemente de las otras firmas de entrada.
Cada entrada contiene una firma, utilizando la clave que necesita el script de la salida que gasta esa entrada. Sin embargo, los datos que se firman son (una versión modificada de) la transacción completa. Agregar una entrada adicional a una transacción invalidaría cualquier entrada SIGHASH_ALL, ya que los datos que se firman cambian.

No es posible agregar una entrada (o salida) adicional a las transacciones de otra persona sin que firmen la nueva transacción porque su firma solo es válida para las entradas y salidas subyacentes dadas.

Una posible fuente de confusión es que otros aspectos de una transacción son de hecho maleables (pueden modificarse hasta que se finalicen mediante la incorporación a la cadena de bloques en el proceso de minería). Por ejemplo, hay una transformación trivial de formar una nueva firma válida a partir de una firma válida existente que esencialmente toma el negativo de la misma, y ​​también se pueden anteponer ceros iniciales. En cierto sentido, este es un problema heredado porque las firmas, antes de Bitcoin, se consideraban valiosas para confirmar la autenticidad de otros datos, no como únicas en sí mismas, de modo que en el caso inesperado de ver estos formatos no estándar para firmas, aceptarlas por defecto fue una elección razonable.

Ninguna alteración de este tipo cambia la transferencia subyacente de Bitcoin, solo cambian el hash (id de transacción o txid) de la transacción existente. Esto significa que dicha alteración podría confundir a las partes involucradas, ya que la transacción se confirma con un txid inesperado, pero no afecta cuántos bitcoins se transfieren de qué entradas a qué salidas.

No puede, crearía una transacción completamente diferente y la otra quedaría invalidada tan pronto como una llegue a un minero y entre en un bloque.

Estoy confundido, ¿estás diciendo que esto no es posible, o estás diciendo que es posible y simplemente invalidaría la primera transacción?
Mala mía, el segundo párrafo era confuso. Estoy diciendo que la segunda transacción no será válida debido a entradas en conflicto.
Tenía la impresión de que la maleabilidad de la transacción era posible debido a que no se aplicaba un orden de transacciones (antes de que se extraiga un bloque con esa transacción). ¿Es posible que la segunda transacción más grande se coloque en un bloque?
Una vez que una transacción está en un bloque o incluso en el grupo de memoria de un minero, todas las transacciones en conflicto no son válidas. Nunca hay duplicados de entrada en la cadena de bloques. La maleabilidad de transacciones crea dos TXID que apuntan a la misma transacción, pero solo uno puede ser válido y colocarse en un bloque. Aceptar ambos como válidos es donde los intercambios pierden dinero.
Mi pregunta hace referencia específicamente a transacciones que aún no se extraen. La pregunta es si es posible o no editar la transacción sin procesar para agregar entradas y salidas antes de que se extraiga la transacción porque cada entrada se firma individualmente. No estoy preguntando sobre entradas duplicadas, estoy preguntando si es posible o no agregar entradas y salidas a una transacción que aún no se ha extraído, con la esperanza de volver a transmitirla a los grupos para que se extraiga antes de " host" se extrae la transacción. No puedo encontrar nada en el protocolo que técnicamente impida que esto suceda.

Estas cosas no pueden cambiar:

Por lo general*, una transacción de bitcoin incluye una firma para confirmar lo siguiente:

  1. Aporte
  2. Producción

Una entrada o salida especifica tanto una dirección como una cantidad. Si alguna de estas cosas cambia, se necesitará una nueva firma, que solo puede crear alguien que tenga la clave privada. Cambiar la entrada o la salida invalidará la firma. Solo el propietario de la clave privada puede realizar dicho cambio, siendo el único que puede crear la nueva firma. Incluso entonces, esto crearía una transacción completamente nueva que no podría confundirse con la original.

Lo que se puede cambiar antes de que la transacción se incluya en la cadena de bloques es la identificación de la transacción. Cambiar esto puede causar confusión para cualquiera que acepte transacciones no confirmadas, pero no puede cambiar la entrada o la salida, es solo una etiqueta. Para las personas que solo aceptan transacciones confirmadas, la transacción ya estará en la cadena de bloques, donde no se puede modificar nada, por lo que no hay posibilidad de confusión.

En conclusión:

  • Su transacción que aún no se ha incluido en la cadena de bloques está a salvo de que se modifique su entrada o salida. No se pueden cambiar ni agregar direcciones ni montos.
  • Una vez que su transacción se incluye en la cadena de bloques**, está a salvo de cambios, por lo que puede referirse a ella de manera segura por su ID de transacción sin posibilidad de confusión.

Información extra

Mi objetivo era una explicación simple, por lo que no he incluido detalles de transacciones con múltiples entradas con diferentes claves privadas, pero se aplica lo mismo. Ningún tercero puede realizar modificaciones que no sean la identificación de la transacción, lo que no afecta la cantidad de bitcoin que se transfiere o hacia dónde se transfiere.

La explicación anterior se aplica a las transacciones estándar. Producir una transacción a la que no se aplican estas protecciones requeriría un software especializado o una comprensión profunda. Para obtener más detalles sobre las transacciones, consulte lo siguiente:

* Si bien es posible crear deliberadamente una transacción que no especifique entradas, o incluso una que no especifique salidas, asumo que la pregunta se refiere al proceso habitual de creación de una transacción a partir de entradas especificadas a salidas especificadas. ).

** Por "incluido en la cadena de bloques" me refiero a incluido con todas las confirmaciones que considere suficientes para sus propósitos. Si una transacción tiene solo una confirmación, todavía es posible que el bloque en el que se ha incluido quede huérfano más adelante. Con cada confirmación adicional el riesgo de que esto suceda disminuye considerablemente.