Vamos começar por adicionar a função WinningProposta
ao nosso contrato. Esta função irá iterar sobre todas as propostas e devolver a que tiver mais votos. Além disso, criaremos uma função WinnerName
para devolver o nome da proposta vencedora. Aqui está a versão final do nosso contrato:
Solidez
//Identificador de licença SPDX: GPL-3.0
solidez do pragma > < =0.7.0 0.9.0;
contrato Eleitor {
Pessoa estruturada {
bool voted;
uint vote;
}
Estrutura Proposta {
string name;
uint voteCount;
}
Proposta [] propostas públicas;
mapeamento (morada = > Pessoa) eleitores públicos;
função registerVoter () public {
voters[msg.sender].voted = false;
}
função addProposal (string memory _name) public {
proposals.push(Proposal(_name, 0));
}
função voto (uint _proposità) público {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
função winningProposal () retornos de vista pública (uint WinningProposal_) {
unidade WinningVoteCount = 0;
para (unidade p = 0; p < propostas.comprimento; p++) {
if (propostas [p] .VoteCount > WinningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
função winnerName () retorna a vista pública (memória de string WinnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Vamos explicar as novas adições:
Função de proposta vencedora: Esta função itera sobre todas as propostas e encontra aquela com a maior contagem de votos. Retorna o índice desta proposta na matriz de propostas
. É uma função de visualização
, o que significa que não modifica o estado do contrato e apenas lê os dados.
Função Nome do Vencedor: Esta função chama a função WinningProposta
para obter o índice da proposta vencedora e devolve o nome desta proposta.
Compile o seu contrato clicando no ícone do compilador Solidity na barra lateral esquerda e, em seguida, clicando no botão “Compilar”.
Implemente o seu contrato no separador “Implantar Transações de & Execução” e interaja com ele. Registe alguns eleitores, adicione algumas propostas, vote e, finalmente, verifique o vencedor.
Na próxima lição, discutiremos interações de contrato e registro de eventos. Vamos aprender como os contratos podem interagir uns com os outros e como registar e monitorizar atividades na blockchain. Parabéns por construir o seu primeiro sistema de votação descentralizado no Ethereum!
Vamos começar por adicionar a função WinningProposta
ao nosso contrato. Esta função irá iterar sobre todas as propostas e devolver a que tiver mais votos. Além disso, criaremos uma função WinnerName
para devolver o nome da proposta vencedora. Aqui está a versão final do nosso contrato:
Solidez
//Identificador de licença SPDX: GPL-3.0
solidez do pragma > < =0.7.0 0.9.0;
contrato Eleitor {
Pessoa estruturada {
bool voted;
uint vote;
}
Estrutura Proposta {
string name;
uint voteCount;
}
Proposta [] propostas públicas;
mapeamento (morada = > Pessoa) eleitores públicos;
função registerVoter () public {
voters[msg.sender].voted = false;
}
função addProposal (string memory _name) public {
proposals.push(Proposal(_name, 0));
}
função voto (uint _proposità) público {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
função winningProposal () retornos de vista pública (uint WinningProposal_) {
unidade WinningVoteCount = 0;
para (unidade p = 0; p < propostas.comprimento; p++) {
if (propostas [p] .VoteCount > WinningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
função winnerName () retorna a vista pública (memória de string WinnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Vamos explicar as novas adições:
Função de proposta vencedora: Esta função itera sobre todas as propostas e encontra aquela com a maior contagem de votos. Retorna o índice desta proposta na matriz de propostas
. É uma função de visualização
, o que significa que não modifica o estado do contrato e apenas lê os dados.
Função Nome do Vencedor: Esta função chama a função WinningProposta
para obter o índice da proposta vencedora e devolve o nome desta proposta.
Compile o seu contrato clicando no ícone do compilador Solidity na barra lateral esquerda e, em seguida, clicando no botão “Compilar”.
Implemente o seu contrato no separador “Implantar Transações de & Execução” e interaja com ele. Registe alguns eleitores, adicione algumas propostas, vote e, finalmente, verifique o vencedor.
Na próxima lição, discutiremos interações de contrato e registro de eventos. Vamos aprender como os contratos podem interagir uns com os outros e como registar e monitorizar atividades na blockchain. Parabéns por construir o seu primeiro sistema de votação descentralizado no Ethereum!