Aus Gas und Atomizität

Ich lese das Abstimmungsbeispiel Solidity by Example . Ich interessiere mich für die voteVertragsfunktion:

function vote(uint proposal) {
    Voter sender = voters[msg.sender];
    require(!sender.voted);
    sender.voted = true;
    sender.vote = proposal;

    // If `proposal` is out of the range of the array,
    // this will throw automatically and revert all
    // changes.
    proposals[proposal].voteCount += sender.weight;
}

Was passiert, wenn einer Transaktion nach der Linie sender.voted = true;, aber vor der Linie das Gas ausgeht proposals[proposal].voteCount += sender.weight;? In diesem Fall scheint es, als ob die Abstimmung als abgegeben gezählt wird, aber tatsächlich voteCountnicht aktualisiert wird. Aufgrund der require(!sender.voted);Linie kann der Wähler nicht versuchen, mit einem höheren Gaslimit zu revotieren.

sender.votedWie werden solche Situationen ohne Gas in der Praxis gehandhabt, um die Atomarität des Setzens und Inkrementierens zu gewährleisten proposals[proposal].voteCount?

Antworten (1)

Wenn bei einem Vertrag ein Fehler auftritt (schlechter Sprung, Gasmangel oder eine andere Ausnahme), wird ein Fehler ausgegeben und die gesamte Transaktion wird rückgängig gemacht.

Der Grund für das Zurücksetzen besteht darin, dass es keine sichere Möglichkeit gibt, die Ausführung fortzusetzen, da ein erwarteter Effekt nicht eingetreten ist. Da wir die Atomarität von Transaktionen beibehalten möchten, ist es am sichersten, alle Änderungen rückgängig zu machen und die gesamte Transaktion (oder zumindest den Aufruf) ohne Wirkung zu machen.

Weitere Informationen zu Atomarität, Throw und Ausnahmen finden Sie im Doc

Beinhaltet dies ETH-Transfers? dh nehmen wir an, die 1. Zeile in der Funktion msg.sender.transfer(1000);wäre, würde das auch rückgängig gemacht werden?
Ja, es beinhaltet ETH-Transfers