WEB3DEV

Cover image for Comparando as bibliotecas de Blockchain: Web3.js vs. Ethers.js
Paulo Gio
Paulo Gio

Posted on

Comparando as bibliotecas de Blockchain: Web3.js vs. Ethers.js

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*L9zKiRHAZgHjyuRf0_EU-w.png

Cada blockchain programável possui um conjunto de SDKs ou bibliotecas que ajudam a conectar e comunicar-se com a blockchain específica. A maioria das blockchains atualmente depende da rede Ethereum, tornando-as compatíveis com a EVM (Ethereum Virtual Machine). Isso significa que se uma biblioteca ETH for criada, ela poderá ser usada em qualquer blockchain compatível com a EVM. No entanto, a comunicação é possível usando o protocolo JSON-RPC.

Neste artigo, vamos comparar duas bibliotecas ETH populares. Você aprenderá as diferenças entre elas, seus prós e contras. Isso também pode ajudá-lo, como diretor de tecnologia (CTO) / líder de equipe, a decidir qual biblioteca usar em projetos futuros.

JavaScript para Blockchains

Desde a criação do JavaScript por Brendan Eich em 1995, ele se tornou a linguagem de programação mais utilizada na internet para construir várias ferramentas em uso hoje. De acordo com a Statista, a linguagem mais utilizada entre os desenvolvedores de software é o JavaScript.

Imagine que você precisa resolver um problema específico e a única linguagem que conhece é o JavaScript. Não seria mais fácil usar o JavaScript para resolver esse problema em vez de aprender uma nova linguagem avançada? Muitos desenvolvedores enfrentaram esse obstáculo e encontraram maneiras de construir dApps com JavaScript, criando SDKs/bibliotecas que podem se conectar à blockchain por meio de provedores. Isso reduziu o nível de entrada para o desenvolvimento no espaço da blockchain. Você não precisa aprender uma linguagem avançada como Rust e Solidity para construir para a Solana ou Ethereum.

Além disso, reduzir o nível de entrada para o desenvolvimento de blockchains é um dos principais papéis do JavaScript.

O que é o Ethers.js

Desde sua criação, o ethers.js experimentou um crescimento constante e ganhou popularidade como uma das bibliotecas baseadas em JavaScript mais utilizadas para o desenvolvimento web3 entre os desenvolvedores da Ethereum. Essa ferramenta ajuda os desenvolvedores de JavaScript a interagir com a cadeia Ethereum e qualquer blockchain compatível com a Máquina Virtual Ethereum (EVM).

Um engenheiro de software canadense chamado Richard Moore criou o Ethers.js em 2015 como uma alternativa ao web3.js.

O Ethers.js é conhecido por ser leve. A forma que ele gerencia chaves e interage com a blockchain é o que o torna diferente. No ethers.js, duas entidades lidam com o seguinte:

  • Uma carteira que assina transações com chaves privadas.
  • Um provedor que se conecta à blockchain usando um URL JSON-RPC. O ethers.js verifica o estado e envia transações.

Vantagens do Ethers.js

  • Tamanho da biblioteca: O Ethers.js tem 88 KB quando compactado e 284 KB descompactado.
  • ENS: O ENS é como o DNS na Blockchain. Onde quer que endereços Ethereum sejam usados, um endereço .eth pode ser usado também. Você pode configurar facilmente um nome de domínio sem um código boilerplate.
  • Casos de teste: O Ethers.js é bem testado. O próprio Richard Moore escreveu grande parte desses casos de teste, e o Ethers.js possui mais de 10.000 casos de teste.
  • Licença: O Ethers.js é licenciado sob a licença MIT, permitindo uso e modificação gratuita. No entanto, se você usar o Ethers.js como biblioteca e vinculá-lo a um programa maior, o trabalho derivado deve ser lançado sob a licença LGPL-3.0.
  • Desempenho: Considerando o tamanho pequeno, será uma boa ideia usá-lo no frontend, pois isso melhorará drasticamente o desempenho.

Desvantagens do Ethers.js

  • O Ethers.js é relativamente novo e, se você encontrar problemas, encontrar respostas em lugares como o StackOverflow pode não ser suficiente.
  • Muitas empresas fundamentais agora usam o Web3.js para seus projetos principais e, se você precisar trabalhar para essas empresas, pode ser necessário gastar algum tempo aprendendo o Web3.js.

Módulos do Ethers.js

O Ethers.js possui quatro módulos que são o núcleo da API do Ethers.js.

  • Ethers.Provider: Para entender o que o módulo Ethers.Provider faz, é importante entender o que é um nó (node). Para acessar a rede blockchain, você precisa ter um nó em execução em sua máquina para acessá-la. O nó se conecta a outros nós para verificar se as transações entre as pessoas são válidas, enquanto armazena informações sobre o estado da blockchain. A blockchain é totalmente composta por nós. Esses nós são executados por indivíduos em todo o mundo, e isso significa que não há um servidor central ou uma única fonte de verdade. Isso é o que torna a blockchain descentralizada. Pense nos nós como o combustível para seus carros; eles não vão funcionar se estiverem vazios. Configurar nós pode ser bastante difícil; de fato, pode levar até uma semana ou mais, mas existem provedores como Alchemy, Infura e Quicknode. Eles têm o nó configurado para você, tudo o que eles precisam é que você estabeleça uma conexão, para assim ter acesso à blockchain.
  • Ethers.Contract: Este módulo é usado para implantar e interagir com contratos inteligentes. Ele oferece a capacidade (por meio de funções encapsuladas) de ouvir eventos de contratos inteligentes. No entanto, você pode usar este módulo para solicitar informações sobre um contrato inteligente e as funções fornecidas por ele.
  • Ethers.utils: Este módulo pode ajudá-lo a formatar dados, como o saldo de uma carteira, e processar outras entradas do usuário. No código abaixo, depois de obter o endereço de uma carteira, buscamos o saldo da carteira, mas como o valor retornado está em Wei, usamos o .formatEther para torná-lo mais legível para os humanos.
const accountChangedHandler = async (newAccount) => {
       const address = await newAccount.getAddress();
       setDefaultAccount(address);
       const balance = await newAccount.getBalance()
       setUserBalance(ethers.utils.formatEther(balance));
       await getuserBalance(address)
   }
Enter fullscreen mode Exit fullscreen mode

Reprodução de Sessões para Desenvolvedores

Descubra frustrações, entenda bugs e corrija lentidões como nunca com o OpenReplay - uma suíte de reprodução de sessões de código aberto para desenvolvedores. Ele pode ser hospedado por você em minutos, proporcionando total controle sobre os dados do seu cliente.

https://miro.medium.com/v2/resize:fit:1100/format:webp/0*96fpePfAq5FfYu5w.png

Feliz depuração! Experimente o OpenReplay hoje mesmo.

O que é o Web3.js

O Web3.js é uma biblioteca popular baseada em JavaScript que conecta clientes à blockchain. Essa biblioteca é executada e interage com um nó Ethereum local ou remoto usando HTTP, IPC ou Websockets. O Web3.js foi lançado em 2015 e é uma biblioteca de código aberto criada pela Fundação Ethereum. Isso significa que possui a maior comunidade, ao contrário do Ethers.js, que foi lançado um ano depois. A biblioteca Web3.js faz parte de mais projetos e pacotes do que qualquer outra biblioteca.

No entanto, o Web3.js não gerencia chaves como o Ethers.js. Carteiras e provedores não são separados; em vez disso, pressupõe-se que um nó local esteja conectado à aplicação que lida com o armazenamento de chaves, assinatura de transações e verificação do estado na blockchain.

Vantagens do Web3.js

  • Suporte da Fundação Ethereum: A Fundação Ethereum desenvolveu o Web3.js. Isso significa que possui muitos desenvolvedores contribuindo para ele, e é mais provável que você encontre uma solução mais rapidamente quando surgirem problemas, ao contrário do seu concorrente Ethers.js.
  • Popularidade: Podemos usar o número de estrelas do GitHub para medir sua popularidade entre os desenvolvedores de blockchain. De acordo com o GitHub, o Web3.js possui mais de dezessete mil (17.000) estrelas, enquanto o Ethers.js possui sete mil (7.000) estrelas. Grande parte de sua popularidade se deve ao impacto do pioneirismo, o que resulta em uma comunidade maior.

Desvantagens do Web3.js

  • Tamanho: O Web3.js é relativamente maior que o Ethers.js, o que o torna menos desejável para uso no frontend, pois pode afetar o desempenho do site.
  • Flexibilidade: Devido à forma como as chaves são tratadas no Ethers.js, por meio da separação de responsabilidades, que permite que os desenvolvedores lidem com o armazenamento e gerenciamento de chaves de maneira diferente, o Web3.js deixa a desejar nessa área.
  • Licença: O Web3.js funciona sob uma licença mais restritiva, onde a modificação não é permitida se não for lançada publicamente primeiro.

Módulos do Web3.js

  • web3.eth: Este módulo é usado para conectar a blockchain Ethereum e contratos inteligentes. Também permite que você se inscreva em eventos na blockchain.
  • web3.net: Este módulo permite interagir com a propriedade do nó da rede.
  • web3.shh: Este módulo permite a comunicação com o protocolo Whisper (uma técnica de comunicação usada por dApps para se comunicarem entre si).
  • web3.utils: Este módulo fornece funções de utilidade para dApps Ethereum e outros pacotes web3.
  • Web3.bzz: Este módulo permite interagir com a rede Swarm.

Comparação entre Web3.js e Ethers.js

Nesta seção, faremos uma comparação entre essas duas bibliotecas com base nos seguintes critérios:

  • Comparação pelo código;
  • Experiência do desenvolvedor;
  • Popularidade;
  • Documentação;
  • Facilidade de uso;
  • Desempenho;
  • Manutenção.

Comparação pelo Código

Para completar esta seção, precisaremos escrever um programa para enviar transações pela rede blockchain usando as duas bibliotecas. Para executar esse projeto, você deve ter o seguinte:

  • Node 16 ou superior.
  • Extensão MetaMask (crie uma conta).
  • Provedores de nó, como o Infura (crie uma conta).
  • Envie transações usando o Ethers.js: Para enviar transações pela blockchain Ethereum usando o Ethers.js, copie o seguinte código para o seu arquivo index.js:
const ethers = require('ethers');
(async()=>{
   const provider = new ethers.providers.JsonRpcProvider("https://goerli.infura.io/v3/private key");
   const gasPrice = provider.getGasPrice()
   const wallet = ethers.Wallet.fromMnemonic('your Mnemonics');
   const signer = wallet.connect(provider);

   const receiver = "0x8dC847Af872947Ac18d5d63fA646EB65d4D99560"
   const trt = {
       from: wallet.address,
       to: receiver,
       value:  ethers.utils.parseUnits('0.001', 'ether'),
       gasPrice: gasPrice
   }
   const sendTransaction = await signer.sendTransaction(trt);
   console.log(sendTransaction);
})();var Web3 = require ( 'web3' ); async function main () { const nonce = await web3.eth. getTransactionCount (fromAdress, 'latest' ); const transaction = { 'nonce' : nonce, }; } else { } }); console. log (signedTrans); } main ();
Enter fullscreen mode Exit fullscreen mode
  • Envie Transações usando o Web3.js: Para enviar transações pela blockchain Ethereum usando o Web3.js, copie o seguinte código para o seu arquivo index.js:
var Web3 = require('web3');
async function main() {
   const private_key = 'private_key';
   var web3 = new Web3('https://goerli.infura.io/v3/secret key');
   const fromAdress = '0xF63576c9369a87D74d84C49895581a6B1E412D31';
   const nonce = await web3.eth.getTransactionCount(fromAdress, 'latest');
   const transaction = {
    'to': '0xc419E0B31A46d3071e336E062676352637428500',
    'value':web3.utils.toWei('0.01', 'ether'),
    'gas': 30000,
    'nonce': nonce,
   };
   const signedTrans = await web3.eth.accounts.signTransaction(transaction, private_key);
web3.eth.sendSignedTransaction(signedTrans.rawTransaction, function(error, hash) {
   if (!error) {
     console.log("The hash of your transaction is: ", hash);
   } else {
     console.log("❗Something went wrong while submitting your transaction:", error)
   }
  });
  console.log(signedTrans);
}
main();
Enter fullscreen mode Exit fullscreen mode

Os dois trechos de código fornecidos acima são exemplos de como realizar uma transação na blockchain Ethereum usando duas bibliotecas diferentes: Ethers.js e Web3.js. Aqui está uma comparação detalhada das principais diferenças entre as duas:

  • Sintaxe: O Ethers.js usa uma sintaxe mais orientada a objetos, enquanto o Web3.js usa uma sintaxe mais funcional. Isso significa que, no Ethers.js, você criaria instâncias de classes e chamaria métodos nelas, enquanto no Web3.js você chamaria funções no objeto web3.
  • Provedor: O Ethers.js usa a classe JsonRpcProvider para se conectar a um nó Ethereum, enquanto o Web3.js usa a classe Web3.
  • Carteira: O Ethers.js usa a classe Wallet para criar uma nova carteira ou importar uma existente, enquanto o Web3.js usa o objeto eth.accounts para criar uma nova carteira ou importar uma existente.
  • Assinatura de Transações: No Ethers.js, o objeto signer é usado para assinar a transação, enquanto no Web3.js, a função eth.accounts.signTransaction é usada para assinar a transação.
  • Envio de Transações: No Ethers.js, o método send transaction é chamado no objeto signer para enviar a transação, enquanto no Web3.js, a função web3.eth.sendSignedTransaction é usada para enviar a transação.
  • Tratamento de Erros: No Ethers.js, você pode usar blocos try-catch para lidar com erros, enquanto no Web3.js você pode usar uma função de retorno de chamada para lidar com os erros.
  • Preço do Gás: No Ethers.js, o preço do gás é obtido chamando o método getGasPrice no objeto provedor, enquanto no Web3.js, ele é definido no objeto de transação.
  • Tipos de Unidades: O Ethers.js possui suas próprias utilidades para lidar com diferentes tipos de unidades, como ethers.utils.parseUnits, enquanto o Web3.js usa suas próprias utilidades, como web3.utils.toWei.
  • Mnemônico: O Ethers.js permite criar uma carteira a partir de um mnemônico, enquanto o Web3.js não possui esse recurso.

No geral, ambas as bibliotecas são muito semelhantes em termos de funcionalidade, mas possuem sintaxe e utilidades diferentes. A escolha entre as duas bibliotecas dependerá de preferência pessoal, familiaridade e do caso de uso específico.

Experiência do Desenvolvedor

Ambas as bibliotecas possuem todas as ferramentas necessárias para criar aplicativos blockchain poderosos com poucas linhas de código, mas o Ethers.js é percebido como mais limpo devido à separação de responsabilidades entre provedores e carteiras.

No entanto, muitos projetos fundamentais usam o web3.js. Isso faz com que a maioria dos tutoriais disponíveis seja escrita em web3.js, o que representa uma curva de aprendizado mais fácil para novos desenvolvedores. Existem mais recursos e soluções para vários problemas disponíveis para o web3.js do que para o Ethers.js.

Popularidade

  • GitHub: Um projeto popular no GitHub é autenticamente relevante. O Web3.js lidera a lista como a biblioteca JavaScript Ethereum mais popular, com mais de 16000 estrelas no GitHub, mas as estrelas do GitHub, na minha opinião, apenas comprovam a vantagem do pioneirismo. Por outro lado, o Ethers.js tem mais de 6k estrelas no GitHub.
  • Downloads no NPM: Os downloads no NPM mostram quantos downloads por semana uma biblioteca recebe de desenvolvedores para seus projetos. O Web3.js tem mais de 265000 downloads por semana, enquanto o Ethers.js tem mais de 610000 downloads por semana. Isso mostra que há uma mudança ou transição do web3.js para o ethers.js.

Documentação

Ambas as bibliotecas possuem documentação bastante abrangente. No entanto, o ethers.js possui uma vantagem sobre o web3.js graças à sua seção de "getting started" e "play areas" (áreas de experimentação).

Facilidade de Uso

O Web3.js combina o manuseio de carteiras e provedores em um único objeto, mas no Ethers.js, ler a blockchain, modificar seu estado e gerenciar chaves são operações separadas.

Desempenho

Em termos de desempenho, o Ethers.js é uma biblioteca melhor. É adequado para uso em aplicativos frontend devido ao seu tamanho compacto. O Ethers.js tem 248 kB descompactado e 77 kB compactado.

Manutenção

O Web3.js está sendo mantido pela Ethereum Foundation, mas recebeu uma bolsa da ChainSafe no outono de 2020 para reescrever o Web3.js usando o moderno Typescript. Com esse desenvolvimento, a ChainSafe está empenhada em trazer melhorias para aliviar os pontos problemáticos do uso do Web3.js. Segundo a ChainSafe, as áreas em que eles planejam fazer melhorias são:

  • Tornar a transição para o Typescript eficiente em qualquer projeto.
  • Ter a biblioteca inteiramente em Typescript.
  • Criar uma versão flexível e unificada da biblioteca.
  • Oferecer uma ampla variedade de recursos para suportar o eth2.

Em conclusão, a ChainSafe parece estar empenhada em fazer um bom trabalho na manutenção do Web3.js.

No entanto, o Ethers.js é mantido por apenas uma pessoa, Richard Moore, um engenheiro de software canadense. No GitHub, apenas 15 contribuidores são listados.

O que vem a seguir

Usar as bibliotecas por si mesmo irá determinar qual delas melhor atende aos seus requisitos. Há muitos tutoriais na internet para ajudá-lo a começar o mais rápido possível.

Conclusão

Tanto o Web3.js quanto o Ethers.js possuem ecossistemas robustos que podem ser utilizados para criar dApps extremamente rápidos. É incrível ver o quanto essas bibliotecas se expandiram e ainda estão em uso durante a minha pesquisa para este artigo. Espero que isso tenha fornecido algumas informações e deixado mais claro para você escolher a ferramenta certa para o trabalho.

Artigo original publicado por Godwin Alexander. Traduzido por Paulinho Giovannini.

Top comments (0)