Contratos que reciben múltiples transacciones idénticas

Supongamos que se usa un contrato inteligente para agregar papas. Cada vez que una persona obtiene una patata nueva, envía una transacción al contrato inteligente que suma 1 al recuento total de patatas.

Supongamos que, dentro de un solo bloque, una persona envía accidentalmente dos transacciones para agregar al conteo de papas cuando solo tenía la intención de enviar una. Teniendo en cuenta que se procesan en el mismo bloque, ¿hay alguna forma de garantizar que solo una agregue al conteo global de papas?

¿Cómo puede decirles a los mineros que solo incluyan una transacción de un tipo específico por dirección por bloque?

Respuestas (1)

Una forma obvia es usar un mapeo para rastrear qué cuentas han enviado una transacción:

contract C {
  mapping (address => bool) sentTx;
  uint public globalCount;

  function potato() {
    if (!sentTx[msg.sender]) {
      globalCount++;
      sentTx[msg.sender] = true;
    }
  }
}

Esto funciona porque el almacenamiento de contratos se actualiza después de cada transacción.

¿Cómo puede decirles a los mineros que solo incluyan una transacción de un tipo específico por dirección por bloque?

Los mineros básicamente tienen el control total (sujeto al software de minería que ejecutan) y deciden qué transacciones incluir en un bloque y en qué orden. El protocolo impone pocas reglas a los mineros: si una transacción es válida y un bloque es válido, los mineros pueden hacer lo que quieran: los mineros no tienen que excluir o incluir ninguna transacción en particular.

"El almacenamiento de contratos se actualiza después de cada transacción". Entonces, si la misma persona envía "agregar 1 al conteo de papas" y envía otra transacción llamada "agregar 1 al conteo de manzanas" con la misma entrada, ¿hay una bifurcación temporal de cadenas de 1 manzana contra 1 papa? ¿Termina esto simplemente desarrollándose a través de un PoW natural?
@nickcarraway No está claro lo que está preguntando. ¿Está hablando del mismo contrato anterior o de un contrato que tiene otra variable para appleCount?
En el comentario anterior, "entrada" se refiere a una entrada de transacción (básicamente, una moneda). Entonces, esto puede ser más una cuestión de cadenas de bloques en general. Si envía Ether a un nodo para que haga una cosa, y simultáneamente envía el mismo Ether a otro nodo para que haga otra cosa, puede causar una bifurcación (temporal) de la cadena de bloques... Por supuesto, esta es la razón por la que espera. para confirmaciones! (Creo que respondí mi propia pregunta)
@nickcarraway Ya veo. La "entrada" a la que se refiere es un UTXO en esos tipos de cadenas de bloques, pero el modelo en Ethereum es diferente: puede tener muchas variables diferentes para representar diferentes cosas como recuentos y tokens, y para el ETH nativo hay una propiedad de "equilibrio" que todas las cuentas tienen.