Wie stimme ich öfter in einem intelligenten Wahlvertrag ab?

Ich habe einen einfachen kopierten Smart Contract für Wahlen, bei dem ein Wähler nur einmal für einen Kandidaten stimmt und ihm dann verweigert wird, mehrmals zu wählen.

Aber wäre es möglich, dem Wähler zu erlauben, bis zu 3 Mal abzustimmen und jedes Mal eine Stimme an einen anderen Kandidaten zu senden ? Das heißt, wenn Sie mehr als eine Stimme an einen Kandidaten senden, wird Ihnen dies verweigert. Wie würde es gemacht werden?

Der Code

contract Election {

struct Candidate {
    string name;
    uint voteCount;
}
struct Voter {
    uint voteIndex;
    bool voted;
    uint weight;
}

address public owner;
string public name;
mapping(address => Voter) public voters;
Candidate[] public candidates;
uint public auctionEnd;

event ElectionResult(string name, uint voteCount);

function Election(string _name, uint durationMinutes, string candidate1, string candidate2, string candidate3, string candidate4, string candidate5) public{
    owner = msg.sender;
    name = _name; 
    auctionEnd = now + (durationMinutes * 1 minutes);

    candidates.push(Candidate(candidate1, 0));
    candidates.push(Candidate(candidate2, 0));
    candidates.push(Candidate(candidate3, 0));
    candidates.push(Candidate(candidate4, 0));
    candidates.push(Candidate(candidate5, 0));
}

function authorize(address voter) public {
    require(msg.sender == owner);
    require(!voters[voter].voted);

    voters[voter].weight = 1;

}

function vote(uint voteIndex) public {
    require(now < auctionEnd);
    require(!voters[msg.sender].voted);

    voters[msg.sender].voted = true;
    voters[msg.sender].voteIndex = voteIndex;

    candidates[voteIndex].voteCount += voters[msg.sender].weight;
}

function end() public {
    require(msg.sender == owner);
    require(now >= auctionEnd);

    for(uint i=0; i < candidates.length; i++) {
        ElectionResult(candidates[i].name, candidates[i].voteCount);
    }
}
}
Hier geht es nicht um Ethereum, sondern um allgemeine Programmierung.

Antworten (1)

Ich stimme @Nulik zu, dass es hier allgemeiner ums Programmieren geht. Sie wollen die Regeln ändern. Anstatt zu überprüfen, ob der Wähler jemals gewählt hat, möchten Sie im Grunde ändern, wie oft er gewählt hat.

Das

struct Voter {
    uint voteIndex;
    bool voted;  // <= ever voted
    uint weight;
}

Dazu:

struct Voter {
    uint voteIndex;
    uint voted; // <== count of votes cast
    uint weight;
}

Das

require(!voters[voter].voted);

Dazu

require(voters[voter].voted < 3);

Das

voters[msg.sender].voted = true;

Dazu

voters[msg.sender].voted += 1;

Dies ist keineswegs gründlich getestet und es gibt keine Garantie. Es kann nur ein Anfang für Bildungszwecke sein.

Ich hoffe es hilft.

Danke, hat auf jeden Fall geholfen! Ich wollte die Regeln nicht brechen, es ist immer noch eine intelligente Vertragsentwicklung, und ich könnte mir keinen besseren Ort vorstellen, um dies zu fragen.
Es funktioniert eigentlich ganz gut, aber ich kann beim besten Willen nicht herausfinden, wie ich sagen soll, dass man jedes Mal für einen anderen Kandidaten stimmen muss und nicht in der Lage ist, einem Kandidaten alle drei Stimmen zu geben
Sie bräuchten eine andere Speicheranordnung und eine andere Anforderung in der Prüfung. Sie könnten eine Zuordnung mit gehashtem Voter+Vote für Schlüssel in Betracht ziehen, um sicherzustellen, dass dieselbe Stimme nicht zweimal abgegeben wird.