Introdução à Web 3.0 e a arquitetura de um DApp

Reslley Gabriel
Snackin’
Published in
8 min readJan 18, 2022

O futuro descentralizado da Internet, com blockchain, criptomoedas e NFTs já não pode mais ser ignorado e quem não acompanhar essa tendência certamente comerá poeira nos próximos anos.

A Web 3.0 não será só uma revolução tecnológica, mas também social, política e econômica.

Antes de falar sobre os benefícios e dificuldades desse novo mundo, vamos primeiro entender um pouco mais sobre as diferenças com suas “antigas” versões.

Além disso, iremos entender mais profundamente como funciona a tecnologia que está permitindo toda essa inovação.

Web 1.0 [A mãe de todas] 👵🏻

Ela foi a primeira iteração da Web, na qual a maioria dos usuários eram meros “consumidores de conteúdo”.

Os sites geralmente continham informações somente em texto e imagens estáticas, sem muita interatividade.

Web 2.0 [A era dos criadores] 🤳

Essa é a versão que você provavelmente conhece e usa. Na qual você não precisa ser um desenvolvedor para poder criar, comentar e compartilhar conteúdo.

Plataformas como Facebook, Instagram e o próprio Medium são exemplos de aplicações que permitem essa simplicidade de interação.

Quando você escreve um post de blog no Medium, você interage com seu frontend, que fala com seu backend, que fala com seu banco de dados. Todo esse código é hospedado em servidores centralizados e enviado aos usuários por meio de um navegador de internet. Este é um bom resumo de alto nível de como a maioria dos aplicativos da Web 2.0 funciona hoje.

Arquitetura básica de uma aplicação Web 2.0. Imagem por Fonte.

Web 3.0 [O futuro descentralizado] 👥👥

A arquitetura dos aplicativos Web 3.0 (ou “DApps”) é completamente diferente dos aplicativos Web 2.0.

A diferença fundamental nessa “nova versão” é que agora as aplicações são executadas em cima da blockchain, em redes p2p descentralizadas, ou uma combinação das duas coisas.

A Web 3.0 é uma internet cujos proprietários são os próprios usuários .

Isso significa, essencialmente, que não há um banco de dados centralizado que armazene o estado do aplicativo e não há servidor web centralizado onde reside a lógica de backend.

Em vez disso, você pode aproveitar a blockchain para criar aplicativos em uma máquina de estado descentralizada que é mantida coletivamente por todos na rede.

Na Web 3.0 você pode escrever contratos inteligentes que definem a lógica de seus aplicativos e os implanta na máquina de estado descentralizada. Isso significa que todas as pessoas que desejam criar um aplicativo blockchain implantam seu código nessa máquina de estado compartilhada.

Veja como fica a arquitetura simplificada:

Arquitetura simplificada de uma Aplicação Web 3.0. Imagem por Fonte.

Por debaixo dos panos 🧑🏻‍💻

Agora, vamos mergulhar um pouco mais fundo no que torna isso possível.

1) Blockchain

A blockchain Ethereum é frequentemente apontada como um “computador mundial”, projetado para ser uma máquina de estado que qualquer pessoa no mundo pode acessar e escrever.

Uma coisa interessante: os dados só podem ser gravados na blockchain Ethereum — você nunca pode atualizar os dados existentes.

2) Contratos inteligentes

Um contrato inteligente é um programa executado na blockchain Ethereum e define a lógica por trás das mudanças de estado que acontecem na blockchain. Os contratos inteligentes são escritos em linguagens de alto nível, como Solidity ou Vyper.

Exemplo de código no Solidity. Imagem por Fonte.

Como o código do contrato inteligente é armazenado na blockchain Ethereum, qualquer pessoa pode inspecionar a lógica do aplicativo.

3) Máquina Virtual Ethereum (EVM)

Depois, você tem a Máquina Virtual Ethereum, que executa a lógica definida nos contratos inteligentes e processa as mudanças de estado.

A EVM não entende linguagens de alto nível como Solidity e Vyper, que são usadas para escrever contratos inteligentes. Em vez disso, você precisa compilar a linguagem de alto nível em bytecode, que o EVM pode executar.

4) Frontend

Queremos que nosso frontend se comunique com nossos contratos inteligentes para que eles possam invocar funções, mas lembre-se de que o Ethereum é uma rede descentralizada. Cada nó na rede Ethereum mantém uma cópia de todos os estados, incluindo o código e os dados associados a cada contrato inteligente.

Quando queremos interagir com os dados e o código em uma blockchain, precisamos interagir com um desses nós. Isso ocorre porque qualquer nó pode transmitir uma solicitação para que uma transação seja executada no EVM. Um minerador executará a transação e propagará a mudança de estado resultante para o resto da rede.

Existem duas maneiras de transmitir uma nova transação:

➡️ Configurar seu próprio nó que executa o software blockchain Ethereum
➡️ Usar nós fornecidos por serviços de terceiros, como Infura, Alchemy e Quicknode

Os nós com os quais você se conecta quando precisa interagir com o blockchain geralmente são chamados de “provedores”:

Arquitetura aplicação Web 3.0 com providers. Imagem por Fonte.

Depois de se conectar ao blockchain por meio de um provedor, você pode ler o estado armazenado no blockchain. Mas se você quiser escrever para o estado, ainda há mais uma coisa antes de enviar a transação para o blockchain — “assinar” a transação usando sua chave privada.

Por exemplo, imagine que temos um DApp que permite que os usuários leiam ou publiquem postagens de blog no blockchain. Você pode ter um botão no frontend que permite que qualquer pessoa consulte as postagens do blog escritas por um usuário específico. (Lembre-se de que a leitura do blockchain não exige que um usuário assine uma transação.)

No entanto, quando um usuário deseja publicar uma nova postagem, nosso DApp solicita que o usuário “assine” a transação usando sua chave privada — só então o DApp retransmite a transação para o blockchain. Caso contrário, os nós não aceitariam a transação.

Essa “assinatura” de transações é onde o Metamask normalmente entra:

Arquitetura aplicação Web 3.0 + Metamask. Imagem por Fonte.

Metamask é uma ferramenta que torna mais fácil para os aplicativos lidarem com o gerenciamento de chaves e a assinatura de transações. Ele armazena as chaves privadas de um usuário no navegador e é chamado sempre que o frontend precisa que o usuário assine uma transação.

Armazenando dados na Blockchain 💾

Essa arquitetura faz sentido se você estiver construindo um aplicativo onde todos os contratos inteligentes e dados vivem inteiramente no blockchain. Mas armazenar tudo na blockchain fica muito caro, muito rápido.

Com o Ethereum, o usuário paga toda vez que adiciona novos dados ao blockchain. Isso porque adicionar um estado à máquina de estado descentralizada aumenta os custos para os nós que mantêm essa máquina de estado.

Pedir aos usuários que paguem mais pelo uso do seu DApp toda vez que a transação exigir a adição de um novo estado não é a melhor experiência do usuário.

Além disso, o código frontend também não está armazenado no blockchain. Poderíamos hospedar esse código na AWS, como normalmente faríamos na Web 2.0, mas isso cria um gargalo de centralização para seu DApp.

É por isso que, se você deseja criar um aplicativo verdadeiramente descentralizado, pode optar por hospedar seu frontend em uma solução de armazenamento descentralizada, como IPFS ou Swarm:

Arquitetura aplicação Web 3.0 com armazenamento descentralizado. Imagem por Fonte.

Fazendo consultas na Blockchain 🔍

Até agora, falamos sobre como gravar na blockchain assinando transações e enviando-as para o blockchain. Mas e a leitura de dados dos contratos inteligentes no blockchain? Existem duas maneiras principais de fazer isso:

➡️ Eventos de contrato inteligente

Você pode usar a biblioteca Web3.js para consultar e ouvir eventos de contrato inteligente, especificando um retorno de chamada sempre que o evento for acionado.

➡️ “The Graph”

A abordagem acima funciona, mas tem algumas limitações. Por exemplo, e se você implantar um contrato inteligente e depois perceber que precisa de um evento emitido que não incluiu originalmente? Infelizmente, você teria que reimplantar um novo contrato inteligente com esse evento e dados. Além disso, usar retornos de chamada para lidar com várias lógicas de interface do usuário se torna muito complexo.

É aí que entra o “The Graph”, uma solução de indexação que usa GraphQL e facilita a consulta de dados na blockchain Ethereum. Ele permite que você defina quais contratos inteligentes indexar, quais eventos e chamadas de função escutar e como transformar eventos em entidades que a lógica de frontend pode consumir.

Agora, a arquitetura do DApp fica assim:

Arquitetura aplicação Web 3.0 + consultas com The Graph. Imagem por Fonte.

Estamos quase terminando, mas ainda temos um tópico importante…

Escalando seu DApp 📈

Construir um DApp na rede ​​Ethereum com altas taxas de gás vai acabar gerando um UX muito ruim. Felizmente, existem algumas soluções em desenvolvimento.

Uma solução de dimensionamento popular é o Polygon, uma solução na camada L2. Em vez de executar transações na blockchain principal, a Polygon possui “sidechains” que processam e executam transações.

Uma sidechain é uma blockchain secundária que faz interface com a cadeia principal. De vez em quando, a sidechain envia uma agregação de seus blocos recentes de volta à cadeia primária.

Outros exemplos de soluções L2 são Optimistic Rollups e zkRollups. A ideia aqui é semelhante: agrupamos transações fora da cadeia usando um contrato inteligente de “acumulação” e, em seguida, persistimos periodicamente essas transações na cadeia principal:

Arquitetura completa de uma aplicação Web 3.0 com sidechains. Imagem por Fonte.

Prós e Contras das aplicações Web 3.0 👍👎

Esse ecossistema está se desenvolvendo rápido, mas já podemos identificar benefícios e limitações atuais na tecnologia.

Pontos positivos

👍 Qualquer pessoa que esteja na rede tem permissão para usar o serviço
👍 Ninguém pode bloqueá-lo ou negar-lhe acesso ao serviço.
👍 Os pagamentos são integrados por meio do token nativo, ether (ETH).
👍 O Ethereum é completo, o que significa que você pode programar praticamente qualquer coisa.

Pontos negativos

👎 Escalabilidade: as transações são mais lentas na web3 porque são descentralizadas. Mudanças no estado, como um pagamento, precisam ser processadas por um minerador e propagadas por toda a rede.
👎 UX: interagir com aplicativos pode exigir etapas extras, software e um certo nível de conhecimento. Isso pode ser um obstáculo para a adoção.
👎 Acessibilidade: a falta de integração em navegadores modernos torna os DApps menos acessíveis para a maioria dos usuários.
👎 Custo: os DApps mais bem-sucedidos colocam porções muito pequenas de seu código no blockchain, pois é caro.

Conclusão

Muitas aplicações interessantes estão surgindo e a evolução de todo o ecossistema está bastante acelerada.

Ignorar a Web 3.0 agora é como ignorar o nascimento da Internet.

Sim, combinar todas essas ferramentas é complexo e pode levar a uma experiência dolorosa para o desenvolvedor. Mas não se preocupe, esse é apenas o começo! 😉

E você, o que acha dessa nova era da Web? Comenta aí!

--

--

Reslley Gabriel
Snackin’

Head of Artificial Intelligence at Maggu | AI Engineer | MSc in ML & Computer Science