WEB3DEV

Cover image for Construa sua primeira DAO e implante-a na rede moonbeam PARTE 1 : Configure e divirta-se
Fatima Lima
Fatima Lima

Posted on

Construa sua primeira DAO e implante-a na rede moonbeam PARTE 1 : Configure e divirta-se

A sigla DAO significa Organização Autônoma Descentralizada. Em geral, uma DAO é um sistema de regras codificadas que definem quais ações uma organização descentralizada realizará.

Esta frase é minha explicação curta favorita de DAO. Eu a peguei emprestada da academia Binance. Você pode consultar mais detalhes aqui .

DAO não é um novo conceito. Foi introduzida a todos desde a primeira era do Defi e é tratada como uma espinha dorsal de muitas organizações DEFI, que permite aos clientes se envolverem e definirem a direção com o time central, por um sistema de votação. É totalmente descentralizada e transparente.

Vamos construir !!

Falar é fácil. É hora de agir. A melhor maneira de entender o que é realmente DAO, é construí-la. Vamos construí-la!

Primeiro, presumimos que você tenha algum conhecimento sobre o desenvolvimento em Solidity. Caso não esteja familiarizado com ele, consulte este link primeiro.

Os melhores recursos para aprender Solidity · useWeb3.xyz
Os contratos inteligentes são a espinha dorsal dos aplicativos descentralizados (DApps) e da Web3. Um contrato inteligente é um programa simples…

Aprenda com o contrato existente

A melhor maneira de aprender a construir um contrato inteligente é simplesmente aprender com os contratos inteligentes existentes e famosos. Como você já sabe, o contrato inteligente é aberto para que todos possam verificar o código e aprender com ele. Portanto, neste tutorial, eu selecionei este repositório como nossa referência. Este projeto é baseado no scaffold-eth, que é o boilerplate da web3 e o melhor recurso para iniciar algum aplicativo web3. Este boilerplate incluiu todo o fluxo de desenvolvimento com comentários excelentes em cada linha, para ajudá-lo a entender mais detalhadamente. Para mais detalhes sobre o boilerplate, por favor, verifique aqui.

Projete as funcionalidades

Antes de mergulharmos fundo na codificação do contrato inteligente, temos que projetar as funcionalidades. Então, quais são as funcionalidades que uma DAO específica precisa.

Adicione e exclua membros

Sim, esta é uma funcionalidade muito básica que toda DAO deve ter. Uma DAO tem que ser capaz de adicionar um novo membro e excluir algum membro.

Crie alguma proposta e revogue

A proposta também é a principal funcionalidade aqui, todos devem ser capazes de enviar alguma proposta com detalhes e o emissor da proposta não precisa ser membro da DAO para propor algo.

O membro da DAO pode votar a proposta

Esta também deveria ser uma funcionalidade principal, que o membro da DAO possa votar ou rejeitar a proposta criada por todos, mas que somente o membro da DAO possa votar para aceitar ou rejeitar a proposta.

Crie Proposta para adicionar ou excluir algum membro

A gestão dos membros também é importante. A DAO é descentralizada por projeto e portanto não deve ter alguém que tenha autoridade sobre os outros. Cada decisão da organização é tomada por votação e portanto o mesmo se aplica a esta funcionalidade. A DAO deve ser capaz de criar um elemento para adicionar ou remover algum membro e permitir que outros membros votem para executar.

Pagamento e retirada

Após a proposta ter sido aceita pelos membros da DAO, o emissor poderá fazer a transação de retirada para um endereço específico do emissor e, para transparência, o membro da DAO deve ser capaz de verificar todo o histórico de pagamento a fim de gerenciar financeiramente a organização.

Iniciando !!

Em primeiro lugar, clonamos o repositório e verificamos primeiro a estrutura do projeto.

git clone https://github.com/scaffold-eth/scaffold-eth-examples/tree/simple-DAO-proposals simpleDAO
Enter fullscreen mode Exit fullscreen mode

Uma vez terminado, execute cd simpleDAO e você deverá ver a estrutura do projeto desta maneira

packages
    - hardhat
    - react-app
    - services
    - subgraph
...others config files
Enter fullscreen mode Exit fullscreen mode

Este boilerplate usa monorepo para gerenciar todas as versões de dependências. Vamos verificar o pacote um a um.

Hardhat

Este pacote incluiu todo o código de contrato inteligente e também a configuração de desenvolvimento do contrato inteligente. Nós usamos o hardhat, um framework de desenvolvimento web3, para nos ajudar a preparar o ambiente de desenvolvimento para o aplicativo. O Hardhat pode fornecer-lhe um simulador de nó de blockchain, compilador do Solidity e script de implantação.

react-app (aplicativo react)

Esta é a parte do frontend. É um aplicativo React que já tem funcionalidade de conexão web3, pois não vamos nos concentrar muito no desenvolvimento do frontend neste tutorial. Nós apenas nos concentraremos na parte da conexão web3 no frontend. Se você não estiver muito familiarizado com o React, não se preocupe.

services

Todos os arquivos de configuração e scripts do Docker para criar serviços web3, nó do The Graph, Arbitrum, etc. Nós não usamos nenhum serviço aqui neste tutorial.

Subgraph

Todas as configurações relacionadas ao Subgraph. O Subgraph pode ajudá-lo a armazenar dados específicos da blockchain para uso geral em seu aplicativo. De qualquer forma, nós não usamos nada do Subgraph neste tutorial.

Configuração do ambiente de desenvolvimento

Como já falamos, o Hardhat pode nos ajudar a configurar o ambiente de desenvolvimento na máquina. Então vamos tentar. Primeiro, instale todos os repositórios.

yarn install
Enter fullscreen mode Exit fullscreen mode

Em seguida, tente executar o nó da blockchain em seu local.

yarn chain
Enter fullscreen mode Exit fullscreen mode

O boilerplate já preparou a configuração e o script do hardhat para você. Ao executar este comando, ele iniciará o nó ETH em sua máquina local.

yarn run v1.22.10
$ yarn workspace @scaffold-eth/hardhat chain
$ hardhat node --network hardhat --no-deploy
Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/

eth_blockNumber (3)
Enter fullscreen mode Exit fullscreen mode

Você notará que há alguma atividade aqui. Ela continua imprimindo algum registro no terminal. É o processo de mineração que o Hardhat utiliza para simular a mineração de blocos em uma blockchain. Ele irá gerar o novo bloco em torno de 3-4 seg/bloco (baseado na configuração do boilerplate), quando o novo bloco gerado irá imprimir eth_blockNumber (X) (X = número do bloco).

No próximo passo, vamos tentar implantar o contrato inteligente e verificar como funciona a implantação do Hardhat. Portanto, basta executar este comando

yarn deploy
Enter fullscreen mode Exit fullscreen mode

Este comando também deve ser preparado pelo boilerplate. Depois de executado, você deve ver o log (registro) de resultados assim.

$ yarn workspace @scaffold-eth/hardhat deploy
$ hardhat deploy --export-all ../react-app/src/contracts/hardhat_contracts.json
Nothing to compile
deploying "PowDAO" (tx: 0xa3065dc6a9f19da468e99c3ecc58d42ae16299a152bb9eb52929fcadc7340be7)...: deployed at 0x5FbDB2315678afecb367f032d93F642f64180aa3 with 2068758 gas
$ hardhat run scripts/publish.js
✅  Published contracts to the subgraph package.(Contratos publicados para o pacote subgraph)
✨  Done in 3.90s. (Realizado em 3,9s)
Enter fullscreen mode Exit fullscreen mode

Ele imprime o endereço de seu contrato inteligente e também a transação de implantação e o gás consumido, para ajudá-lo a avaliar o gás de implantação utilizado.

Vamos mergulhar um pouco fundo em como o processo de implantação funciona.

Vamos verificar o arquivo package.json,

"scripts": {
    ...
   "chain": "hardhat node --network hardhat --no-deploy",
   "deploy": "hardhat deploy --export-all ../react-app/src/contracts/hardhat_contracts.json",
    ...
}
Enter fullscreen mode Exit fullscreen mode

Yarn deploy é apenas um apelido para hardhat deploy. Este processo irá implantar um contrato inteligente com atributos que definem packages/hardhat/deploy/00_deploy_your_contract.jse exportam como resultado na abi json o contrato para o pacote frontend do react-app (aplicativo react).

Então nosso frontend pode chamar a abi diretamente a partir deste arquivo gerado

// packages/hardhat/deploy/00_deploy_your_contract.js

module.exports = async ({ getNamedAccounts, deployments }) => {
 const { deploy } = deployments;
 const { deployer } = await getNamedAccounts();
 const members = [
   "<member-address>",
   "<member2-address>",
 ]; // carteira temporária do navegador e endereços powvt.eth.
 PowDAO = await deploy("PowDAO", {
   // Aprenda mais sobre args aqui: https://www.npmjs.com/package/hardhat-deploy#deploymentsdeploy
   from: deployer,
   args: [members],
   log: true,
 });
};
module.exports.tags = ["<your-contract-name>"];
Enter fullscreen mode Exit fullscreen mode

Esta função será chamada pelo mecanismo de implantação do hardhat, que envia a variável deployments no argumento. Assim, podemos usar a função deploy para implantar o contrato inteligente com um parâmetro inicial que será o parâmetro do contratante do contrato inteligente (mais detalhes serão fornecidos posteriormente). Esse parâmetro inicial do contrato inteligente é um array do endereço inicial. Esse endereço será o primeiro membro da DAO, que tem autoridade para convidar outros membros para a DAO pelo mecanismo de votação.

Depois que seu primeiro contrato for implantado, estamos prontos para experimentar algo no Frontend. Vamos executar o frontend

yarn start
Enter fullscreen mode Exit fullscreen mode

Após um minuto, o aplicativo react será exibido automaticamente e então você poderá ver o template UI (interface do usuário) do boilerplate.

Image description

Vamos nos divertir

Vamos brincar com o boilerplate para entender melhor a funcionalidade DAO. Antes de tentar qualquer recurso, certifique-se de selecionar o mesmo endereço que você forneceu no arquivo de implantação acima. Caso contrário, você não poderá usar nenhum recurso aqui.

Image description

Você pode simplesmente verificar seu status de membro na DAO colando seu endereço aqui. Se você for membro da DAO o resultado aparecerá desta forma.

Vamos tentar outra funcionalidade, o primeiro recurso que sua DAO deve ter é adicionar/remover membro; é a entrada para adicionar outro membro em sua DAO. Vamos tentar adicionar outro endereço, depois clique em "Add" (Adicionar) (por favor, certifique-se de que você esteja conectado com o endereço autorizado antes de começar)

Image description

Como já falamos anteriormente, toda ação na DAO precisa de um mecanismo de votação, portanto, após a confirmação da transação, o novo voto será criado na lista abaixo.

Image description

Então, clique em "Yes", depois confirme que a votação já tenha sido submetida. Então, temos que esperar até que o período de votação seja encerrado. O período de votação é configurado por padrão como 1 minuto no boilerplate.

Image description

Após 1 minuto, tente executar a proposta aqui, digitando o id da proposta, que é '0'. Depois clique em process. A proposta verificará o consenso de votação e executará a ação. Assim, agora temos 1 voto "Yes" e 0 "No". Então o consenso é "Yes". Após a execução, vamos verificar o membro colocando o endereço na proposta. Agora o novo membro foi adicionado.🎉

Image description

A seguir, vamos tentar outra funcionalidade principal. Crie proposta para um financiamento. Vamos lá!

Image description

Adicione alguns detalhes sobre sua proposta no primeiro input e acrescente o dinheiro que você precisa para solicitar. Como já expliquei anteriormente, qualquer um poderia criar esta proposta. Para comprovar esta funcionalidade, mudarei para outro endereço que não seja o membro do DAO.

Image description

Ótimo!! A proposta já foi enviada de um endereço que não é membro. Vamos aprová-la, mudar de volta para a carteira de membro da DAO e depois repetir o mesmo passo que fizemos para adicionar proposta de membro.

Oh ! Ele mostra um erro ao tentar executar a proposta. O boilerplate ainda não mostrou todos os erros, então você precisa confirmar em seu terminal que sua EVM esteja rodando (janela do terminal que você executa yarn chain).

Error: VM Exception while processing transaction: reverted with reason string 'DAO balance too low to accept the proposal.' (Exceção VM enquanto processando a transação: 
Enter fullscreen mode Exit fullscreen mode

Hmm, O que isso quer dizer ??? 🤨

Sim. Significa que seu contrato não tem nenhum saldo para dar a ninguém 🤣. Primeiramente, vamos colocar algum dinheiro na DAO. Felizmente, nós estamos nos divertindo no localhost. Assim podemos dar qualquer saldo a qualquer endereço de carteira, nós somos um deus 🧖

Image description

Primeiro, encontre o endereço do contrato. Clique na aba do contrato acima. Esta página é semelhante à IU do console do desenvolvedor para depuração. Execute o contrato inteligente diretamente. Depois, clique no ícone copy. Ele será copiado para sua área de transferência.

Image description

A seguir, clique no ícone da carteira no canto inferior esquerdo. Vamos usar o poder divino para fornecer algum dinheiro para o contrato da DAO.

Image description

Coloque seu endereço no primeiro campo e acrescente o saldo que você precisa. Em seguida, clique "send" e seu contrato mostrará o saldo que você enviou.

A seguir, tente criar uma nova proposta. Vote "yes" e tente executar a proposta novamente. Desta vez, você será bem sucedido.

Image description

Vamos checar o saldo de pagamento que recebemos da proposta. Mude para o endereço da carteira que apresentou a proposta e clique em "check payout" para verificar. Depois clique em "Get Paid". Uhuuu! 🎉 agora você recebeu o dinheiro da DAO.

Agora já tentamos todas as principais funcionalidades da DAO e isso é fantástico! Infelizmente, este artigo está muito longo, então eu tenho que cortá-lo.

Na próxima parte, aprofundaremos no código do contrato inteligente para todas as funcionalidades que tentamos neste artigo.

Vejo você no próximo artigo, e muito obrigado por seu interesse. 😃

Esse artigo foi escrito por Drnutsu e traduzido por Fátima Lima. O original pode ser lido aqui.

Top comments (0)