WEB3DEV

Cover image for Uma Olhada Na Votação Via Contrato Inteligente Com Compound
Banana Labs
Banana Labs

Posted on

Uma Olhada Na Votação Via Contrato Inteligente Com Compound

Imagem de capa

A governança tornou-se cada vez mais importante na definição e execução de como um protocolo toma decisões críticas de maneira equitativa, com o objetivo de permitir a participação em modificações no nível do protocolo que afetam o futuro de um protocolo para todos os participantes. Blockchain, web3 e contratos inteligentes estão colocando o poder de volta nas mãos das pessoas com exemplos como Compound.

Neste blog, exploramos a votação de governança no nível de contrato inteligente. Também é importante observar que ao Anchorage Digital torna a votação de governança segura e simples. Leia abaixo para saber mais sobre exploração na camada de contrato inteligente.

Por que blockchains e web3 favorecem a governança

A tecnologia Blockchain está construindo a base para a próxima forma da Internet, tornando-se popularmente conhecida como “web3”. Neste mundo web3, valor e uso estão interligados por meio de uma série de transações entre carteiras blockchain e contratos inteligentes. Este mundo web3 permite que a participação, antes centralizada para um pequeno grupo de indivíduos ou entidades, agora seja acessível a um público mais amplo. Uma dessas formas de participação é a governança, ou seja, o poder de tomar decisões em um projeto. Neste mundo, os projetos podem assumir várias formas, como uma DAO, um protocolo blockchain, um aplicativo descentralizado ou qualquer empreendimento que exija orquestração e incentivo, como uma instituição de caridade.

Anchorage Digital

“A governança descentralizada on-chain é imperativa para o sucesso dos protocolos abertos. O sistema de votação de contrato Governor e token COMP foi inicialmente projetado para que possa ser construído externamente por desenvolvedores para criar experiências de usuário agradáveis. Os custodiantes de criptomoedas como a Anchorage Digital podem permitir que seus clientes participem da governança sem problemas, minimizando o risco inerentemente envolvido ao interagir com blockchains”.

— Adam Bavosa, líder de relações com desenvolvedores, Compound Labs

Esta postagem vai explorar a governança descentralizada, começando com uma visão geral do tópico e seguida por uma análise mais profunda dos contratos inteligentes no Compound. O Compound, como um dos primeiros projetos a fazer a transição total das decisões de protocolo para um sistema de governança da comunidade, apresenta um modelo claro para entender as transações de governança e como elas funcionam.

Entendendo a governança

Todo novo protocolo precisa determinar como alocar seus recursos e como tomará decisões para evoluir. Muitos desses projetos usam contratos inteligentes para automatizar decisões, e a forma como essas decisões são formuladas é conhecida como “governança”.

O uso de contratos inteligentes e votação de uma comunidade é conhecido como “governança tokenizada” e cresceu em popularidade na forma de “DAOs” (organizações autônomas descentralizadas). As DAOs podem automatizar e distribuir a tomada de decisões em qualquer nível organizacional, com casos de uso tão amplos quanto administrar uma empresa para arrecadar fundos de caridade. Na criptografia, eles são mais comumente usados para governar as decisões em nível de blockchain.

A governança tokenizada permite que qualquer detentor de tolken participe de decisões que afetam as prioridades e desenvolvimentos técnicos em uma blockchain. Alguns protocolos permitem que os participantes detentores de tokens simplesmente votem “Sim” e “Não” em suas propostas, calculando o peso relativo desse voto em relação ao número de tokens detidos pelo participante.

Outros protocolos construíram paradigmas de votação mais complexos. Um exemplo é a votação quadrática, onde cada voto adicional em uma opção de proposta custa cada vez mais ao participante. Isso foi implementado fazendo com que o protocolo distribua créditos de votação aos detentores de tokens, onde votar em uma proposta com um crédito custa ao participante um token, votar com dois créditos custa quatro tokens, três créditos custa nove tokens e assim por diante. Este paradigma é útil para protocolos e projetos preocupados com um pequeno número de investidores ativos adquirindo uma voz descomunal nas decisões. Há pesquisas em andamento sobre melhorias adicionais nos paradigmas de votação que permitirão que os protocolos identifiquem melhor os participantes, principalmente aqueles que fazem propostas, para evitar conluio entre os participantes e reduzir ainda mais a ameaça de ataques sybil, nos quais o invasor pode aumentar a influência por ter muitas identidades.

Independentemente do paradigma de votação, o poder de votar reside na posse de tokens, ou seja, ter uma participação nesse projeto, então todo o sistema se resume a uma transação entre uma carteira blockchain (um par de chaves pública/privada) segurando esses tokens e um smart contrato que codifica as regras do voto.

Para explorar a interação entre uma carteira e o contrato inteligente, exploraremos a governança no Compound, que é governada pelos detentores do token COMP.

O processo de votação no Compound inclui:

  1. Delegar poder de voto
  2. Criar uma proposta
  3. Votação de uma proposta

Delegar poder de voto

Para votar, um detentor de COMP deve delegar seu COMP para seu próprio endereço Ethereum ou para outro endereço Ethereum. Isso é ativado diretamente por meio do contrato inteligente COMP.

mapping (address => address) public delegates;
mapping (address => uint96) internal balances;

function delegate(address delegatee) public {
return _delegate(msg.sender, delegatee);
}
function _delegate(address delegator, address delegatee) internal {
     address currentDelegate = delegates[delegator];
     uint96 delegatorBalance = balances[delegator];
     delegates[delegator] = delegatee;
     emit DelegateChanged(delegator, currentDelegate, delegatee);
     _moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
Enter fullscreen mode Exit fullscreen mode

Aqui, o Compound permite a delegação de poder de votação entre carteiras, exibindo duas informações que essa transação (delegate/_delegate) precisa: o endereço da blockchain de destino para delegar (delegatee) e o endereço de origem para delegar (delegator).

O contrato inteligente usa um mapeamento interno usando o endereço do delegator como a chave para rastrear o endereço ao qual foi delegado pela última vez. O contrato também usa meios semelhantes para rastrear o saldo do delegator e, portanto, o poder de voto. Com esses mapeamentos estabelecidos, o contrato define o valor do novo delegatee e então notifica a rede que este é o delegator que está fazendo a mudança, transmite o delegatee anterior e confirma o novo delegatee.

Em seguida, o contrato inteligente move o poder de votação do delegatee anterior para o novo (_moveDelegates).

Poder de voto

Um paradigma interessante que o COMP e outros projetos de token estabeleceram é definir o poder de votação usando o conceito de “pontos de verificação”, por ex. um objeto que reflete o número de tokens que foram delegados a um determinado endereço de blockchain em um determinado número de bloco. Os pontos de verificação garantem que um determinado endereço de carteira só possa votar com o COMP delegado a esse endereço naquele bloco. Quando uma proposta é aberta para votação, isso evita situações em que um titular pode acumular uma grande quantidade de COMP para de repente poder influenciar injustamente a votação.

Com isso em mente, podemos pensar em poder de voto como a quantidade de COMP delegada a um determinado endereço de carteira no momento em que a proposta é apresentada.

Abaixo, o código exibe a alteração no delegatee:

/// @notice O número de pontos de verificação para cada conta
mapping (address => uint32) public numCheckpoints;
/// @notice Um registro de pontos de verificação de votos para cada conta, por índice
mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
/// @notice Um ponto de verificação para marcar o número de votos de um determinado bloco
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }
function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
 if (srcRep != dstRep && amount > 0) {
  if (srcRep != address(0)) {
   uint32 srcRepNum = numCheckpoints[srcRep];
   uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes 
    : 0;
   uint96 srcRepNew = sub96(srcRepOld, amount, "Comp::_moveVotes: vote amount u
    nderflows");
   _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
  }
if (dstRep != address(0)) {
   uint32 dstRepNum = numCheckpoints[dstRep];
   uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes 
     : 0;
      uint96 dstRepNew = add96(dstRepOld, amount, "Comp::_moveVotes: vote amount 
     overflows");
       _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Quando um endereço move as seleções do delegado (_moveDelegates), ele requer o delegatee atual (srcRep), o novo endereço do delegatee (dstRep e o valor que será delegado ao delegatee (este é o saldo COMP da carteira)(amount).

Antes da mudança, o contrato inteligente realiza a verificação para verificar se o delegatee atual e o novo delegateede não são o mesmo endereço, se o valor a ser delegado é maior que zero e se os endereços do delegatee atual ou do novo delegatee são endereços válidos ou inválidos (burn).

Quando o poder de votação é movido, um novo ponto de verificação é criado para o delegatee atual e para o novo delegatee. Estes são então indexados para visualizar todas as delegações em que o endereço esteve envolvido.

Por exemplo:

  1. Ação: Alice delega 20 COMP para Bob
    1. Resultado: no ponto de verificação B.1, Bob tem 20 COMP
  2. Ação: Rick delega 40 COMP para Bob
    1. Resultado: no ponto de verificação B.2, Bob tem 60 COMP
  3. Ação: Alice redelega seus 20 COMP de Bob para Rick
    1. Resultado: no ponto de verificação B.3, Bob tem 40 COMP
    2. No ponto de verificação R.1, Rick tem 20 COMP

Usando o índice do ponto de verificação, o contrato inteligente procura a quantidade anterior de COMP delegada a esse endereço e adiciona o novo COMP a ele e, em seguida, grava um novo ponto de verificação (_writeCheckpoint) para atualizar o poder de votação desse endereço.

function _writeCheckpoint(address delegatee, uint32 nCheckpoints,     uint96 oldVotes, 
          uint96 newVotes) internal {
  uint32 blockNumber = safe32(block.number, "Comp::_writeCheckpoint: block number exceeds 32 bits");
     if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == bl
               ockNumber) {
          checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
     } else {
          checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
          numCheckpoints[delegatee] = nCheckpoints + 1;
      }
      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }
Enter fullscreen mode Exit fullscreen mode

Para fazer isso, as informações necessárias são 1) endereço do delegatário (delegatee), 2) o índice para consultar o ponto de verificação desse endereço (nCheckpoints), 3) o poder de votação anterior do endereço (oldVotes) e 4) novo poder de voto do endereço (newVotes). O contrato pega o bloco atual na cadeia e adiciona um novo ponto de verificação usando aquele bloco e o novo poder de votação do endereço.

O resultado: o poder de votação concedido aos seus tokens COMP agora será concedido ao usuário COMP de sua escolha (sua própria conta ou conta de outra pessoa).

Observe que em nenhum lugar durante esta transação COMP realmente deixou um endereço. Na verdade, uma função de transferência nunca foi chamada. É aqui que vemos o potencial multifacetado realmente interessante dos tokens como armazenadores de valor: valor monetário, valor de governança, etc.

Votação de uma proposta

Agora que o poder de voto foi delegado ao endereço apropriado, podemos voltar nossa atenção para o próximo passo na estrutura de governança do COMP que é votar em uma proposta. Vamos dar uma olhada no contrato inteligente de governança COMP para entender mais profundamente.

Para apoiar uma proposta, alguns contratos inteligentes de governança têm funções inerentes:

mapping (uint => Proposal) public proposals;
struct Proposal {
        uint id;
        address proposer;
        uint eta;
        address[] targets;
        uint[] values;
        string[] signatures;
        bytes[] calldatas;
        uint startBlock;
        uint endBlock;
        uint forVotes;
        uint againstVotes;
        bool canceled;
        bool executed;
        mapping (address => Receipt) receipts;
    }
struct Receipt {
        bool hasVoted;
        bool support;
        uint96 votes;
    }
function castVote(uint proposalId, bool support) public {
        return _castVote(msg.sender, proposalId, support);
    }
function _castVote(address voter, uint proposalId, bool support) internal {
    require(state(proposalId) == ProposalState.Active, "GovernorAlpha::_castVote: voting is closed");
    Proposal storage proposal = proposals[proposalId];
    Receipt storage receipt = proposal.receipts[voter];
    require(receipt.hasVoted == false, "GovernorAlpha::_castVote: voter already voted");
    uint96 votes = comp.getPriorVotes(voter, proposal.startBlock);
if (support) {
        proposal.forVotes = add256(proposal.forVotes, votes);
    } else {
        proposal.againstVotes = add256(proposal.againstVotes, votes);
    }
receipt.hasVoted = true;
    receipt.support = support;
    receipt.votes = votes;
emit VoteCast(voter, proposalId, support, votes);
}
Enter fullscreen mode Exit fullscreen mode

Para votar em uma proposta no Compound via contrato inteligente, o titular da carteira precisa fornecer o endereço de votação (ou seja, o eleitor), a identificação (id) da proposta e o próprio voto “Sim” ou “Não”. Quando a votação é lançada, o contrato inteligente realiza algumas verificações. Ele verifica se a proposta ainda está ativa e se o endereço da carteira ainda não votou nessa proposta. Além disso, o contrato também verifica os recibos existentes para a proposta usando o endereço do eleitor como um índice para garantir que o eleitor ainda não votou nessa proposta.

Depois disso, o contrato inteligente de governança interage com o contrato inteligente de token para aplicar o poder de voto do eleitor no momento da proposta, ponderando essencialmente o quanto esse voto influenciará a decisão de quantos tokens o endereço da carteira contém. Em seguida, referencia as propostas e, dependendo da votação, atualiza os resultados: se o voto foi a favor, os votos do eleitor são adicionados aos votos existentes, ou se o voto foi contra a proposta, os votos são adicionados aos votos contra existentes.

Por fim, o contrato atualiza o recibo para codificar 1) que este endereço emitiu um voto, 2) o voto e 3) o número de votos emitidos, e um novo evento é emitido incluindo as informações pertinentes a esse voto.

O papel fundamental das carteiras

Uma carteira contém as chaves privadas associadas aos seus endereços de blockchain e assina transações, permitindo que você interaja no mundo web3 em rápido crescimento. A participação em novos modelos de governança é uma série de transações de blockchain que determinam a elegibilidade para votar, delegar poder de voto, criar novas propostas e, finalmente, ter voz na direção das decisões em nível de protocolo.

A governança é apenas uma forma de interação, mas existem outras que existem hoje como staking e vesting e muitas outras mais à frente. À medida que a web3 continua a evoluir, a compra de propriedades do mundo real e outras formas de comércio cotidiano provavelmente se tornarão parte de nossas interações no nível da blockchain.

O Anchorage Digital torna mais seguro e fácil interagir com contratos inteligentes, enquanto os ativos permanecem seguros na Anchorage Digital Custody. Apoiamos a participação na blockchain diretamente de nossa plataforma, bem como integrações para que você possa fazer transações com segurança neste novo mundo da web3.

Participação da governança via Anchorage Digital

Para instituições que desejam participar da governança, ao Anchorage Digital facilita uma maneira segura de se envolver em importantes decisões de protocolo. Atualmente, oferecemos suporte de governança para Aave, Celo, Compound, dYdX, Maker, Notional e Uniswap. Se você estiver interessado em participar da governança da Anchorage Digital, entre em contato conosco pelo e-mail [email protected].
Este post é destinado apenas para fins informativos. Não deve ser interpretado como e não constitui uma oferta de venda ou uma solicitação de oferta de compra de quaisquer valores mobiliários da Anchor Labs, Inc., ou de qualquer uma de suas subsidiárias, e não deve ser considerado para tomar decisões de investimento. Além disso, nada neste anúncio tem a intenção de fornecer consultoria fiscal, legal ou de investimento e seu conteúdo não deve ser interpretado como uma recomendação para comprar, vender ou manter qualquer valor mobiliário ou ativo digital ou para se envolver em qualquer transação nele.


Esse artigo é uma tradução feita por @bananlabs. Você pode encontrar o artigo original aqui

Latest comments (0)