Как проголосовать больше раз в смарт-контракте выборов?

У меня есть простой скопированный смарт-контракт для выборов, где избиратель голосует только один раз за одного кандидата, а затем ему отказывают в голосовании еще раз.

Но можно ли разрешить избирателю голосовать до 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);
    }
}
}
это не про Ethereum, это про общее программирование.

Ответы (1)

Я согласен с @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;

Это ни в коем случае не тщательно проверено, и нет никакой гарантии. Это может быть начало только в образовательных целях.

Надеюсь, поможет.

Спасибо, это определенно помогло! Я не хотел нарушать правила, это все еще разработка смарт-контрактов, и я не мог придумать лучшего места, чтобы спросить об этом.
Это на самом деле работает довольно хорошо, но я не могу понять, как заявить, что каждый раз вы должны голосовать за другого кандидата и не иметь возможности отдать одному кандидату все три голоса.
Вам понадобится другое устройство хранения и другое требование в чеке. Вы можете рассмотреть сопоставление с использованием хешированного избирателя + голосование для ключей, чтобы гарантировать, что один и тот же голос не будет подан дважды.