Lição 135: Votação Delegada e Governança
Nesta lição, vamos explorar o conceito de votação delegada e governança em contratos inteligentes no Ethereum usando Solidity. A votação delegada permite que os detentores de tokens deleguem seus direitos de voto a outros. Este mecanismo é fundamental em organizações autônomas descentralizadas (DAOs), onde as decisões de governança são tomadas por votantes que detêm tokens.
Compreendendo a Votação Delegada
A votação delegada é um sistema no qual um eleitor pode empoderar outra entidade a votar em seu nome. Isso é benéfico nos casos em que um detentor de token pode não ter tempo ou expertise para participar diretamente das decisões de governança, mas deseja que sua voz seja ouvida.
Conceitos Chave
- Poder de Voto: Refere-se à influência que um detentor de tokens tem no processo de votação, geralmente proporcional ao número de tokens possuídos.
- Delegado: Um usuário que é designado para votar em nome de outro.
- Delegante: O detentor original do token que concede seus direitos de voto a um delegado.
Implementando a Votação Delegada em Solidity
Vamos implementar um sistema simples de votação delegada em Solidity. Criaremos um contrato que permite aos usuários delegar seus direitos de voto, votar em propostas e contar os resultados.
Exemplo de Contrato Inteligente
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract VotacaoDelegada {
struct Proposta {
string nome;
uint contadorVotos;
}
mapping(address => address) public delegacoes;
mapping(address => uint) public votosRecebidos;
Proposta[] public propostas;
event Votado(address indexed eleitor, string proposta);
event Delegado(address indexed delegante, address indexed delegatário);
constructor(string[] memory nomesPropostas) {
for (uint i = 0; i < nomesPropostas.length; i++) {
propostas.push(Proposta({
nome: nomesPropostas[i],
contadorVotos: 0
}));
}
}
function delegar(address para) public {
require(para != msg.sender, "Não é possível delegar a si mesmo");
delegacoes[msg.sender] = para;
emit Delegado(msg.sender, para);
}
function votar(uint indiceProposta) public {
require(indiceProposta < propostas.length, "Índice de proposta inválido");
address delegatário = delegacoes[msg.sender];
if (delegatário != address(0)) {
votosRecebidos[delegatário]++;
emit Votado(delegatário, propostas[indiceProposta].nome);
} else {
votosRecebidos[msg.sender]++;
emit Votado(msg.sender, propostas[indiceProposta].nome);
}
propostas[indiceProposta].contadorVotos++;
}
function obterProposta(uint indiceProposta) public view returns (string memory nome, uint contadorVotos) {
Proposta memory proposta = propostas[indiceProposta];
return (proposta.nome, proposta.contadorVotos);
}
function obterVotosRecebidos(address eleitor) public view returns (uint) {
return votosRecebidos[eleitor];
}
}
Explicação do Código
- Struct Proposta: Define uma proposta com um nome e contador de votos.
- Mappings:
delegacoes
: Acompanha as delegações de eleitores para seus delegados.votosRecebidos
: Conta o total de votos recebidos por um endereço específico.
- Construtor: Inicializa o contrato com uma lista de nomes de propostas.
- função delegar: Permite que um usuário delegue seu poder de voto para outro endereço. Ela garante que um usuário não possa delegar seu poder de voto para si mesmo.
- função votar: Gerencia a lógica de votação. Verifica se o eleitor delegou seu voto, atualiza o contador correspondente de votos e emite um evento
Votado
. - função obterProposta: Retorna o nome e o contador de votos de uma proposta.
- função obterVotosRecebidos: Retorna o número de votos recebidos por um eleitor específico.
Como Usar o Contrato
- Implemente o contrato
VotacaoDelegada
com um array de nomes de propostas. - Os detentores de tokens podem usar a função
delegar
para delegar seus direitos de voto. - Os eleitores podem votar chamando a função
votar
com o índice da proposta que desejam apoiar. - Verifique os resultados usando a função
obterProposta
para visualizar os contadores de votos.
Conclusão
A votação delegada é um recurso poderoso para a governança em aplicações descentralizadas. Permite que os usuários participem dos processos de tomada de decisão, mesmo que não tenham tempo ou conhecimento para fazê-lo diretamente. A implementação que discutimos fornece uma base sólida para entender como a votação delegada funciona em Solidity. Você pode expandir esse conceito implementando recursos adicionais, como expiração de propostas, re-delegação e estratégias de votação mais complexas.
À medida que você continua sua jornada no desenvolvimento em Solidity, considere como você poderia aprimorar este modelo de governança para atender às necessidades de sua aplicação descentralizada. Boa codificação!