¿Podemos diseñar el protocolo de modo que una dirección solo se pueda usar una vez como salida en una transacción?

La mayoría de los usuarios reutilizan sus direcciones para depósitos (es decir, reciben dinero más de una vez en una dirección determinada).
¿Se puede diseñar el protocolo de tal manera que una dirección se pueda usar solo una vez como salida en una transacción?
Supongo que tendría que haber una forma de buscar rápidamente si una dirección ya estaba "agotada".
También tendría que haber una forma de obtener de alguna manera la "siguiente dirección". Por ejemplo, si una dirección se usa para dividendos y solo se puede usar una vez, el pagador de dividendos debería poder obtener automáticamente una nueva dirección sin la entrada repetida del propietario (beneficiario). (una configuración única de esto, estaría bien)
El objetivo de esto es mejorar la privacidad.

Estos son solo pensamientos, comentarios bienvenidos.

Creo que Android Bitcoin Wallet 4 desalienta la reutilización de direcciones al mostrar siempre una dirección nueva automáticamente.

Respuestas (2)

Mallory piratea la computadora de Alice y le roba la billetera. Afortunadamente, Alice lo había encriptado con una contraseña segura. Alice quiere demandar a Mallory por entrar en su computadora, por lo que busca un abogado, Bob.

  • Dirección de Alice, 10BTC --> Dirección de Bob

Desafortunadamente para Alice, Mallory controla un nodo en la red Bitcoin, no muy lejos de Alice, que rápidamente ve que la transacción es de Alice (ella tiene todas sus direcciones) y, en su lugar, transmite la transacción a cientos de nodos a la vez:

  • Dirección de Mallory, 1000 satoshis --> Dirección de Bob

Lo cual es incompatible con la transacción honesta de Alice.

Ahora, suceden tres cosas:

1) Alice intenta enviar los bitcoins a una dirección diferente dada por Bob

2) Los nodos de Alice ven su transacción como un gasto doble y se niegan a transmitir cualquier transacción que gaste esa moneda a una dirección diferente

3) La transacción de Mallory finalmente se extrae. Volvamos a intentar gastarle las monedas a Bob.

Mallory puede hacer otras cosas maliciosas con su puesto, como permitir que Alice gaste su bitcoin en una recaudación de fondos de la iglesia pero no en una clínica de abortos (suponiendo que sepa la dirección de ambos).

La principal forma en que las personas pierden su privacidad en bitcoin hoy en día es a través del análisis heurístico de la cadena de bloques, no de la reutilización de direcciones. La introducción de una nueva regla de red para proteger a los usuarios contra su propia estupidez no mejorará significativamente la privacidad (de todos modos, la mayoría de las billeteras no reutilizan las direcciones de forma predeterminada) y expone a los usuarios a algunos ataques interesantes.

No entiendo tu razonamiento. Mallory no tiene acceso a las claves privadas de Alice (la billetera de Alice está encriptada). Además, incluso si Mallory no transmite la transacción de Alice, otros nodos lo harán. Lleva tiempo componer un nuevo tx, en ese tiempo el tx de Alice alcanzaría los 100 nodos. La reutilización de direcciones facilita el análisis heurístico.
Mallory necesitaría las llaves de Alice para gastar dos veces la moneda de Alice. Pero aquí estamos hablando de una doble recepción , no de un doble gasto. La propuesta es invalidar una transacción si ese script de salida alguna vez se ha incluido en un bloque. Esto significa que cualquier nodo que vea primero la transacción de Mallory se negará a transmitir la de Alice, ya que, de lo contrario, la red podría sufrir DoS de forma gratuita mediante el envío de millones de transacciones a una dirección. Mallory solo necesita la dirección de Alice para hacer esto, no su clave privada.
En cuanto a "Se necesita tiempo para preparar un nuevo tx", sí, pero se puede hacer por adelantado: Mallory firma una transacción con una salida firmada y otra sin firmar, utilizando banderas inteligentes de SigHash. Tan pronto como ve la transacción de Alice, simplemente ingresa la dirección de Bob en la salida sin firmar, que cuesta solo un memcpy(), no se requiere criptografía.
Sí, ahora te sigo, gracias. ¿Qué pasa con todos los otros nodos que recibirían el tx original de Alice? ¿No crees que uno se propagaría más rápido? Estoy de acuerdo con el ataque DoS aquí. Sin embargo, podemos agregar el requisito de que la tarifa se gaste en esos txs. (Quiero decir que habría un costo para enviar txs no válidos) Sin embargo, como dije, esto está destinado a estimular la conversación, debe haber una manera de diseñar esto de alguna manera que no abra nuevos vectores de ataque.
Supongamos que Mallory controla suficientes nodos bien conectados para que su transacción alcance el 90 % de la potencia hash antes que la de Alice. Esto significa que Alice tiene un 10 % de posibilidades de éxito. Un bufete de abogados probablemente fue un mal ejemplo, ya que Alice puede volver a intentarlo hasta que se acepte su transacción (lo que eventualmente sucederá con un 100% de probabilidad), pagando la tarifa solo una vez. Si a Bob le pagan en dos días, no le importará, y Mallory paga una tarifa por cada tx de ataque hasta que Alice tenga éxito. Si Alice estuviera en una tienda de comestibles, el ataque de Mallory sería más molesto.
Sin embargo, Mallory tiene un mejor truco bajo la manga. Puede hacer la promesa de bloquear recursivamente cada transacción contaminada con la salida inicial de Alice a Bob. Si convence a suficientes personas de que su ataque tendrá éxito, las monedas de Alice perderán valor y ya no serán fungibles, ya que tardarán años en gastarse y requerirán tarifas más altas para gastarlas con éxito. Si Bob es económicamente racional, rechazará la moneda maldita de Alice, a menos que tenga un buen vaso de monedas a mano.

Supongo que tendría que haber una forma de buscar rápidamente si una dirección ya estaba "agotada".

Hay, en Bitcoin. Simplemente pegue la dirección en el cuadro de búsqueda (no en el encabezado) en https://blockchain.info .

Con respecto a la creación de una nueva dirección: no solo es imposible en la forma en que se hacen las cosas actualmente, sino que además es contradictorio con su objetivo de mejorar la privacidad.

En primer lugar, hablemos de la situación actual. Las direcciones son hashes de claves públicas (simplificado). Esas claves públicas se asocian criptográficamente con claves privadas que solo conoce el propietario de las mismas porque conocerlas permite gastar el dinero que se ha enviado a las direcciones asociadas a ellas. Los hashes son unidireccionales, lo que significa que puede determinar el hash de algo, pero no ese algo dado solo el hash. Para pagar a una dirección diferente que pertenece al destinatario, tenía que hacer una función conocida como incrementar en 1 la clave privada, lo cual es imposible no solo porque no puede encontrar la clave pública dado su hash, sino también porque no puede encontrar la clave privada dada la clave pública, o de alguna manera acceder a una lista de direcciones del destinatario que subvertiría el objetivo de una mayor privacidad.

Ahora a todas las situaciones ficticias, por lo que todos los detalles de Bitcoin se eliminan en este párrafo. Si soy el primero en pagar a la dirección del Sr. Smith 1e9Kp22y usted quiere pagar a esa misma dirección 5 minutos después, debe obtener una nueva dirección. Puede haber una o varias direcciones que pueden aparecer después 1e9Kp22, pero ciertamente solo hay un pequeño número de ellas para que el Sr. Smith pueda encontrar la correcta. Sea Φ(α)el conjunto de todas las direcciones que son las posibles direcciones siguientes después de la dirección α. En esta situación ficticia general, no podemos excluir la posibilidad de poder simplemente crear nuevas direcciones pertenecientes al Sr. Smith sin socavar el derecho exclusivo del propietario de las monedas para gastarlas. Ya que puedes encontrar φ ∈ Φ(α)a quien pagar y no sabes nada más que yo y ∀α∈Addreses : |Φ(α)| smallpuedo encontrar tuφsimplemente encontrando todos los elementos Φ(α)y examinando a cuáles se les ha pagado dinero. Como ahora ambos sabemos que 1e9Kp22pertenece al Sr. Smith y acabo de enterarme de que φtambién pertenece al Sr. Smith, ambos sabemos que la dirección que usó la otra persona pertenece al Sr. Smith.

La solución simple de este problema en la práctica es dar una dirección diferente para cada pago esperado, por ejemplo, para cada compra en una tienda web. ¿Por qué el dueño de la tienda nos daría a ambos la misma dirección en primer lugar? Las direcciones son completamente gratis.