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?
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.
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.
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).
Nate Eldredge