Pelajaran 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!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.
Katalog
Pelajaran 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!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.