У меня есть простой скопированный смарт-контракт для выборов, где избиратель голосует только один раз за одного кандидата, а затем ему отказывают в голосовании еще раз.
Но можно ли разрешить избирателю голосовать до 3 раз и каждый раз отправлять голос другому кандидату ? Это означает, что когда вы отправляете более одного голоса одному кандидату, вам будет отказано. Как это сделать?
Код
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);
}
}
}
Я согласен с @Nulik в том, что это больше касается программирования. Вы хотите изменить правила. По сути, вместо того, чтобы проверять, голосовал ли избиратель когда-либо, вы хотите изменить, сколько раз он голосовал.
Этот
struct Voter {
uint voteIndex;
bool voted; // <= ever voted
uint weight;
}
К этому:
struct Voter {
uint voteIndex;
uint voted; // <== count of votes cast
uint weight;
}
Этот
require(!voters[voter].voted);
К этому
require(voters[voter].voted < 3);
Этот
voters[msg.sender].voted = true;
К этому
voters[msg.sender].voted += 1;
Это ни в коем случае не тщательно проверено, и нет никакой гарантии. Это может быть начало только в образовательных целях.
Надеюсь, поможет.
Нулик