第3课

Implementando a contagem de votos e o anúncio dos resultados

Nesta lição, implementaremos as partes finais do nosso sistema de votação descentralizado: contagem de 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.

Expandir o Contrato de Eleitor

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;
    }
}

Compreender o Código

Vamos explicar as novas adições:

  1. 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.

  2. 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.

Compilar e testar

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.

Como fazer isso:

  1. Implantação: Primeiro, clique no separador “Implantar Transações de & Execução” no IDE Remix. É o que está abaixo do ícone do compilador Solidity. Certifique-se de que está no ambiente “JavaScript VM”. Em seguida, clique no botão “Implantar”.
  2. Registo de Eleitores: Assim que o contrato for implementado, verá na secção “Contratos Implantados”. Clique na seta para expandi-lo. Encontrará todas as funções do nosso contrato listadas lá.
  3. Para registar eleitores, encontre a função RegisterVoter. Uma vez que programámos o nosso contrato para registar a conta que chama esta função como eleitor, pode trocar de conta no menu suspenso “Conta” no separador “Implantar Transações de & Execução”. Depois de selecionar uma conta, clique na função RegisterVoter. Repita este passo para cada conta que deseja registar-se como eleitor.
  4. Adicionar Propostas: Para adicionar propostas, encontre a função AddProposta. Introduza o nome da proposta na caixa de entrada ao lado da função e clique na função. Repita este passo para cada proposta que deseja adicionar.
  5. Votação: Para votar, mude para uma conta de eleitor e encontre a função de voto. Introduza o índice da proposta (a ordem em que a adicionou, a partir de 0) em que deseja votar na caixa de entrada ao lado da função e clique na função. Repita este passo para cada eleitor.
  6. Verificar o Vencedor: Depois de todos os eleitores terem votado, pode verificar o vencedor. Encontre a função WinnerName e clique nela. O nome da proposta vencedora será apresentado na consola na parte inferior do ecrã.
  7. Lembre-se, todas as ações na cadeia de blocos (incluindo as de teste no Remix) são transações. Pode expandir os detalhes da transação na consola para ver mais informações, como o custo da transação e os dados. É uma boa prática verificar esta informação para entender melhor como o seu contrato está a interagir com a cadeia de blocos.

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!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。
目录
第3课

Implementando a contagem de votos e o anúncio dos resultados

Nesta lição, implementaremos as partes finais do nosso sistema de votação descentralizado: contagem de 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.

Expandir o Contrato de Eleitor

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;
    }
}

Compreender o Código

Vamos explicar as novas adições:

  1. 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.

  2. 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.

Compilar e testar

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.

Como fazer isso:

  1. Implantação: Primeiro, clique no separador “Implantar Transações de & Execução” no IDE Remix. É o que está abaixo do ícone do compilador Solidity. Certifique-se de que está no ambiente “JavaScript VM”. Em seguida, clique no botão “Implantar”.
  2. Registo de Eleitores: Assim que o contrato for implementado, verá na secção “Contratos Implantados”. Clique na seta para expandi-lo. Encontrará todas as funções do nosso contrato listadas lá.
  3. Para registar eleitores, encontre a função RegisterVoter. Uma vez que programámos o nosso contrato para registar a conta que chama esta função como eleitor, pode trocar de conta no menu suspenso “Conta” no separador “Implantar Transações de & Execução”. Depois de selecionar uma conta, clique na função RegisterVoter. Repita este passo para cada conta que deseja registar-se como eleitor.
  4. Adicionar Propostas: Para adicionar propostas, encontre a função AddProposta. Introduza o nome da proposta na caixa de entrada ao lado da função e clique na função. Repita este passo para cada proposta que deseja adicionar.
  5. Votação: Para votar, mude para uma conta de eleitor e encontre a função de voto. Introduza o índice da proposta (a ordem em que a adicionou, a partir de 0) em que deseja votar na caixa de entrada ao lado da função e clique na função. Repita este passo para cada eleitor.
  6. Verificar o Vencedor: Depois de todos os eleitores terem votado, pode verificar o vencedor. Encontre a função WinnerName e clique nela. O nome da proposta vencedora será apresentado na consola na parte inferior do ecrã.
  7. Lembre-se, todas as ações na cadeia de blocos (incluindo as de teste no Remix) são transações. Pode expandir os detalhes da transação na consola para ver mais informações, como o custo da transação e os dados. É uma boa prática verificar esta informação para entender melhor como o seu contrato está a interagir com a cadeia de blocos.

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!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。