WEB3DEV

Cover image for Construindo um Contrato Inteligente de Votação Descentralizada com QuickNode RPC
Isabela Curado Nehme
Isabela Curado Nehme

Posted on

Construindo um Contrato Inteligente de Votação Descentralizada com QuickNode RPC

https://miro.medium.com/v2/resize:fit:720/format:webp/1*W8SHIYUCrWOmYKcPQamEjw.png

Pré-requisitos;

  • O que é um contrato inteligente de votação descentralizada.
  • Principais características e componentes de um contrato inteligente de votação descentralizada.
  • Casos de uso de um contrato inteligente de votação descentralizada.
  • Escrevendo um contrato inteligente de votação descentralizada.
  • Implantação com QuickNode RPC.

O QUE É UM CONTRATO INTELIGENTE DE VOTAÇÃO DESCENTRALIZADA?

Um contrato inteligente de votação descentralizada é um acordo digital autoexecutável, escrito em uma linguagem de programação como Solidity (usada para contratos inteligentes Ethereum), que facilita o processo de condução de votação segura e transparente em uma plataforma blockchain. Funciona sem a necessidade de uma autoridade central, como um governo ou um terceiro de confiança, para supervisionar ou validar o processo de votação.

Por que precisamos disso?

Os sistemas de votação atuais, como votação em urnas ou votação eletrônica, sofrem com diversas ameaças à segurança, como ataques DoS (negação de serviço), captura de cabines de votação, alteração e manipulação de votos, ataques de malware, etc., e também exigem enormes quantidades de papelada, recursos humanos, e tempo. Isso cria um sentimento de desconfiança entre os sistemas existentes.

Algumas das desvantagens são:

  • Longas filas durante as eleições.
  • Falhas de segurança, como vazamentos de dados e adulteração de votos.
  • Muita papelada envolvida, portanto, menos ecológica e demorada.
  • Dificuldade para eleitores com deficiência chegarem à cabine de votação.
  • O custo das despesas eleitorais é elevado.

Solução:

Usando blockchain, o processo de votação pode se tornar mais seguro, transparente, imutável e confiável. Como? Vejamos um exemplo.

Suponhamos que você seja um eleitor elegível que vai à cabine de votação e vota usando a EVM (Eletronic Voting Machine ou máquina de votação eletrônica). Mas, como se trata de um circuito, e se alguém mexer no microchip, talvez você nunca saiba se o seu voto chegou à pessoa em quem você votou ou se foi desviado para a conta de outro candidato?

Isso é possível, uma vez que não há rastreamento do seu voto. Mas, se você usar a blockchain, ela armazena tudo como uma transação que será explicada logo abaixo; e, portanto, fornece um recibo do seu voto (na forma de um ID de transação), que você pode usar para garantir que seu voto foi contado de forma segura.

PRINCIPAIS CARACTERÍSTICAS E COMPONENTES DE UM CONTRATO INTELIGENTE DE VOTAÇÃO DESCENTRALIZADA

  1. Transparente e imutável: todas as transações e votos registrados na blockchain são transparentes e não podem ser alterados ou adulterados depois de registrados, garantindo a integridade do processo de votação.
  2. Sem autoridade central: o contrato inteligente automatiza o processo de votação, eliminando a necessidade de uma autoridade central para supervisionar ou administrar a eleição. Isso reduz o potencial de manipulação ou fraude.
  3. Autenticação do eleitor: o contrato inteligente pode implementar mecanismos para verificar a elegibilidade e autenticidade dos eleitores. Isso poderia envolver processos de registo e autenticação de eleitores.
  4. Votação anônima: as identidades dos eleitores não estão diretamente ligadas aos seus votos, preservando a privacidade do eleitor.
  5. Contagem de resultados: o contrato inteligente foi projetado para contabilizar os votos e determinar o resultado da eleição assim que o período de votação for concluído.
  6. Seguro e sem necessidade de confiança: a natureza descentralizada da blockchain garante que o processo de votação seja seguro e sem necessidade de confiança, o que significa que os participantes podem ter confiança na integridade do processo sem ter que confiar em uma única entidade.
  7. Opção de auditoria pública: como os detalhes de cada transação são armazenados na blockchain, as partes interessadas podem verificar de forma independente os resultados das eleições.

Os contratos inteligentes de votação descentralizada são particularmente úteis em cenários em que pode faltar confiança numa autoridade centralizada, ou em que a transparência, a segurança e a imutabilidade são requisitos cruciais, como na governança comunitária, na tomada de decisões corporativas ou nas eleições públicas.

Outras características importantes incluem:

  1. Bloqueio de tempo: o contrato pode impor restrições de tempo específicas para o processo de votação, incluindo horários de abertura e fechamento. Isso evita que os votos sejam emitidos fora do prazo designado.
  2. Apoio a múltiplos candidatos: o contrato pode apoiar eleições com múltiplos candidatos ou opções, permitindo aos eleitores escolher entre uma lista de candidatos ou propostas.
  3. Votação ponderada: alguns sistemas podem implementar a votação ponderada, onde certos participantes têm mais poder de voto com base em critérios predefinidos (por exemplo, participação, reputação, etc.).
  4. Requisitos de quórum: o contrato pode especificar um limite mínimo de participação exigido para que os resultados eleitorais sejam considerados válidos.
  5. Opção de votação por procuração: a votação por procuração permite que os participantes deleguem seus votos a indivíduos ou entidades de confiança, possibilitando um processo de votação mais flexível.
  6. Lista branca (whitelisting) de eleitores: o contrato pode manter uma lista de eleitores autorizados, garantindo que apenas os participantes elegíveis possam votar.
  7. Registo e autenticação eleitoral: o contrato pode incluir um processo de registo eleitoral para verificar a identidade e a elegibilidade dos participantes antes de lhes permitir votar.
  8. Comunicação segura: o contrato pode incorporar criptografia ou outras medidas de segurança para proteger a comunicação entre os eleitores e o contrato.
  9. Nova votação ou alteração de votos: dependendo do caso de uso, o contrato pode permitir que os eleitores alterem seus votos antes do término do período de votação.
  10. Resultados em tempo real: o contrato pode fornecer atualizações em tempo real sobre o processo de votação, permitindo que os participantes acompanhem o andamento da eleição.
  11. Trilha de auditoria: registros detalhados de todas as atividades de votação, incluindo marcas temporais, podem ser registrados na blockchain para fins de transparência e auditoria.
  12. Feedback e comentários do eleitor: os participantes podem ter a opção de fornecer comentários ou feedback junto com seus votos.
  13. Mecanismo de resolução de conflitos: em caso de conflitos ou contestações, o contrato pode incluir um mecanismo de resolução de conflitos, potencialmente envolvendo um árbitro.
  14. Finalidade dos resultados: terminado o período de votação, o contrato pode garantir que os resultados sejam imutáveis ​​e não podem ser alterados.
  15. Otimização do gás: o contrato pode ser concebido para minimizar os custos do gás para os participantes, garantindo simultaneamente segurança e eficiência.

CASOS DE USO DE UM CONTRATO INTELIGENTE DE VOTAÇÃO DESCENTRALIZADA

  1. Governança em organizações descentralizadas:

    • Organizações autônomas descentralizadas (DAOs) podem usar contratos inteligentes para processos de tomada de decisão, incluindo votação de propostas, alocações orçamentárias e atualizações de protocolo.
  2. Eleições em sistemas políticos:

    • Os governos e as organizações políticas podem utilizar a votação descentralizada para realizar eleições, garantindo transparência, segurança e resistência à adulteração.
  3. Governança corporativa:

    • Os acionistas de uma empresa podem usar contratos inteligentes para votar em questões críticas, como eleições para conselhos, fusões e decisões comerciais importantes.
  4. Propostas de detentores de token:

    • Projetos no espaço blockchain e criptomoeda podem implementar uma votação descentralizada para que os detentores de tokens participem de decisões de governança, tais como atualizações de protocolo ou atribuições de fundos.
  5. Governança comunitária em criptomoedas:

    • Os projetos de criptomoeda podem permitir que suas comunidades votem em propostas relacionadas ao desenvolvimento, marketing e outras iniciativas estratégicas.
  6. Governança de aplicativos descentralizados (DApps):

    • As plataformas DApp podem implementar votação descentralizada para permitir que os usuários influenciem as decisões sobre o desenvolvimento e a direção da plataforma.
  7. Instituições acadêmicas:

    • Universidades ou instituições educacionais podem usar a votação descentralizada para eleições do conselho estudantil, decisões do corpo docente ou mudanças curriculares.
  8. Organizações sem fins lucrativos:

    • As organizações sem fins lucrativos podem utilizar a votação descentralizada para os processos de tomada de decisão, permitindo que os membros tenham uma palavra a dizer em questões como a seleção de projetos, estratégias de angariação de fundos e prioridades organizacionais.
  9. Alocação de fundo comunitário:

    • Comunidades ou ecossistemas descentralizados podem atribuir fundos para iniciativas como subsídios, recompensas ou projetos de desenvolvimento comunitário com base nos votos dos membros.
  10. Financiamento de propostas em redes blockchain:

    • Redes blockchain como Polkadot, Ethereum ou Cardano usam votação descentralizada para decidir sobre propostas de financiamento, atualizações de protocolo e melhorias na rede.
  11. Alocação de recursos em finanças descentralizadas (DeFi):

    • Os protocolos DeFi podem usar votação descentralizada para determinar fatores como taxas de juros, tipos de garantia e alterações nos parâmetros do protocolo.
  12. Consórcios e parcerias:

    • As organizações membros em consórcios ou parcerias podem utilizar a votação descentralizada para a tomada de decisões relacionadas com iniciativas conjuntas, investimentos ou parcerias estratégicas.
  13. Iniciativas ambientais:

    • As organizações ambientais podem empregar votação descentralizada para decidir sobre projetos ou políticas relacionadas com esforços de conservação, energias renováveis ​​e práticas sustentáveis.
  14. Plataformas e comunidades de conteúdo:

    • Plataformas como redes de mídia social ou sites de compartilhamento de conteúdo podem implementar a votação descentralizada para que os usuários façam a curadoria de conteúdos, selecionem moderadores e influenciem as políticas da plataforma.
  15. Copropriedade imobiliária:

    • Os contratos inteligentes podem facilitar acordos de copropriedade de propriedades, permitindo que os coproprietários votem em decisões relativas à manutenção, contratos de arrendamento e gestão de propriedades.

ESCREVENDO UM CONTRATO INTELIGENTE DE VOTAÇÃO DESCENTRALIZADA

Ei, já chega de fundamentos, é hora de ir para a parte técnica!

Abaixo está um código de contrato inteligente de votação:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract DecentralizedVoting {

    struct Voter {
        bool isRegistered;
        bool hasVoted;
    }

    mapping(address => Voter) public voters;
    mapping(bytes32 => uint256) public voteCount;

    address public admin;
    bytes32 public topic;
    bool public votingActive;

    event VoterRegistered(address voter);
    event VoteCasted(address voter, bytes32 choice);
    event VotingEnded();

    modifier onlyAdmin() {
        require(msg.sender == admin, "Apenas o admin pode chamar essa função");
        _;
    }

    modifier onlyRegistered() {
        require(voters[msg.sender].isRegistered, "Eleitor não está registrado");
        _;
    }

    modifier onlyActive() {
        require(votingActive, "A votação não está ativa");
        _;
    }

    constructor(bytes32 _topic) {
        admin = msg.sender;
        topic = _topic;
        votingActive = true;
    }

    function registerVoter(address _voter) external onlyAdmin {
        require(!voters[_voter].isRegistered, "Eleitor já está registrado");
        voters[_voter].isRegistered = true;
        emit VoterRegistered(_voter);
    }

    function startVoting() external onlyAdmin {
        require(!votingActive, "A votação já está ativa");
        votingActive = true;
    }

    function endVoting() external onlyAdmin {
        require(votingActive, "A votação não está ativa");
        votingActive = false;
        emit VotingEnded();
    }

    function castVote(bytes32 _choice) external onlyRegistered onlyActive {
        require(!voters[msg.sender].hasVoted, "Eleitor já votou");
        voters[msg.sender].hasVoted = true;
        voteCount[_choice]++;
        emit VoteCasted(msg.sender, _choice);
    }

    function getResult(bytes32 _choice) external view returns (uint256) {
        require(!votingActive, "A votação ainda está ativa");
        return voteCount[_choice];
    }

    function getWinner() external view returns (bytes32) {
        require(!votingActive, "A votação ainda está ativa");
        bytes32 winner;
        uint256 maxVotes = 0;

        // Itera através das escolhas para encontrar a que tem mais votos
        for (uint256 i = 0; i < 256; i++) {
            bytes32 choice = bytes32(i);
            if (voteCount[choice] > maxVotes) {
                maxVotes = voteCount[choice];
                winner = choice;
            }
        }

        return winner;
    }
}
Enter fullscreen mode Exit fullscreen mode

Uma explicação detalhada do código abaixo:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract DecentralizedVoting {

Enter fullscreen mode Exit fullscreen mode
  • Este contrato começa com SPDX-License-Identifier para especificar a licença do código e o pragma da versão do compilador Solidity. Ele define um contrato inteligente Solidity chamado DecentralizedVoting.
struct Voter {
    bool isRegistered;
    bool hasVoted;
}

Enter fullscreen mode Exit fullscreen mode
  • Dentro do contrato, existe uma struct chamada Voter. Uma struct é como um tipo de dados personalizado que permite agrupar dados relacionados. Neste caso, é utilizada para representar informações sobre cada eleitor. Cada eleitor tem duas propriedades:
  • isRegistered: um booleano que indica se um eleitor está registrado.
  • hasVoted: outro booleano que indica se um eleitor já votou.
mapping(address => Voter) public voters;
mapping(bytes32 => uint256) public voteCount;

Enter fullscreen mode Exit fullscreen mode
  • São declarados dois mapeamentos. Os mapeamentos são pares de valores-chave que permitem armazenamento e recuperação eficiente de dados.
  • voters: mapeia endereços para structs Voter. É usado para acompanhar os eleitores registrados e seu status de voto.
  • voteCount: mapeia valores bytes32 (representando opções de votação) para uint256. É utilizado para armazenar a contagem dos votos recebidos para cada escolha.
address public admin;
bytes32 public topic;
bool public votingActive;

Enter fullscreen mode Exit fullscreen mode
  • Três variáveis ​​de estado são declaradas:
  • admin: este é um endereço Ethereum que representa o administrador ou organizador da votação.
  • topic: esta é uma variável bytes32 que representa o tópico da votação. É uma forma de rotular o motivo da votação.
  • votingActive: este é um booleano que indica se a votação está ativa no momento. Será definido como verdadeiro se o processo de votação estiver em andamento.
event VoterRegistered(address voter);
event VoteCasted(address voter, bytes32 choice);
event VotingEnded();

Enter fullscreen mode Exit fullscreen mode
  • Três eventos são definidos para registrar ações contratuais importantes:
  • VoterRegistered: este evento é emitido quando um eleitor é registrado com sucesso. Registra o endereço do eleitor registrado.
  • VoteCasted: este evento é emitido quando um eleitor vota. Registra o endereço do eleitor e a escolha que ele fez.
  • VotingEnded: este evento é emitido quando o processo de votação é finalizado pelo administrador. Sinaliza que a votação foi concluída.
modifier onlyAdmin() {
    require(msg.sender == admin, "Apenas o admin pode chamar essa função");
    _;
}
Enter fullscreen mode Exit fullscreen mode
  • Este é um modificador personalizado chamado onlyAdmin. Modificadores são usados ​​para modificar ou estender o comportamento das funções. O modificador onlyAdmin restringe o acesso a determinadas funções apenas ao administrador do contrato (admin). Se o remetente da transação não for o administrador, a função será revertida com a mensagem de erro fornecida.
modifier onlyRegistered() {
    require(voters[msg.sender].isRegistered, "Eleitor não está registrado");
    _;
}
Enter fullscreen mode Exit fullscreen mode
  • Outro modificador personalizado onlyRegistered é definido. Este modificador garante que apenas eleitores registrados possam acessar determinadas funções. Caso o remetente não seja eleitor cadastrado, a função será revertida com mensagem de erro.
modifier onlyActive() {
    require(votingActive, "A votação já está ativa");
    _;
}

Enter fullscreen mode Exit fullscreen mode
  • O modificador onlyActive restringe o acesso às funções para garantir que a votação esteja ativa no momento. Se a votação não estiver ativa, a função será revertida com uma mensagem de erro.
constructor(bytes32 _topic) {
    admin = msg.sender;
    topic = _topic;
    votingActive = true;
}

Enter fullscreen mode Exit fullscreen mode
  • O construtor é uma função especial executada apenas uma vez quando o contrato é implantado. Neste caso, é necessário um parâmetro bytes32 _topic. O construtor inicializa o contrato quando ele é implantado. Ele define o admin para o remetente (o implementador do contrato), define o topic para a votação e define o estado inicial de votingActive como verdadeiro, indicando que a votação está ativa na implantação.

Vamos escrever este código em nosso IDE REMIX.

https://miro.medium.com/v2/resize:fit:720/format:webp/1*ZmEcNX7ZgiQHm31DbBo6iQ.png

https://miro.medium.com/v2/resize:fit:720/format:webp/1*SR-EDoMPm0EQ6CO7mGlURQ.png

https://miro.medium.com/v2/resize:fit:720/format:webp/1*ndAOMorPNI7Kbxp2OIIfBQ.png

https://miro.medium.com/v2/resize:fit:720/format:webp/1*AfpMlDoiHPCBeKUCOIgYQw.png

IMPLANTAÇÃO COM QUICKNODE RPC

PASSO 1.

Crie um novo nó Sepolia no QuickNode. Você teria que navegar até o painel do QuickNode e clicar em “Create” (criar).

https://miro.medium.com/v2/resize:fit:720/format:webp/0*s-SmS2PLggk1kaIO.png

Depois, certifique-se de clicar na cadeia Ethereum. Confira uma captura de tela abaixo:

https://miro.medium.com/v2/resize:fit:720/format:webp/0*ax5sqe0lSZNivwTX.png

Clique em Sepolia:

https://miro.medium.com/v2/resize:fit:720/format:webp/0*HI46PBQS91Dp-jlE.png

Em seguida, clique em “Continue” (continuar) para prosseguir. Por fim, clique em “Create Endpoint” (criar ponto de extremidade) para obter seu URL da Sepolia.

https://miro.medium.com/v2/resize:fit:720/format:webp/0*ijDw8FN_phBoNJCp.png

PASSO 2.

Clique em “Add Network” (adicionar rede). Siga as instruções sobre como adicionar o URL RPC ao navegador da sua carteira.

https://miro.medium.com/v2/resize:fit:720/format:webp/0*BtHqLqKvbAAqQDss.png

Clique em “Add network manually” (adicionar rede manualmente).

https://miro.medium.com/v2/resize:fit:720/format:webp/0*vGLXzvM6AmwcNlp7.png

PASSO 3.

Insira um nome (qualquer), já que você está usando o QuickNode, pode usar "QKN" para copiar/colar seu ponto de extremidade Web3 (certifique-se de incluir “/” no final!), insira o ChainID e clique em “Save” (salvar).

Estamos usando a rede de testes Sepolia, então é aconselhável usar o ID da cadeia Sepolia, que é “11155111”.

https://miro.medium.com/v2/resize:fit:720/format:webp/0*tAtfGtdyKI4YFcTH.png

Finalmente, você obterá o resultado abaixo.

https://miro.medium.com/v2/resize:fit:720/format:webp/0*vQwPJ3dXyVIlNpG3.png

Perfeito! Estamos quase terminando, agora vamos solicitar um pouco de Eth da rede de testes Sepolia para podermos implantar nosso contrato inteligente.

PASSO 4.

Agora, para obter taxas de gás, usaremos https://faucet.quicknode.com/drip. Abaixo está o procedimento.

https://miro.medium.com/v2/resize:fit:720/format:webp/0*FW-a28V3g3q658J2.png

Em seguida, conecte a carteira e obtenha um pouco de Eth.

Depois de fazer isso, você obterá o resultado abaixo:

https://miro.medium.com/v2/resize:fit:720/format:webp/0*3YWxMmQ6t-ujxTGr.png

Com isso, estamos prontos para implantar nosso contrato inteligente de mercado NFT.

Implantando código de contrato inteligente na rede de testes Sepolia.

https://miro.medium.com/v2/resize:fit:720/format:webp/1*jd9vQWl74GIEN6f9UqDMIw.png

Clique em “Confirm” (confirmar) para finalizar as transações.

Conclusão

Parabéns por criar com sucesso seu próprio contrato Voting Smart na rede Ethereum!

Assine o boletim informativo do QuickNode para mais artigos e guias sobre a Ethereum. Se você tiver algum comentário, sinta-se à vontade para entrar em contato conosco via Twitter. Você sempre pode conversar conosco em nosso servidor da comunidade Discord, apresentando alguns dos desenvolvedores mais legais que você já conheceu :)

Este artigo foi escrito por Playboi.eth e traduzido por Isabela Curado Nehme. Seu original pode ser lido aqui.

Top comments (0)