Verträge, die mehrere identische Transaktionen erhalten

Angenommen, ein Smart Contract wird verwendet, um Kartoffeln hinzuzufügen. Jedes Mal, wenn eine Person eine neue Kartoffel bekommt, sendet sie eine Transaktion an den Smart Contract, die die Gesamtzahl der Kartoffeln um 1 erhöht.

Nehmen wir an, innerhalb eines einzelnen Blocks sendet eine Person versehentlich zwei Transaktionen, um sie der Kartoffelzählung hinzuzufügen, wenn sie nur eine senden wollte. Wenn man bedenkt, dass sie im selben Block verarbeitet werden, gibt es eine Möglichkeit sicherzustellen, dass nur eine zur globalen Kartoffelzählung hinzukommt?

Wie können Sie Bergleuten sagen, dass sie nur eine Transaktion eines bestimmten Typs pro Adresse und Block aufnehmen sollen?

Antworten (1)

Eine naheliegende Möglichkeit besteht darin, ein Mapping zu verwenden, um zu verfolgen, welche Konten eine Transaktion gesendet haben:

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

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

Das funktioniert, weil der Vertragsspeicher nach jeder Transaktion aktualisiert wird.

Wie können Sie Bergleuten sagen, dass sie nur eine Transaktion eines bestimmten Typs pro Adresse und Block aufnehmen sollen?

Miner haben grundsätzlich die volle Kontrolle (abhängig von der Mining-Software, die sie ausführen) und entscheiden, welche Transaktionen in einem Block und in welcher Reihenfolge enthalten sind. Das Protokoll legt Minern nur wenige Regeln auf: Wenn eine Transaktion gültig ist und ein Block gültig ist, können Miner tun, was sie wollen: Miner müssen keine bestimmten Transaktionen ausschließen oder einschließen.

"Der Vertragsspeicher wird nach jeder Transaktion aktualisiert." Wenn also dieselbe Person „1 zur Kartoffelzählung hinzufügen“ und eine weitere Transaktion namens „1 zur Apfelzählung hinzufügen“ mit derselben Eingabe sendet, gibt es dann eine vorübergehende Abzweigung von 1 Apfel gegen 1 Kartoffelketten? Wird dies am Ende nur durch natürliches PoW entgabelt?
@nickcarraway Unklar, was Sie fragen. Sprechen Sie oben von demselben Vertrag oder von einem Vertrag, der eine andere Variable für appleCount hat?
Im obigen Kommentar bezieht sich "Eingabe" auf eine Transaktionseingabe (im Grunde eine Münze). Das dürfte also eher eine Frage von Blockchains im Allgemeinen sein. Wenn Sie Ether an einen Node senden, damit er eine Sache tut, und gleichzeitig denselben Ether an einen anderen Node senden, damit er eine andere Sache tut, kann dies zu einer (vorübergehenden) Blockchain-Verzweigung führen ... Deshalb warten Sie natürlich für Konfirmationen! (Ich habe meine eigene Frage beantwortet, denke ich)
@nickcarraway Ich verstehe. Die „Eingabe“, auf die Sie sich beziehen, ist ein UTXO in diesen Arten von Blockchains, aber das Modell in Ethereum ist anders: Sie können viele verschiedene Variablen haben, um verschiedene Dinge wie Zählungen und Token darzustellen, und für die native ETH gibt es eine „Balance“-Eigenschaft alle Konten haben.