Bài học 3

Implementando contagem de votos e anúncio de resultados

Nesta lição, implementaremos as partes finais do nosso sistema de votação descentralizado: contagem dos votos e anúncio do resultado. Isso envolverá a expansão do nosso contrato de eleitor uma última vez e a criação de funções para calcular a proposta vencedora.

Expandindo o contrato eleitoral

Vamos começar adicionando a função winningProposal ao nosso contrato. Esta função irá iterar sobre todas as propostas e retornar aquela com mais votos. Além disso, criaremos uma função winnerName para retornar o nome da proposta vencedora. Aqui está a versão final do nosso contrato:

Solidez 
 // Identificador de licença SPDX: GPL-3.0 
 solidez pragma >=0.7.0 <0.9.0; 

 Eleitor de contrato { 
 struct Pessoa {
        bool voted;  
        uint vote;   
    }

    struct Proposta {
        string name;   
        uint voteCount; 
    }

    Proposta[] propostas públicas; 
 mapeamento(endereço => Pessoa) eleitores públicos; 

 funções RegisterVoter() public {
        voters[msg.sender].voted = false;
    }

    funções addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    funções vote(uint _proposal) public { 
     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ções winProposal() retornos de visualização pública (uint winProposal_) { 
 uint winVoteCount = 0; 
 para (uint p = 0; p < propostas.comprimento; p++) { 
 if (proposals[p].voteCount > winVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    função vencedorName() retornos de visualização pública (string memória vencedorName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Compreendendo o Código

Vamos explicar as novas adições:

  1. Função de proposta vencedora: esta função percorre todas as propostas e encontra aquela com a maior contagem de votos. Retorna o índice desta proposta no array proposals . É uma função view , o que significa que não modifica o estado do contrato e apenas lê os dados.

  2. Função Winner Name: Esta função chama a função winningProposal para obter o índice da proposta vencedora e então retorna o nome desta proposta.

Compilando e testando

Compile seu contrato clicando no ícone do compilador Solidity na barra lateral esquerda e depois clicando no botão “Compilar”.

Implante seu contrato na guia “Implantar e executar transações” e interaja com ele. Cadastre alguns eleitores, adicione algumas propostas, vote e, por fim, confira o vencedor.

Como fazer isso:

  1. Implantação: primeiro, clique na guia “Implantar e executar transações” no Remix IDE. É aquele abaixo do ícone do compilador Solidity. Certifique-se de estar no ambiente “JavaScript VM”. Em seguida, clique no botão “Implantar”.
  2. Cadastrando Eleitores: Assim que o contrato for implantado, você o verá na seção “Contratos Implantados”. Clique na seta para expandi-la. Você encontrará todas as funções do nosso contrato listadas lá.
  3. Para registrar eleitores, encontre a função RegisterVoter. Como programamos nosso contrato para registrar a conta que chama esta função como eleitor, você pode trocar de conta no menu suspenso “Conta” na guia “Implantar e executar transações”. Depois de selecionar uma conta, clique na função RegisterVoter. Repita esta etapa para cada conta que deseja registrar como eleitor.
  4. Adicionando Propostas: Para adicionar propostas, encontre a função addProposal. Insira o nome da proposta na caixa de entrada ao lado da função e clique na função. Repita esta etapa para cada proposta que deseja adicionar.
  5. Votação: Para votar, mude para uma conta de eleitor e encontre a função de votação. Insira o índice da proposta (a ordem em que você a adicionou, começando em 0) na qual deseja votar na caixa de entrada ao lado da função e clique na função. Repita esta etapa para cada eleitor.
  6. Verificando o vencedor: Depois que todos os eleitores votarem, você poderá verificar o vencedor. Encontre a função vencedorName e clique nela. O nome da proposta vencedora será exibido no console na parte inferior da tela.
  7. Lembre-se de que todas as ações no blockchain (incluindo as de teste no Remix) são transações. Você pode expandir os detalhes da transação no console para ver mais informações, como o custo da transação e os dados. É uma boa prática verificar essas informações para entender melhor como o seu contrato está interagindo com o blockchain.

Na próxima lição, discutiremos as interações contratuais e o registro de eventos. Aprenderemos como os contratos podem interagir entre si e como registrar e monitorar atividades no blockchain. Parabéns por construir seu primeiro sistema de votação descentralizado no Ethereum!

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
Danh mục
Bài học 3

Implementando contagem de votos e anúncio de resultados

Nesta lição, implementaremos as partes finais do nosso sistema de votação descentralizado: contagem dos votos e anúncio do resultado. Isso envolverá a expansão do nosso contrato de eleitor uma última vez e a criação de funções para calcular a proposta vencedora.

Expandindo o contrato eleitoral

Vamos começar adicionando a função winningProposal ao nosso contrato. Esta função irá iterar sobre todas as propostas e retornar aquela com mais votos. Além disso, criaremos uma função winnerName para retornar o nome da proposta vencedora. Aqui está a versão final do nosso contrato:

Solidez 
 // Identificador de licença SPDX: GPL-3.0 
 solidez pragma >=0.7.0 <0.9.0; 

 Eleitor de contrato { 
 struct Pessoa {
        bool voted;  
        uint vote;   
    }

    struct Proposta {
        string name;   
        uint voteCount; 
    }

    Proposta[] propostas públicas; 
 mapeamento(endereço => Pessoa) eleitores públicos; 

 funções RegisterVoter() public {
        voters[msg.sender].voted = false;
    }

    funções addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    funções vote(uint _proposal) public { 
     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ções winProposal() retornos de visualização pública (uint winProposal_) { 
 uint winVoteCount = 0; 
 para (uint p = 0; p < propostas.comprimento; p++) { 
 if (proposals[p].voteCount > winVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    função vencedorName() retornos de visualização pública (string memória vencedorName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Compreendendo o Código

Vamos explicar as novas adições:

  1. Função de proposta vencedora: esta função percorre todas as propostas e encontra aquela com a maior contagem de votos. Retorna o índice desta proposta no array proposals . É uma função view , o que significa que não modifica o estado do contrato e apenas lê os dados.

  2. Função Winner Name: Esta função chama a função winningProposal para obter o índice da proposta vencedora e então retorna o nome desta proposta.

Compilando e testando

Compile seu contrato clicando no ícone do compilador Solidity na barra lateral esquerda e depois clicando no botão “Compilar”.

Implante seu contrato na guia “Implantar e executar transações” e interaja com ele. Cadastre alguns eleitores, adicione algumas propostas, vote e, por fim, confira o vencedor.

Como fazer isso:

  1. Implantação: primeiro, clique na guia “Implantar e executar transações” no Remix IDE. É aquele abaixo do ícone do compilador Solidity. Certifique-se de estar no ambiente “JavaScript VM”. Em seguida, clique no botão “Implantar”.
  2. Cadastrando Eleitores: Assim que o contrato for implantado, você o verá na seção “Contratos Implantados”. Clique na seta para expandi-la. Você encontrará todas as funções do nosso contrato listadas lá.
  3. Para registrar eleitores, encontre a função RegisterVoter. Como programamos nosso contrato para registrar a conta que chama esta função como eleitor, você pode trocar de conta no menu suspenso “Conta” na guia “Implantar e executar transações”. Depois de selecionar uma conta, clique na função RegisterVoter. Repita esta etapa para cada conta que deseja registrar como eleitor.
  4. Adicionando Propostas: Para adicionar propostas, encontre a função addProposal. Insira o nome da proposta na caixa de entrada ao lado da função e clique na função. Repita esta etapa para cada proposta que deseja adicionar.
  5. Votação: Para votar, mude para uma conta de eleitor e encontre a função de votação. Insira o índice da proposta (a ordem em que você a adicionou, começando em 0) na qual deseja votar na caixa de entrada ao lado da função e clique na função. Repita esta etapa para cada eleitor.
  6. Verificando o vencedor: Depois que todos os eleitores votarem, você poderá verificar o vencedor. Encontre a função vencedorName e clique nela. O nome da proposta vencedora será exibido no console na parte inferior da tela.
  7. Lembre-se de que todas as ações no blockchain (incluindo as de teste no Remix) são transações. Você pode expandir os detalhes da transação no console para ver mais informações, como o custo da transação e os dados. É uma boa prática verificar essas informações para entender melhor como o seu contrato está interagindo com o blockchain.

Na próxima lição, discutiremos as interações contratuais e o registro de eventos. Aprenderemos como os contratos podem interagir entre si e como registrar e monitorar atividades no blockchain. Parabéns por construir seu primeiro sistema de votação descentralizado no Ethereum!

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.