Kann ich mehr als einmal über jeden Vorschlag von The DAO abstimmen?

Eine Person hat im Thread des DAO-Forums Hat die Abstimmung begonnen , dass sie mehr als einmal über einen Vorschlag abstimmen konnte.

Kann ich mehr als einmal über jeden Vorschlag von The DAO abstimmen?

Antworten (1)

Es folgt die Funktion aus dem Quellcodevote() von The DAO .

function vote(
    uint _proposalID,
    bool _supportsProposal
) onlyTokenholders noEther returns (uint _voteID) {

    Proposal p = proposals[_proposalID];
    if (p.votedYes[msg.sender]
        || p.votedNo[msg.sender]
        || now >= p.votingDeadline) {

        throw;
    }

    if (_supportsProposal) {
        p.yea += balances[msg.sender];
        p.votedYes[msg.sender] = true;
    } else {
        p.nay += balances[msg.sender];
        p.votedNo[msg.sender] = true;
    }

    if (blocked[msg.sender] == 0) {
        blocked[msg.sender] = _proposalID;
    } else if (p.votingDeadline > proposals[blocked[msg.sender]].votingDeadline) {
        // this proposal's voting deadline is further into the future than
        // the proposal that blocks the sender so make it the blocker
        blocked[msg.sender] = _proposalID;
    }

    Voted(_proposalID, _supportsProposal, msg.sender);
}

Die erste bedingte Anweisung in der vote()Funktion:

if (p.votedYes[msg.sender]
    || p.votedNo[msg.sender]
    || now >= p.votingDeadline) {

    throw;
}

storniert Ihre Transaktion ( throw), wenn Ihr Konto bei einem Vorschlag bereits mit Ja ( ) oder p.votedYes[msg.sender]Nein ( ) gestimmt hat .p.votedNo[msg.sender]

Ihre Transaktion wird auch storniert, wenn Sie nach Ablauf der Vorschlagsabstimmungsfrist ( ) abstimmen now >= p.votingDeadline.

Ein wenig Gas (Ether) wird verbraucht, wenn Ihre Transaktion storniert wird.



Testen meiner Hypothese

Hier sind zwei Transaktionen, bei denen Stimmen für denselben Vorschlag von demselben Konto gesendet werden:

Diese beiden Transaktionen sind beide Aufrufe der vote()Funktion, da die Verwendung der Signatur web3.sha3('vote(uint256,bool)').substr(0, 10)das Ergebnis erzeugt , das 0xc9d27afemit dem Beginn der Eingabedaten in beiden Transaktionen übereinstimmt.

Und hier ist die zweite Transaktion, die die Stornierung der Transaktion zeigt.Geben Sie hier die Bildbeschreibung ein

Die erste Transaktionsgebühr betrug 0,001489425 Ether und die zweite stornierte Transaktionsgebühr betrug 0,00315 Ether. Beachten Sie, dass die zweite stornierte Transaktion mehr gekostet hat als die erste erfolgreiche Transaktion.



MyEtherWallet Vs Ethereum Wallet (Nebel)

Ergebnisaktualisierung von einem anonymen, hilfreichen DAOHub-Forum-Benutzer:

  • MyEtherWallet erlaubt Ihnen derzeit, mehr als einmal über denselben Vorschlag von demselben Konto abzustimmen.
  • Ethereum Wallet (Mist) wird Sie nach Ihrer ersten Abstimmung darüber informieren, dass das Konto gesperrt ist. Wenn Sie fortfahren möchten, wird Ihnen die Meldung „Daten können nicht ausgeführt werden, daher wird das gesamte bereitgestellte Gas verwendet“ angezeigt, bevor die Transaktion ausgeführt wird.
"MyEtherWallet erlaubt Ihnen derzeit, mehr als einmal über denselben Vorschlag von demselben Konto abzustimmen." <- Arbeite daran, das zu beheben. Es ist eine unterhaltsame Lösung, die Sie interessieren könnte: Rufen Sie die Abstimmungsfunktion mit der Funktion schätztGas () auf. Wenn das ganze Gas verbraucht wird, bedeutet dies, dass eine Ausnahme ausgelöst wird, sodass der Benutzer bereits abgestimmt hat oder der Benutzer nicht zugelassen wird oder das Ende der Debattenperiode erreicht ist.
Sie haben Recht, das estimateGas()könnte mich interessieren (bin ich so vorhersehbar?). Ich habe jetzt ein Perl-Skript erstellt, um Vorschläge aufzulisten, den Abstimmungsstatus jedes Kontos gegen die Vorschläge aufzulisten und über die Vorschläge abzustimmen - von der Befehlszeile aus. Verwenden der estimateGas()Methode zum Überprüfen des Abstimmungsstatus. Siehe github.com/bokkypoobah/TheDAOVoter/blob/master/theDAOVoter . Danke @tayvano.