¿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?
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.
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.
Por lo general*, una transacción de bitcoin incluye una firma para confirmar lo siguiente:
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.
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.
bvpx
bvpx
pieter wuille