第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讚同其觀點或證實其描述。
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.