Pregunta sobre el protocolo de transacción de Bitcoin (tal vez específica de la conferencia de Bitcoin de Coursera)

En el curso de Coursera "Bitcoin and Cryptocurrency Technologies", se introdujo una moneda llamada ScroogeCoin.

Esta moneda es similar a bitcoin en que cada transacción consta de un conjunto de entradas y salidas. Las entradas apuntan a salidas de transacciones anteriores con las firmas correspondientes, y las salidas contienen el valor y la dirección a la que se aplica el valor.

El protocolo verifica que (suma de valores de entrada) - (suma de valores de salida) >= 0, y esta diferencia es la tarifa de transacción.

Siento que esta condición es demasiado floja y puede haber un problema potencial. Por ejemplo, supongamos que Alice tiene una moneda de valor 50 y gasta 100, mientras que Bob tiene una moneda de valor 100 y gasta 50. Ambos están en la misma transacción. Entonces el protocolo permitiría que esto pasara.

Siento que el protocolo debería verificar en su lugar

Para todas las direcciones, (suma de los valores de entrada de la dirección) - (suma de los valores de salida que se gastan de la dirección) >= 0

Esto se debe a que el protocolo original permite gastar desde la dirección de otra persona. Esto suena como algo que se puede explotar, por ejemplo, una transferencia de dinero implícita de Bob a Alice está oculta. Podemos suponer que Alice y Bob se están confabulando para lograr esto.

¿Es esto benigno?

Creo que no entiendo muy bien lo que te preocupa. Mientras tanto Alice como Bob consientan en gastar sus monedas, entonces no hay problema, ¿verdad? ¿Le preocupa que el resto de la red no pueda saber cómo se asignaron las monedas de Alice y Bob entre las dos salidas? Bueno, ¿por qué deberían ser capaces de saberlo? No es asunto de nadie excepto de Alice y Bob.

Respuestas (3)

Para crear una entrada, debe poder demostrar que tiene derecho a gastar esas monedas, generalmente al poseer la clave privada correspondiente para su dirección.

Por ejemplo, supongamos que Alice tiene una moneda de valor 50 y gasta 100, mientras que Bob tiene una moneda de valor 100 y gasta 50. Ambos están en la misma transacción.

Para realizar una transacción como la que describe, las claves privadas de Alice y Bob deben estar disponibles al mismo tiempo. Esto es conceptualmente equivalente a que Alice y Bob usen la misma billetera. En la práctica, Alice y Bob tendrían que usar transacciones separadas si sus billeteras fueran diferentes.

Sí, las claves privadas de Alice y Bob se utilizan para crear las firmas respectivas. Por ejemplo, Alice puede usar su clave privada para crear la firma, enviar la entrada y la salida correspondientes a Bob, y luego Bob completa la creación de la transacción creando firmas para sus monedas de entrada y salida. ¿Está diciendo que esto es un posible exploit en teoría, pero en cuanto a la implementación, lo rechazamos porque una sola transacción debe usar direcciones de entrada de una sola billetera?
Eso no es posible manteniendo las claves en secreto. El autor de la transacción debe conocer todas las claves. Entonces, en tu ejemplo, Alice y Bob son la misma persona. No puede crear una sola transacción que contenga las claves de diferentes personas.
Lo siento, presioné enter y accidentalmente envié mi respuesta antes de que estuviera completa. En mi respuesta actualizada, describí una forma de colusión y construcción de dicha transacción sin filtrar claves privadas. ¿Hay algo en los protocolos o validaciones que no permita esto?
Sí, no había notado tu edición. No estoy completamente seguro de si lo que describe con respecto a compartir la firma es posible, pero dado que estamos hablando teóricamente, supongamos que lo es. El resultado de crear tal transacción sería que 50 de las monedas de Bob se utilizarían para pagar al benefactor de Alice. Una transacción funciona sumando las entradas y luego distribuyéndolas a las salidas. La firma de gasto no especifica el destino de salida, que se define a nivel de transacción. Bob tendría que crear esta transacción y no tiene motivación para hacerlo.
Entonces, ¿supongo que esto es posible? Estoy de acuerdo en que puede haber poca motivación. Estaba pensando que tal vez debido a fuerzas externas, Alice y Bob tienen prohibido enviarse dinero y esto les permite ocultar el hecho. Por otra parte, me acabo de dar cuenta de que hay varias otras formas en que Alice y Bob pueden lograr el mismo objetivo. ¡Gracias por la discusión!

No importa de quién son las monedas que financian (entradas) para la transacción, la verificación de validación aún funciona.

(suma de valores de entrada) - (suma de valores de salida) >= 0

No hay nada que indique la suma de los valores de entrada por usuario. Siempre que el valor total de las entradas, sin importar de quién o de dónde provengan, supere o iguale el valor total de las salidas, la transacción pasa la verificación.

Actualización : no es un exploit. Cada entrada de transacción se trata por separado y la condición para gastar cada entrada debe cumplirse por separado. Si Alice proporciona un tx de entrada, también tendrá que proporcionar un scriptSig para esa única entrada para demostrar que tiene derecho a gastarlo. Del mismo modo, con la transacción de Bob, deberá proporcionar un scriptSig completamente separado que demuestre que tiene derecho a gastar su transacción de entrada.

Alice no puede gastar la transacción de Bob y viceversa (a menos que sea multisig, gastado por alguien, etc.) sin importar cómo se combinen como entradas.

Sí, estoy preguntando por qué la validación está diseñada de esta manera y si esto puede explotarse. Y di un ejemplo de una posible explotación (o tal vez esto no se considera una explotación).
Responder a la actualización: creo que una sola transacción puede contener múltiples entradas y múltiples salidas. Ver en.bitcoin.it/wiki/Transaction#Explanation . Cada entrada tiene su propia firma separada y la condición de validación se aplica a todas las entradas y todas las salidas. Por lo tanto, a menos que me falte algo, me parece que puedo construir tal transacción y hacer que la red la acepte.

Tu malentendido está aquí:

Por ejemplo, supongamos que Alice tiene una moneda de valor 50 y gasta 100, mientras que Bob tiene una moneda de valor 100 y gasta 50. 

Eso no es posible. Cuando una salida se gasta con una entrada, siempre se gasta por completo. No puede decir cuánto de esa salida queda en su lugar: la cantidad que obtiene de esa entrada es exactamente la cantidad creada por la cantidad anterior.

Si Bob tiene una moneda de valor 100 y solo quiere gastar 50, todo lo que puede hacer es gastar su moneda de 100 y agregar una salida adicional a la transacción que le devuelva 50 (generalmente a una nueva dirección suya, por razones de privacidad).

no estaba claro Lo que quise decir es. Alice gasta monedas de 50, envía monedas de valor 100 a alguna dirección X. Bob gasta monedas de 100, envía monedas de valor 50 a alguna dirección Y. Ambos ocurren en la misma transacción. Por lo tanto, en esta transacción, vemos entradas con valor {50, 100} y salidas con valor {50, 100}.
¿Qué quisiste decir es qué?