Pular para o conteúdo principal
Change page

Bibliotecas de API JavaScript

Última edição: @iborba(opens in a new tab), 10 de outubro de 2023

Para que um aplicativo web interaja com a cadeia de blocos Ethereum (ou seja, leia os dados da blockchain e/ou envie transações para a rede), ele deve se conectar a um nó Ethereum.

Para esse propósito, cada cliente Ethereum implementa a especificação JSON-RPC, então há um conjunto uniforme de métodos com os quais os aplicativos podem conta.

Se você quiser usar JavaScript para se conectar a um nó Ethereum, é possível usar o JavaScript vanilla, mas existem várias bibliotecas convenientes dentro do ecossistema que tornam isso muito mais fácil. Com essas bibliotecas, desenvolvedores podem escrever métodos intuitivos, one-line para inicializar solicitações JSON RPC (sob o capô) que interagem com Ethereum.

Observe que, desde A Fusão (The Merge), duas partes conectadas do software Ethereum — um cliente de execução e um cliente de consenso — são necessárias para executar um nó. Certifique-se de que seu nó inclui tanto o cliente de execução quanto o consensual. Se o seu nó não estiver na sua máquina local (por exemplo, seu nó está sendo executado em uma instância da AWS) atualize os endereços IP no tutorial adequadamente. Para obter mais informações, veja nossa página no executando um nó.

Pré-requisitos

Além de entender o JavaScript, pode ser útil entender a pilha de Ethereum e clientes Ethereum.

Por que usar uma biblioteca?

Essas bibliotecas abstraem muito da complexidade de interagir diretamente com um nó Ethereum. Eles também fornecem funções de utilidade (por exemplo, Convertendo ETH para Gwei) para que como desenvolvedor, você possa passar menos tempo lidando com as complexidades de clientes da Ethereum e mais tempo focado na funcionalidade única do seu aplicativo.

Recursos da biblioteca

Conectar aos nós da Ethereum

Usando provedores, essas bibliotecas permitem que você se conecte à Ethereum e leia os seus dados, seja por JSON-RPC, INFURA, Etherscan, Alquimia ou MetaMask.

Exemplo de Ethers

1// A Web3Provider wraps a standard Web3 provider, which is
2// what MetaMask injects as window.ethereum into each page
3const provider = new ethers.providers.Web3Provider(window.ethereum)
4
5// The MetaMask plugin also allows signing transactions to
6// send ether and pay to change state within the blockchain.
7// Para isso, precisamos do signatário da conta...
8const signer = provider.getSigner()
Copiar

Exemplo de Web3js

1var web3 = new Web3("http://localhost:8545")
2// ou
3var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))
4
5// mudar provedor
6web3.etProvider("ws://localhost:8546")
7// ou
8web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))
9
10// Usando o provedor IPC em node.js
11var net = require("net")
12var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // caminho do mac os
13// ou
14var web3 = new Web3(
15 new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)
16) // Caminho mac os
17// no windows o caminho é: "\\\\.\\pipe\\geth.ipc"
18// no linux o caminho é: "/users/myuser/.ethereum/geth.ipc"
Exibir tudo
Copiar

Uma vez configurado, você poderá consultar a blockchain para:

  • numero de blocos
  • estimativas de gás
  • eventos de contratos inteligentes
  • id da rede
  • e mais...

Funcionalidade de carteira

Essas bibliotecas oferecem a funcionalidade de criar carteiras, gerenciar chaves e assinar transações.

Veja alguns exemplos de Ethers

1// Cria uma instância de carteira de um mnemonic...
2mnemonic =
3 "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"
4walletMnemonic = Wallet.fromMnemonic(mnemonic)
5
6// ...ou de uma chave privada
7walletPrivateKey = new Wallet(walletMnemonic.privateKey)
8
9walletMnemonic.address === walletPrivateKey.address
10// true
11
12// Endereço como uma Promise para Signer API
13walletMnemonic.getAddress()
14// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }
15
16// Um endereço da carteira também está disponível de forma síncrona
17walletMnemonic.address
18// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'
19
20// Componentes internos criptográficos
21walletMnemonic.privateKey
22// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'
23walletMnemonic.publicKey
24// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'
25
26// O mnemônico da carteira
27walletMnemonic.mnemonic
28// {
29// locale: 'en',
30// path: 'm/44\'/60\'/0\'/0/0',
31// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol'
32// }
33
34// Nota: Uma carteira criada com chave privada não possui
35// um mnemônico (a derivação previne isso)
36walletPrivateKey.mnemonic
37// null
38
39// Assinando uma mensagem
40walletMnemonic.signMessage("Hello World")
41// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }
42
43tx = {
44 to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
45 value: utils.parseEther("1.0"),
46}
47
48// Assinando uma transação
49walletMnemonic.signTransaction(tx)
50// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }
51
52// O método connect retorna uma nova instância da carteira conectada a um provedor
53wallet = walletMnemonic.connect(provider)
54
55// Consultando a rede
56wallet.getBalance()
57// { Promise: { BigNumber: "42" } }
58wallet.getTransactionCount()
59// { Promise: 0 }
60
61// Enviando ether
62wallet.sendTransaction(tx)
Exibir tudo
Copiar

Leia a documentação completa(opens in a new tab)

Uma vez configurado você será capaz de:

  • criar contas
  • enviar transações
  • assinar transações
  • e mais...

Interaja com funções de contrato inteligentes

As bibliotecas de clientes Javascript permitem que sua aplicação chame funções de contratos inteligentes lendo a Interface Binária da Aplicação (en: ABI, pt: IBA) de um contrato compilado.

O ABI essencialmente explica as funções do contrato em um formato JSON e permite que você use-o como um objeto JavaScript normal.

Então, o seguinte contrato de Solidity:

1contract Test {
2 uint a;
3 address d = 0x12345678901234567890123456789012;
4
5 function Test(uint testInt) { a = testInt;}
6
7 event Event(uint indexed b, bytes32 c);
8
9 event Event2(uint indexed b, bytes32 c);
10
11 function foo(uint b, bytes32 c) returns(address) {
12 Event(b, c);
13 return d;
14 }
15}
Exibir tudo
Copiar

Resultaria no seguinte JSON:

1[{
2 "type":"constructor",
3 "payable":false,
4 "stateMutability":"nonpayable"
5 "inputs":[{"name":"testInt","type":"uint256"}],
6 },{
7 "type":"function",
8 "name":"foo",
9 "constant":false,
10 "payable":false,
11 "stateMutability":"nonpayable",
12 "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}],
13 "outputs":[{"name":"","type":"address"}]
14 },{
15 "type":"event",
16 "name":"Event",
17 "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}],
18 "anonymous":false
19 },{
20 "type":"event",
21 "name":"Event2",
22 "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],
23 "anonymous":false
24}]
Exibir tudo
Copiar

Isso significa que você pode:

  • Enviar uma transação para o contrato inteligente e executar seu método
  • Estimar o gás que um método de execução consumirá quando executado na EVM
  • Implantar um contrato
  • E mais...

Funções utilitárias

Funções utilitárias lhe dão atalhos úteis que facilitam um pouco a construção com a Ethereum.

Os valores ETH estão em Wei por padrão. 1 ETH = 1.000.000.000.000.000.000 WEI – isso significa que você está lidando com muitos números! web3.utils.toWei converte ether para Wei pra você.

E em ethers fica assim:

1// Obtenha o saldo de uma conta (por endereço ou nome ENS)
2balance = await provider.getBalance("ethers.eth")
3// { BigNumber: "2337132817842795605" }
4
5// Muitas vezes você precisará formatar a saída para o usuário
6// que preferem ver valores no ether (em vez de wei)
7ethers.utils.formatEther(balance)
8// '2.337132817842795605'
Copiar

Bibliotecas disponíveis

Web3.js - API para Ethereum em JavaScript.

Ethers.js - Implementação completa de uma carteira Ethereum e utilidades em JavaScript e TypeScript.

The Graph - Um protocolo para indexação de dados de Ethereum e IPFS e sua consulta usando GraphQL.

light.js - Uma biblioteca em alto nível reativa em JS otimizada para clientes leves.

Web3-wrapper - Alternativa ao Web3.js em Typescript.

Alchemyweb3 - Wrapper em torno de Web3.js com tentativas automáticas e apis aprimoradas.

Alchemy NFT API - API para buscar dados NFT, incluindo propriedade, atributos de metadados e muito mais.

viem - Interface TypeScript para Ethereum.

Leitura adicional

Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!

Este artigo foi útil?