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)
}
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.
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 ();
- 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();
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 classeWeb3
. - Carteira: O Ethers.js usa a classe
Wallet
para criar uma nova carteira ou importar uma existente, enquanto o Web3.js usa o objetoeth.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çãoeth.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çãoweb3.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, comoweb3.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)