Bibliotecas de API JavaScript
Para que um aplicativo web interaja com a cadeia de blocos Ethereum (ou seja, leia os dados da cadeia de blocos e/ou envie transações para a rede), ele deve se conectar a um nó Ethereum.
Para isso, cada cliente Ethereum implementa a especificação JSON-RPC, então há um conjunto uniforme de endpoints com os quais os aplicativos podem contar.
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.
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 meio de JSON-RPC, INFURA, Etherscan, Alquimia ou MetaMask.
Exemplo de Ethers
1// A Web3Provider wraps a standard Web3 provider, which is2// what MetaMask injects as window.ethereum into each page3const provider = new ethers.providers.Web3Provider(window.ethereum)45// The MetaMask plugin also allows signing transactions to6// send ether and pay to change state within the blockchain.7// Para isso, precisamos do signatário da conta...8const signer = provider.getSigner()9Copiar
Exemplo Web3js
1var web3 = new Web3("http://localhost:8545")2// ou3var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))45// mudar provedor6web3.etProvider("ws://localhost:8546")7// ou8web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))910// Usando o provedor IPC em node.js11var net = require("net")12var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // caminho do mac os13// ou14var web3 = new Web3(15 new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)16) // Caminho mac os17// no windows o caminho é: "\\\\.\\pipe\\geth.ipc"18// no linux o caminho é: "/users/myuser/.ethereum/geth.ipc"19Exibir tudoCopiar
Uma vez configurado, você poderá consultar a cadeia de blocos 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.
Aqui estão 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)56// ...ou de uma chave privada7walletPrivateKey = new Wallet(walletMnemonic.privateKey)89walletMnemonic.address === walletPrivateKey.address10// true1112// Endereço como uma Promise para Signer API13walletMnemonic.getAddress()14// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }1516// Um endereço da carteira também está disponível de forma síncrona17walletMnemonic.address18// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'1920// Componentes internos criptográficos21walletMnemonic.privateKey22// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'23walletMnemonic.publicKey24// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'2526// O mnemônico da carteira27walletMnemonic.mnemonic28// {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// }3334// Nota: Uma carteira criada com chave privada não possui35// um mnemônico (a derivação previne isso)36walletPrivateKey.mnemonic37// null3839// Assinando uma mensagem40walletMnemonic.signMessage("Hello World")41// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }4243tx = {44 to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",45 value: utils.parseEther("1.0"),46}4748// Assinando uma transação49walletMnemonic.signTransaction(tx)50// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }5152// O método connect retorna uma nova instância da carteira conectada a um provedor53wallet = walletMnemonic.connect(provider)5455// Consultando a rede56wallet.getBalance()57// { Promise: { BigNumber: "42" } }58wallet.getTransactionCount()59// { Promise: 0 }6061// Enviando ether62wallet.sendTransaction(tx)63Exibir tudoCopiar
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
JavaScript client libraries allow your application to call smart contract functions by reading the Application Binary Interface (ABI) of a compiled contract.
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;45 function Test(uint testInt) { a = testInt;}67 event Event(uint indexed b, bytes32 c);89 event Event2(uint indexed b, bytes32 c);1011 function foo(uint b, bytes32 c) returns(address) {12 Event(b, c);13 return d;14 }15}16Exibir tudoCopiar
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":false19 },{20 "type":"event",21 "name":"Event2",22 "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],23 "anonymous":false24}]25Exibir tudoCopiar
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 no 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" }45// Muitas vezes você precisará formatar a saída para o usuário6// que preferem ver valores no ether (em vez de wei)7ethers.utils.formatEther(balance)8// '2.337132817842795605'9Copiar
- Funções utilitárias da Web3js(opens in a new tab)
- Funções utilitárias da EthersJs(opens in a new tab)
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.
- The Graph(opens in a new tab)
- Graph Explorer(opens in a new tab)
- Documentação(opens in a new tab)
- GitHub(opens in a new tab)
- Discord(opens in a new tab)
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 for fetching NFT data, including ownership, metadata attributes and more.
Leitura adicional
Conhece um recurso da comunidade que ajudou você? Edite esta página e adicione-o!
Tópicos relacionados
Tutoriais relacionados
- Set up Web3js to use the Ethereum blockchain in JavaScript – Instructions for getting web3.js set up in your project.
- Chamando um contrato inteligente do JavaScript – Usando o token do DAI, veja como os contratos de chamadas funcionam usando JavaScript.
- Enviando transações usando web3 e Alchemy – Passo a passo para enviar transações pelo backend.