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?
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.
Nick Carraway
eth
Nick Carraway
eth