¿Se pueden usar secuencias de comandos de Bitcoin para ataques de doble gasto?

Una transacción estándar de Bitcoin deposita monedas en una dirección y luego, utilizando el lenguaje de programación de Bitcoin, establece que quien quiera gastar esta salida debe poseer la clave privada correspondiente a esa dirección.

Sin embargo, es posible desviarse de esta plantilla base para crear transacciones más complejas, donde se deben cumplir otras condiciones para gastar el resultado de la transacción.

¿Es posible crear una transacción en la que se deposite una suma en una dirección, pero solo el propietario de otra clave privada puede gastarla? No soy un experto en secuencias de comandos de Bitcoin, pero esto parece al menos posible.

En este caso, ¿se puede usar una transacción tan manipulada para montar un ataque de doble gasto, donde la dirección A envía la suma X a la dirección B, pero una vez que se completa la transacción, la dirección A conserva la propiedad de la suma y puede enviarla a otra parte, mientras que la dirección B en realidad no puede hacer nada al respecto incluso si la suma se acredita a su saldo?

¿Cómo trataría una billetera estándar una transacción de este tipo? ¿Reconocería incluso que está sucediendo algo extraño, o mostraría ciegamente que X BTC ingresó la dirección B, independientemente del script de transacción?


Editar:

Lo siento, me engañó la forma en que sitios como blockchain.info muestran las transacciones: una transacción en realidad no contiene ninguna "dirección de salida", solo contiene salidas que establecen las condiciones necesarias para gastarlas; la "dirección de salida" se calcula comprobando la firma de la dirección solicitada por el script de salida; por lo tanto, es imposible "enviar dinero a la dirección B" sin colocar realmente la dirección B en el script de salida.

Sin embargo, la pregunta sigue siendo: ¿podría diseñarse una transacción para engañar a una billetera para que le diga a su usuario "Recibí X BTC", mientras que otra persona puede reclamar la suma usando otra clave privada?

Tenga en cuenta que la transacción, tal como la describí, está diseñada para que B no tenga ningún derecho a gastar la suma; en cambio, una transacción más compleja podría permitir que tanto B como A lo gasten.
Pensé que se generaba una clave para cada transacción individual, por lo que si A o B gastaban en esta suma, tenía que ser totalmente diferente y debitar de la cuenta de origen.
Ok, eso no funcionaría (ver editar). Pero tal vez algo más lo haría...

Respuestas (2)

Lo que estás describiendo es una contradicción de términos. Si se deposita una suma de dinero en una dirección, eso significa que solo la clave privada de esa dirección puede gastar el dinero.

Tal vez podría crear una transacción no estándar y decirle a la gente que le está dando permiso al propietario de la dirección B para gastarlo, pero si la gente observa la transacción con suficiente atención, podrán decir que realmente es la dirección C (y no B) ' s propietario que puede gastarlo. No hay forma de evitar esto: la salida de la transacción es pública, al igual que la implementación de cómo funciona.

Entonces, si la pregunta es: ¿puede engañar al software X con una transacción no estándar? Tal vez dependa de encontrar un error (u otra situación menos que ideal) en el software en cuestión. (por ejemplo, si crea una transacción que puede gastar la dirección B o C, tal vez la billetera que posee B diga que tiene el saldo, y si no lo transfiere nuevamente antes de que usted lo haga, entonces puede "robarlo de vuelta"). " el dinero de esa manera) Sin embargo, trataría cualquier transacción no estándar como altamente sospechosa.

De acuerdo (ver editar). Sin embargo, la pregunta sigue en pie: ¿cómo reaccionan los clientes a las transacciones no estándar? ¿Cómo pasa el cliente de referencia de "un script de salida de transacción" a "oye, acabas de recibir 42 BTC"? ¿Podría ser engañado por algo como esto?

No, no engañará al cliente estándar con esto. Si no comprende el script por completo (es decir, es un script no estándar), no intenta analizarlo parcialmente o lo que sea. El procedimiento es simple: si el cliente no puede entender completamente el script, simplemente lo ignora. Período.

¿Alguna referencia para esto? ¿Qué tipos de transacciones se consideran "estándar"? ¿Quién decide si una transacción es estándar? ¿Cómo puede incluso obtener una transacción no estándar extraída en la cadena de bloques si el software de referencia simplemente la ignora?
Hay un protocolo y luego está la implementación de referencia y también otras implementaciones. Si bien el protocolo es estable, las implementaciones no lo son y algunas características se adoptan más rápidamente en algunos clientes. Lo mismo ocurre con la política de confiar en trx: diferentes implementaciones tienen reglas ligeramente diferentes cuando se trata de decisiones sobre confiar en trx. Lo que es un script "estándar" depende del cliente, pero generalmente es un script que requiere una clave pública válida y una firma. Más información aquí .
consulte github.com/bitcoin/bitcoin/blob/… (solucionador de funciones): incluso si no sabe programar, esas cuatro líneas deberían ser lo suficientemente claras y contienen las cuatro transacciones estándar. Las futuras versiones de bitcoind permitirán que cualquier otro txs sea estándar ( bitcoin.stackexchange.com/questions/28181/… ), pero aún así, los clientes/carteras miran todo el tx para calcular la dirección de bitcoin.