¿Qué es el nonce en Ethereum? ¿Cómo evita el doble gasto?

Recientemente me fascinó Blockchain y comencé a aprender Ethereum. Me encontré con el concepto del nonce en Ethereum.

Después de investigar, descubrí que nonce se usa para dos propósitos.

una. Mantener en orden las transacciones relacionadas con una cuenta. es decir, si hay una transacción con el nonce 3 relacionada con alguna cuenta en el txpool y alguna transacción llegará al nonce 4, entonces esa transacción no se extraerá hasta que ya menos que se extraiga la transacción con el nonce 3.

Entiendo esto.

Pero tengo alguna pregunta que no soy capaz de encontrar?

i) el valor nonce está relacionado con una dirección, ¿verdad? Entonces, dos direcciones pueden tener el mismo nonce al mismo tiempo, es decir, la cuenta con la dirección A puede tener el último nonce 2, de manera similar, la cuenta con la dirección B también puede tener el último nonce 2.

ii) ¿Todos los nodos de la red tendrán el mismo valor nonce más reciente para todas las cuentas disponibles en la red?

Es decir, si hay tres cuentas y 2 mineros y el valor de nonce para tres cuentas es 1,2,3 respectivamente, ambos mineros tendrán el mismo nonce.

Suposición: ambos mineros están sincronizados

b) ¿cómo se usa nonce para evitar un gasto doble?

Terminé teniendo que mirar el diseño UTXO de Bitcoin frente al diseño de saldos de Ethereum para entender realmente el nonce. Tenía sentido cuando leí solo sobre Ethereum, pero seguía preguntándome por qué Bitcoin no lo necesitaba.
eth account nonce no tiene nada que ver con el doble gasto. qr.ae/Tctelk

Respuestas (2)

¿Qué es el nonce en Ethereum?

Si consulta el Glosario en Github Wiki , hay dos tipos de nonce que se usan en Ethereum.

  1. Account nonce: es simplemente el recuento de transacciones de una cuenta

Account nonce: un contador de transacciones en cada cuenta. Esto evita los ataques de reproducción en los que se envía una transacción, por ejemplo. B puede reproducir 20 monedas de A a B una y otra vez para agotar continuamente el saldo de A.

  1. Prueba de trabajo nonce: el valor aleatorio en un bloque que se usó para satisfacer la prueba de trabajo (dependiendo de la dificultad en el momento).

Nonce de prueba de trabajo: un valor sin sentido en un bloque que se puede ajustar para tratar de satisfacer la condición de prueba de trabajo

Aquí se refiere a la cuenta nonce, que es el recuento de transacciones de esa cuenta.

i) El valor de Nonce está relacionado con una dirección, ¿verdad? Entonces, dos direcciones pueden tener el mismo nonce al mismo tiempo, es decir, la cuenta con la dirección A puede tener el último nonce 2, de manera similar, la cuenta con la dirección B también puede tener el último nonce 2.

Sí, como se explicó anteriormente, es el recuento de transacciones y, por lo tanto, está relacionado con la cuenta. Como es un número creciente, dos cuentas pueden tener el mismo nonce al mismo tiempo.

ii) ¿Todos los nodos de la red tendrán el mismo valor nonce más reciente para todas las cuentas disponibles en la red?

Cuando los nodos se sincronicen con blockchain, eventualmente lo harán. Dado que un nodo acepta la cadena válida más larga, no hay problema de que todos los nodos no se actualicen con el último valor de nonce en el momento en que se extrae una transacción. Una vez sincronizados, tendrán el mismo valor de nonce para la cuenta. (Es obvio porque en una cadena de bloques se supone que todos los nodos tienen los mismos datos de bloque. Entonces, después de un cierto período de tiempo , puede estar bastante seguro de que la transacción está confirmada, de ahí el valor de nonce)

b) nonce se usa para evitar el doble gasto, ¿cómo?

Evitar el doble gasto significa dejar de usar dos veces la misma cantidad. Si el nonce se establece en el mismo valor, solo se extraerá una de las transacciones y, la mayoría de las veces, esa puede ser la que tenga un precio de gasolina más alto, pero sin embargo, no se gastará dos veces, ya que solo se realizará una transacción al final en cualquiera de las dos. caso.

Otro truco evitado por nonce es usar precios de gasolina más altos para que una transacción enviada más tarde se extraiga antes que una anterior de la misma cuenta.

Considere una situación en la que A envía una transacción de X ETH a B como pago y la cuenta de A solo tiene X ETH en su cuenta. Una vez que la transacción se envió para ser minada, A puede enviar otra transacción de X ETH con un precio de gas más alto a una de sus otras cuentas, lo que permite que la primera transacción enviada se extraiga más tarde al obtener una prioridad más alta en la cola de transacciones pendientes. Pero dado que Ethereum tiene en cuenta el nonce, esto no está permitido ya que el nonce de la transacción posterior es más alto que el anterior.

También puede consultar esta pregunta .

votado a favor, por mencionar PoW nonce.
Suponiendo que la primera transacción se haya confirmado x número de veces, ¿verdad? De lo contrario, ¿qué me impide transmitir el doble gasto con un precio de gas más alto y con el mismo nonce?
Con respecto a: "Cuenta nonce: es simplemente el recuento de transacciones de una cuenta". Esto no es del todo cierto: el nonce se incrementa cada vez que se ejecuta un código de operación CREAR, ya que una sola transacción puede emitir muchas instrucciones CREAR, este número puede ser significativamente mayor que el número de transacciones.
"Nonce de cuenta: un contador de transacciones en cada cuenta. Esto evita ataques de repetición en los que B puede reproducir una transacción que envía, por ejemplo, 20 monedas de A a B una y otra vez para agotar continuamente el saldo de A". esto es lo que dice el glosario de github. ¿Tienes alguna fuente para consultar?
Si no existieran los nonces, la repetición sería posible sin correr al frente. No se necesitaría manipulación de gas. La razón es que, para permitir legítimamente que se envíe dos veces la misma cantidad de una cuenta a otra, un verificador honesto tendría que aceptar múltiples transacciones con la misma tupla de/a/cantidad. Como tal, un adversario simplemente podría volver a enviar la misma transacción. El nonce le pide al remitente que firme un nuevo mensaje cuando se transfiere la misma cantidad a la misma cuenta y, por lo tanto, el verificador ahora puede descartar de manera segura las transacciones que simplemente se retransmiten.

En primer lugar, es 'nonce', no 'nounce'.

i) Sí, cada dirección tiene un nonce. Las direcciones pueden tener el mismo nonce, y con frecuencia lo tienen.

ii) Sí, todos los nodos en la misma cadena de bloques han registrado el mismo nonce para cada dirección, porque los nodos se almacenan dentro de la cadena de bloques.

b) El nonce es básicamente un contador que realiza un seguimiento de cuántas transacciones ha enviado una dirección.

Supongamos que una dirección A tiene 1 ETH.

Primero, intenta enviar 1 ETH a la dirección B. Llamemos a esta transacción A0 porque fue firmada por A y tiene un nonce 0. Ahora, A intenta duplicar este 1 ETH enviando otra transacción de 1 ETH a C: llamémoslo transacción A1. A1 será rechazado inmediatamente por todos los nodos, porque cada nodo puede ver que A1 debe venir después de A0, y después de A0 no hay suficiente ETH en A para enviar A1.

Por lo tanto, no puede gastar dos veces con diferentes nonces.

A podría intentar una estrategia diferente: duplicar el gasto con el mismo nonce. Primero, A envía la transacción A0 a B, y luego envía otra transacción A0 a C. Ambos tienen el mismo nonce y el mismo origen, pero un destino diferente. Solo se aceptará una de las transacciones A0 en la cadena de bloques, porque todos los nodos pueden ver que A usó el nonce 0 dos veces, y esto no está permitido.

Por lo tanto, tampoco puede gastar dos veces con el mismo nonce.

¿Cómo funciona eso con múltiples transacciones pendientes, que son válidas? Supongamos que tengo 2 ETH. Cuando envié 1ETH a A con nonce 0, y 1 ETH a B con nonce 1, y por alguna razón la transacción B1 se acepta primero, ¿se cancela A0 porque ahora hay un tx aceptado en la cadena con un nonce más alto? ¿O todavía pasaría?
Además, ¿cómo se supone que debo generar nonces en un escenario fuera de línea? Digamos que tengo dos dispositivos, que mantienen un seguimiento interno pero separado del recuento de tx. Al firmar una transacción, que debe enviarse algún tiempo después, ¿cómo puedo asegurarme de que no haya una colisión nonce?
@LOST Las transacciones siempre se confirman en orden de nonce. El nonce 5 siempre se confirmará después del nonce 4. Si no existe una transacción con el nonce 4, el nonce 5 nunca se confirmará.
@LOST Si no hay comunicación entre los dispositivos, y cada uno debe poder firmar una transacción en cualquier momento para su posterior transmisión, no hay forma de evitar una colisión nonce.
@jesses-busman bueno, aquí va un caso de uso :(