Librerie API JavaScript
Per interagire con la blockchain Ethereum (ad esempio leggere i dati della blockchain e/o inviare transazioni alla rete), una web app deve connettersi a un nodo Ethereum.
A questo scopo, ogni client Ethereum implementa la specifica JSON-RPC, così che ci sia un set uniforme di endpoint a cui le applicazioni possono fare riferimento.
Se desideri utilizzare JavaScript per connetterti a un nodo Ethereum, puoi usare Javascript vanilla, ma tieni presente che ci sono già molte librerie all'interno dell'ecosistema che possono facilitarti la vita. Con queste librerie, gli sviluppatori possono scrivere metodi a una riga intuitivi per inizializzare le richieste RPC JSON (under the hood) che interagiscono con Ethereum.
Prerequisiti
Potrebbe essere conoscere non solo Javascript ma anche lo stack di Ethereum ei client di Ethereum.
Perché usare una libreria?
Queste librerie eliminano buona parte della complessità legata al dover interagire direttamente con un nodo Ethereum. Forniscono inoltre funzioni di utilità (ad esempio conversione da ETH a Gwei) in modo da ridurre il tempo necessario per districarsi tra le complessità dei client Ethereum e potersi concentrare sulle funzionalità uniche dell'applicazione.
Caratteristiche della libreria
Connettersi ai nodi Ethereum
Utilizzando i provider, queste librerie consentono di connettersi a Ethereum e leggerne i dati, tramite JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask.
Esempio Ethers
1// Un Web3Provider esegue il wrapping di un provider Web3 standard, che è2// ciò che Metamask inserisce come window.ethereum in ogni pagina3const provider = new ethers.providers.eb3Provider(window.ethereum)45// Il plugin Metamask permette anche di firmare le transazioni per6// inviare ether e pagare per cambiare stato all'interno della blockchain.7// Per questo, abbiamo bisogno del firmatario dell'account...8const signer = provider.getSigner()9Copia
Esempio Web3js
1var web3 = new Web3("http://localhost:8545")2// o3var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))45// cambiamento di provider6web3.etProvider("ws://localhost:8546")7// o8web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))910// Uso del provider IPC in node.js11var net = require("net")12var web3 = new Web3("/Users/myuser/Library/Ethereum/geth. pc", net) // mac os path13// o14var web3 = new Web3(15 new Web3.providers.pcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)16) // percorso MacOS17// in Windows il percorso è: "\\\\.\\pipe\\geth.ipc"18// in Linux il percorso è: "/users/myuser/.ethereum/geth.ipc"Web319Mostra tuttoCopia
Una volta eseguita la configurazione, sarà possibile interrogare la blockchain per avere:
- numeri di blocco
- stime del carburante
- eventi Smart Contract
- ID di rete
- e molto altro...
Funzionalità del portafoglio
Queste librerie offrono le funzionalità per creare portafogli, gestire chiavi e firmare transazioni.
Ecco un esempio da Ethers
1// Creazione di un'istanza di portafoglio da un mnemonico...2mnemonic =3 "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"4walletMnemonic = Wallet.fromMnemonic(mnemonic)56// ...oppure da una chiave privata7walletPrivateKey = new Wallet(walletMnemonic.privateKey)89walletMnemonic.address === walletPrivateKey.address10// true1112// L'indirizzo come promessa per l'API del firmatario13walletMnemonic.getAddress()14// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }1516// Un indirizzo di pPortafoglio è disponibile anche in modo sincrono17walletMnemonic.address18// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'1920// I componenti crittografici interni21walletMnemonic.privateKey22// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'23walletMnemonic.publicKey24// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'2526// Il mnemonico del portafoglio27walletMnemonic.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: un portafoglio creato con una chiave personale35// non ha un mnemonico (la derivazione lo impedisce)36walletPrivateKey.mnemonic37// null3839// Firma di un messaggio40walletMnemonic.signMessage("Hello World")41// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }4243tx = {44 to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",45 value: utils.parseEther("1.0"),46}4748// Firma di una transazione49walletMnemonic.signTransaction(tx)50// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }5152// Il metodo di connessione restituisce una nuova istanza del53// portafoglio connesso a un provider54wallet = walletMnemonic.connect(provider)5556// Query sulla rete57wallet.getBalance()58// { Promise: { BigNumber: "42" } }59wallet.getTransactionCount()60// { Promise: 0 }6162// Invio di ether63wallet.sendTransaction(tx)64CONTEXTREQUEST65Mostra tuttoCopia
Consulta la documentazione completa
Una volta eseguita la configurazione, sarà possibile:
- creare account
- inviare transazioni
- firmare transazioni
- e molto altro...
Interagire con le funzioni degli Smart Contract
Le librerie client Javascript consentono a un'applicazione di chiamare le funzioni degli Smart Contract leggendo l'ABI ( Application Binary Interface) di un contratto compilato.
L'ABI spiega essenzialmente le funzioni del contratto in un formato JSON e consente di utilizzarlo come un normale oggetto JavaScript.
Quindi il seguente contratto di 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 evento Event2(uint indexed b, bytes32 c);1011 function foo(uint b, bytes32 c) returns(address) {12 Event(b, c);13 return d;14 }15}16Mostra tuttoCopia
Si tradurrebbe nel seguente 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 "stateMutabilità":"non payable",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}]25Mostra tuttoCopia
Ciò significa che è possibile:
- Inviare una transazione allo Smart Contract ed eseguirne il metodo
- Eseguire una chiamata per stimare quanto carburante servirà per eseguire un metodo nell'EVM
- Distribuire un contratto
- E molto altro...
Funzioni di utilità
Le funzioni di utilità forniscono pratiche scorciatoie che facilitano un po' la programmazione con Ethereum.
I valori ETH sono in Wei per default. 1 ETH = 1.000.000.000.000.000 WEI, cioè veramente tante cifre! web3.utils.toWei
converte ether in Wei.
E in ethers funziona così:
1// Per ottenere il saldo di un account (per indirizzo o nome ENS)2balance = await provider.getBalance("ethers.eth")3// { BigNumber: "2337132817842795605" }45// Spesso è necessario formattare l'output per l'utente6// che preferisce vedere i valori in ether anziché in wei7ethers.utils.formatEther(balance)8// '2.337132817842795605'9Copia
Librerie disponibili
Web3.js - API JavaScript Ethereum
Ethers.js - Implementazione completa del portafoglio di Ethereum e utilità in JavaScript e TypeScript
The Graph - Protocollo per indicizzare i dati Ethereum e IPFS ed eseguire query con GraphQL
light.js - Libreria JavaScript reattiva di alto livello, ottimizzata per i light client
Web3-wrapper - Alternativa Typescript a Web3.js
Alchemyweb3 - Wrapper per Web3.js con nuovi tentativi automatici e API migliorate.
Letture consigliate
Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!
Argomenti correlati
Tutorial correlati
- Set up Web3js to use the Ethereum blockchain in Javascript – Istruzioni per impostare web3.js in un progetto.
- Calling a Smart Contract from JavaScript – Usando il token Dai, impara a chiamare le funzioni dei contratti con JavaScript
- Sending transactions using web3 and Alchemy – Istruzioni passo passo per l'invio di transazioni dal backend.