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);
}
}
}
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.
Nulik