Definindo o stack web3
Tradução de Nader Dabit, artigo original disponível aqui
Quer construir na web3? Nader Dabit identifica os blocos de construção do stack tecnológico da web3 em um guia introdutório
Neste próximo segmento de Construindo na web3, o engenheiro de relações com desenvolvedores da Edge & Node, Nader Dabit, expande sobre o stack web3 e como os desenvolvedores podem conceituar as várias facetas de construção na web3.
Eu fiz a transição para a web3 em abril de 2021, depois de ser um desenvolvedor full-stack tradicional por cerca de 10 anos. Enquanto eu mergulhava em todas estas tecnologias e ideias, a primeira coisa que eu queria saber era "o que é um stack web3?".
Quando estou construindo um aplicativo web ou mobile, eu frequentemente dependo de alguns práticos blocos de construção para fazer o serviço.
- Servidores de API / app (REST ou GraphQL)
- Camada de autenticação (gerenciada ou feita a mão)
- Banco de dados
- Frameworks client-side, plataformas, e bibliotecas
- Armazenamento de arquivos
Usando estes componentes principais, eu posso construir a maioria dos tipos de aplicativos que eu quiser, ou pelo menos obter o máximo do caminho até lá. Então, como isso se parece na web3?
Acontece que a resposta a isto não é tão direta, porque:
- O paradigma é completamente diferente, de várias maneiras
- As ferramentas, tecnologias e ecossistema da web3 são menos maduros que na web2
Também foi mais difícil para mim entender como colocar de pé, rodar e construir aplicativos web3 porque eu estava abordando os problemas da mesma maneira que eu fazia no mundo da web2.
Depois de trabalhar, pesquisar, experimentar e construir coisas nos últimos 8 meses, eu gostaria de compartilhar o que eu aprendi.
O que é web3?
Antes de definirmos o que é o stack web3, vamos tentar definir o que é web3.
Há incontáveis definições dependendo de quem você pergunta, mas para mim eu encontro esta definição localizada em:
Web3 é um stack de protocolos que permite aplicações totalmente descentralizadas.
Com este stack de tecnologia descentralizado, nós podemos começar a construir aplicações descentralizadas que têm seus próprios conjuntos de implicações e características.
Algumas destas características possibilitadas pela web3 são:
- Infraestrutura descentralizada web
- Propriedade (de dado, conteúdo, e plataforma)
- Pagamentos digitais nativos
- Identidade auto-soberana
- Infraestrutura distribuída, sem necessidade de confiança, e robusta
- Back ends abertos, públicos e combináveis
Enquanto algumas das aplicações construídas com stacks tecnológicos descentralizados irão substituir seus predecessores, um novo paradigma de apps também se tornaram possíveis pelas novas primitivas possibilitadas pelos blockchains.
Pagamentos digitais nativos e infraestrutura pública de back end - como machine learning, dispositivos móveis, realidade virtual, e outras primitivas tecnológicas, plataformas, e blocos de construção – permitem tipos totalmente novos de aplicações a serem construídas, algumas ainda a serem imaginadas.
Isto significa que tudo será substituído pela web3? Não necessariamente. Enquanto eu realmente acho que construir em stack tecnológico descentralizado é uma escolha muito melhor para certos tipos de aplicação - como quase qualquer decisão técnica, depende do que você está construindo.
Vamos agora começar a mergulhar no stack web3, quebrado neste conjunto de categorias:
- Blockchain
- Ambiente de desenvolvimento blockchain
- Armazenamento de arquivos
- Protocolos de dados off-chain
- API (indexação & querying)
- Identidade
- Cliente (frameworks e bibliotecas)
- Oracles
- Outros protocolos
Blockchain
Há incontáveis blockchains em que você pode escolher construir. Não há um único que seja "o melhor". Ao invés disso você deve considerar as várias vantagens e desvantagens entre eles.
Uma coisa que é frequentemente importante para mim quando estou aprendendo algo novo é a ideia de aplicar o Princípio de Pareto ao que estou aprendendo, ou seja, qual é a maneira mais eficiente para obter o máximo em termos de tempo e esforço. Seguindo esta ideia eu posso ganhar o máximo de tração e momentum enquanto aprendo algo novo na menor quantidade de tempo.
No mundo blockchain, aprender Solidity e a EVM (Máquina virtual Ethereum) pode ser a melhor aposta para iniciar como desenvolvedor blockchain. Usando este conjunto de habilidades (e stack tecnológico), você pode construir não apenas para Ethereum, mas outros Layer 2 de Ethereum, sidechains, e até outros blockchains como Avalanche, Fantom e Celo.
Tendo dito isto, o Rust está começando a se tornar mais e mais popular no mundo blockchain, com Solana, NEAR, Polkadot, e outros tendo suporte de primeira classe do Rust. Você provavelmente não vai errar aprendendo um deles, mas para o iniciante eu diria que Solidity ainda será a melhor escolha se alguém me perguntar hoje.
Além deste conselho, aqui está um exemplo incompleto de blockchains que tem uma sólida combinação de tecnologia, utilidade, comunidade, momentum e viabilidade futura:
- Ethereum - plataforma original de smart contracts
- ZK rollups: ZKSync, Starknet, Hermez - layer 2 do Ethereum de alta taxa de transferência, mas não compatível com a EVM nativamente
- Optimistic rollups: Arbitrum & Optimism - layers 2 do Ethereum, compatível com a EVM (saiba mais sobre as diferenças entre rollups optimistic e ZK aqui)
- Polygon - sidechain Ethereum
- Solana - alta taxa de transferência, transações baratas, tempo rápido de blocos, mas mais difícil de aprender que EVM (Rust)
- NEAR - blockchain layer 1, pode escrever smart contracts em Rust ou Assemblyscript
- Cosmos - um ecossistema de blockchains interoperáveis
- Polkadot - plataforma de computação baseada em blockchain que permite blockchains feitos com ela, executar transações entre eles mesmos, criando uma internet interconectada de blockchains
- Fantom - layer 1 compatível com EVM
- Avalanche - layer 1 compatível com EVM
- Celo - layer 1 compatível com EVM, desenhada para facilitar qualquer um com um smartphone enviar, receber, e armazenar criptomoedas
- Tezos - layer 1 não compatível com EVM, um monte de projetos NFT estão usando-o
Quando estiver interagindo com uma rede, você irá precisar usar um endpoint RPC.
Há algumas maneiras de você fazer isso:
- Acessando um endpoint RPC público
- Rodando seus próprios nós
- Acessando um fornecedor de nó as a service
- Acessando um fornecedor de nó descentralizado as a service
Endpoints RPC públicos são frequentemente fornecidos pela rede, mas para a maioria dos dapps de produção, você irá querer alavancar seus próprios endpoints já que eles não são estáveis ou recomendados para ambiente de produção.
Há um punhado de fornecedores de serviço, e aqui estão alguns deles:
Há também uma solução web3 / descentralizada, Pocket Network que parece estar ganhando tração.
Qualquer uma destas opções é provavelmente uma boa aposta para interagir diretamente com a sua rede.
Ambientes de desenvolvimento blockchain
Para desenvolvimento EVM, há alguns bons ambientes de desenvolvimento disponíveis:
- Hardhat (JavaScript) é a mais nova opção, mas está ganhando cada vez mais popularidade. Sua documentação é ótima, as ferramentas e experiência do desenvolvedor são elegantes, e é o que eu pessoalmente tenho usado para construir dapps.
- Truffle (JavaScript) é uma suíte de ferramentas para construir e desenvolver aplicações na EVM. É maduro, testado em campo, e bem documentado. Está por aí há bastante tempo e muitos desenvolvedores o utilizam.
- Foundry é um novo ambiente de desenvolvimento Solidity da Paradigm, que promete muito. Destaques chaves são a habilidade de escrever testes em Solidity, suporte a fuzzing, e velocidade (é escrito em Rust). Eu escrevi uma introdução separada para ele aqui.
- Brownie é um framework de desenvolvimento e teste baseado em Python, para smart contracts para desenvolvimento Solidity / EVM.
Para desenvolvimento Solana, o Anchor está rapidamente se tornando o ponto de entrada para novos desenvolvedores. Ele fornece um CLI para scaffolding , construir, e testar programas Solana, assim como bibliotecas cliente que você pode usar para construir front ends. Ele também inclui um DSL que abstrai um monte de complexidades que desenvolvedores frequentemente encontram quando estão iniciando com desenvolvimento Solana e Rust.
Armazenamento de arquivo
Onde armazenamos imagens, vídeos, e outros arquivos na web3? Armazenar qualquer coisa assim grande on-chain é em geral proibitivamente caro, então nós provavelmente não queremos armazená-los lá.
Ao invés, nós podemos usar um do punhado de protocolos de armazenamento de arquivos:
-
IPFS - protocolo de sistema de arquivo ponto-a-ponto
- prós: é confiável, bem documentado, com um grande ecossistema
- contras: se o dado não for fixado, ele pode ser perdido
- Arweave - permite você armazenar dados permanentemente, pagando uma simples taxa de transação. Eu sou um fã da Arweave e escrevi aqui um post no blog.
- Filecoin - da Protocol Labs, o mesmo time que construiu o IPFS, é um protocolo desenhado para fornecer um sistema persistente de armazenamento de dados. Há um punhado de maneiras para os desenvolvedores construírem no Filecoin, incluindo web3.storage, que é muito legal.
- Skynet - Eu ainda não usei-o em produção, mas experimentei-o e ele parece funcionar muito bem. A API aqui parece ótima. Eu tenho dúvidas, como por quanto tempo o dado é persistido, e a interoperabilidade da Skynet com outros protocolos.
Protocolos de dados off-chain
Em adição ao armazenamento em arquivo e armazenamento on-chain, você também pode precisar armazenar dados off-chain. Você pode usar estes tipos de solução similares a como você pode usar um banco de dados em um stack tecnológico tradicional, mas ao invés, eles estão replicados através de um n número de nós em uma rede descentralizada, e por isso, mais confiável (pelo menos em teoria).
Algumas opções são:
- Ceramic Network - uma plataforma descentralizada, de código aberto, para criar, armazenar, e compartilhar dados. A Ceramic também tem um bom protocolo de identidade, o qual eu falarei mais tarde. Provavelmente minha solução de armazenamento off-chain favorita no momento. Aqui está uma demonstração muito bacana.
- Textile ThreadDB - um banco de dados multi-party construído sobre IPFS e Libp2p. Se eu entendi corretamente, ele pode estar passando por uma grande mudança de API no momento. Eu experimentei-o e ele parece promissor, mas os documentos e DX precisam de melhorias.
- GunDB - um banco de dados descentralizado, ponto-a-ponto. O Gun tem estado por aí há um bom tempo e algumas aplicações bem interessantes têm sido construídas com ele.
Em termos de maturidade, eu acredito que o ecossistema de soluções de armazenamento off-chain ainda não está onde ele precisa estar para que se construa alguns dos mais avançados casos de uso que alguns desenvolvedores possam querer. Alguns desafios aqui são dados em tempo real, detecção e resolução de conflitos, autorização de escrita, documentação, e experiência geral do desenvolvedor.
Integrar soluções de dados off-chain com protocolos blockchain é um dos últimos grandes obstáculos que nós precisamos superar antes que nós tenhamos um stack de protocolos totalmente descentralizado capaz de suportar qualquer tipo de aplicação.
API (indexação & querying)
Há muitas diferenças na maneira que interagimos com e construímos sobre blockchains versus bancos de dados no stack técnico tradicional. Com blockchains, o dado não é armazenado em um formato que possa eficientemente ou facilmente ser consumido diretamente de outras aplicações ou front ends.
Blockchains são otimizados para operações de escrita. Você frequentemente ouve a inovação acontecendo centrada em transações por segundo, tempo de bloco, e custo de transação. Dado de blockchain é escrito em blocos através do curso do tempo, fazendo qualquer coisa, exceto operações de leitura básicas, impossível.
Na maioria das aplicações, você precisa de recursos como dados relacionais, classificação, filtragem, busca por texto completo, paginação e muitos outros tipos de capacidades de consulta. Para fazer isso, o dado precisa ser indexado e organizado para recuperação eficiente.
Tradicionalmente, este é o trabalho que bancos de dados fazem na stack _técnica centralizada, mas esta camada de indexação foi perdida no stack_ web3.
The Graph é um protocolo para indexação e consulta de dados de blockchain que faz este processo muito mais fácil e oferece uma solução descentralizada para fazer isso. Qualquer um pode construir e publicar APIs abertas GraphQL, chamadas subgraphs, fazendo dados de blockchain fácil de consultar.
Para aprender mais sobre o The Graph, consulte os documentos aqui ou meu tutorial aqui.
Identidade
Identidade é um paradigma completamente diferente na web3. Na web2, autenticação é quase sempre baseada na informação pessoal do usuário. Essa informação é geralmente colhida ou via um formulário ou um fornecedor OAuth que pede ao usuário para ceder em troca de acesso ao aplicativo.
Na web3, a identidade gira completamente em volta da ideia de carteiras e criptografia de chave pública.
Enquanto o nome “carteira” serve ao seu propósito, eu percebi que pessoas novas à web3 acham a terminologia confusa, já que ela se relaciona com autenticação e identidade. Eu espero que no futuro nós possamos imaginar alguma outra maneira de transmitir o que uma carteira é, já que ela combina aspectos financeiros mas também identidade e reputação.
Como um desenvolvedor, você precisará entender como acessar e interagir com a carteira do usuário e endereço em várias maneiras.
Em um nível muito básico (e uma exigência muito comum), você pode precisar requerer acesso à carteira do usuário. Para fazer isso, você geralmente será capaz de acessar a carteira do usuário na janela do contexto (navegador web) ou usar algo como WalletConnect ou o Wallet Adapter do Solana.
Por exemplo, se eles têm uma carteira Ethereum disponível, você será capaz de acessar window.ethereum. O mesmo para Solana (window.solana), Arweave (window.arweaveWallet), e um punhado de outros. WalletConnect é bom para web mobile e React Native já que permite aos usuários autorizar o uso das suas carteiras móveis diretamente do dispositivo.
Se você gosta de manipular autenticação por você mesmo, você pode permitir o usuário assinar uma transação e então decodificá-lo em algum lugar para autenticar o usuário, mas isto geralmente requer um servidor. Aqui está um exemplo de como isto pode parecer usando uma carteira EVM, e aqui está um exemplo de como fazer isto com Solana / Phantom.
E sobre gerenciar perfis de usuários de uma maneira descentralizada? A Ceramic Network oferece o mais robusto protocolo e suíte de ferramentas para gerenciamento de identidade descentralizada. Eles lançaram recentemente um post em blog delineando algumas das suas mais recentes atualizações e dando algumas diretrizes sobre como todas as ferramentas trabalham juntas. Eu começaria lá e então exploraria seus documentos para obter um entendimento de como começar construindo, e considere checar meu projeto exemplo aqui que usa Ceramic self.id.
Se você quiser trazer os registros ENS em texto, a biblioteca ensjs oferece uma boa API para buscar os dados de usuário:
const ens = new ENS({ provider, ensAddress: getEnsAddress('1') })
const content = await ens.name('sha.eth').getText('avatar')
SpruceID é algo que também parece promissor mas eu ainda preciso experimentá-lo.
Ambos Ceramic e Spruce implementam a especificação DID W3C, que por ela mesma também é algo que eu consideraria como um bloco de construção da web3. Tendo dito isso, qualquer implementação centralizada dos DIDs vai contra a ideia do que a especificação está buscando.
Cliente
Até onde o framework JavaScript vai, você pode realmente construir com qualquer coisa que você quiser, já que os SDKs de blockchain do lado cliente são geralmente agnósticos quanto a framework. Tendo dito isso, um impressionante número de projetos e exemplos são construídos em React. Também há um punhado de bibliotecas como a Solana Wallet Adapter, que oferece utilidades adicionais para React, então eu diria que aprender ou ser familiar com React será provavelmente um movimento esperto.
Para SDKs do lado cliente em Ethereum, há o web3.js e ethers.js. Para mim, Ethers é mais acessível e tem melhor documentação, apesar do web3.js estar por aí há mais tempo.
Em Solana, você provavelmente estará trabalhando com @solana/web3.js e / ou Anchor. Eu considero as bibliotecas clientes Anchor a minha maneira de construir programas Solana, já que eu estou usando o framework Anchor de qualquer maneira, e eu achei-o muito mais fácil de entender do que o @solana/web3.js.
Oracles
Oracles permitem aos desenvolvedores acesso de leitura a dados e sistemas externos do mundo real, de dentro de um smart contract.
Por exemplo, a maioria das aplicações financeiras requerem conhecimento de dados e eventos acontecendo no mundo real, acontecendo off-chain, então os Oracles são especialmente importantes em DeFi.
Chainlink é um Oracle que permite acesso a dados do mundo real e computação off-chain enquanto mantém as garantias de segurança e confiança inerentes à tecnologia blockchain.
Flux é um Oracle cross-chain que fornece aos smart contracts acesso a feeds de dados economicamente seguros.
Outros protocolos
Radicle é um protocolo de colaboração de código descentralizado, construído no Git. Ele poderia ser pensado como uma versão descentralizada do GitHub.
Livepeer é uma rede de streaming de vídeo descentralizada. Ela é madura e largamente utilizada com mais de 70.000 GPUs ao vivo na rede.
Resumindo
Este post será um documento vivo que eu atualizo enquanto aprendo, experimento, e recebo feedback de desenvolvedores construindo na web3.
Se você tem qualquer feedback ou ideias sobre alguma coisa que eu esqueci aqui, por favor me contate e compartilhe seus pensamentos comigo. É excitante ver toda essa atividade acontecendo ao redor da web3, com os desenvolvedores entrando e se envolvendo. Enquanto a infraestrutura ainda está evoluindo, a visão de construir protocolos realmente descentralizados e aplicações que permitam às pessoas coordenar sem ter que dar poder e controle a grandes empresas é importante, e nós estamos perto de tornar esta visão uma realidade.
Latest comments (1)
Parabéns pelo excelente artigo! Uma verdadeira fonte de recursos, favoritado já!