Librerie API JavaScript
Affinché un'app web possa interagire con la blockchain di Ethereum (ovvero, leggere i dati della blockchain e/o inviare transazioni alla rete), deve connettersi a un nodo Ethereum.
A questo scopo, ogni client Ethereum implementa la specifica JSON-RPC, in modo che vi sia un insieme uniforme di metodi su cui le applicazioni possono fare affidamento.
Se desideri utilizzare JavaScript per connetterti a un nodo Ethereum, è possibile utilizzare JavaScript puro, ma all'interno dell'ecosistema esistono diverse librerie di utilità che rendono l'operazione molto più semplice. Con queste librerie, gli sviluppatori possono scrivere metodi intuitivi di una sola riga per inizializzare le richieste JSON-RPC (internamente) che interagiscono con Ethereum.
Tieni presente che da The Merge, per eseguire un nodo sono necessari due software Ethereum connessi: un client di esecuzione e un client di consenso. Assicurati che il tuo nodo includa sia un client di esecuzione che uno di consenso. Se il tuo nodo non si trova sulla tua macchina locale (ad es. il tuo nodo è in esecuzione su un'istanza AWS), aggiorna di conseguenza gli indirizzi IP nel tutorial. Per maggiori informazioni, consulta la nostra pagina sull'esecuzione di un nodo.
Prerequisiti
Oltre a comprendere JavaScript, potrebbe essere utile comprendere lo stack di Ethereum e i client Ethereum.
Perché usare una libreria?
Queste librerie astraggono gran parte della complessità dell'interazione diretta con un nodo Ethereum. Forniscono inoltre funzioni di utilità (ad es. la conversione di ETH in Gwei) in modo che, come sviluppatore, tu possa dedicare meno tempo ad affrontare le complessità dei client Ethereum e più tempo a concentrarti sulle funzionalità uniche della tua applicazione.
Funzionalità delle librerie
Connettersi ai nodi Ethereum
Utilizzando i provider, queste librerie ti consentono di connetterti a Ethereum e leggerne i dati, che sia tramite JSON-RPC, Infura, Etherscan, Alchemy o MetaMask.
Attenzione: Web3.js è stata archiviata il 4 marzo 2025. Leggi l'annuncio (opens in a new tab). Prendi in considerazione l'utilizzo di librerie alternative come ethers.js (opens in a new tab) o viem (opens in a new tab) per i nuovi progetti.
Esempio con Ethers
// Un BrowserProvider avvolge un provider Web3 standard, che è
// ciò che MetaMask inietta come window.ethereum in ogni pagina
const provider = new ethers.BrowserProvider(window.ethereum)
// Il plugin MetaMask consente anche di firmare transazioni per
// inviare ether e pagare per cambiare lo stato all'interno della blockchain.
// Per questo, abbiamo bisogno del signer dell'account...
const signer = provider.getSigner()
Esempio con Web3js
var web3 = new Web3("http://localhost:8545")
// or
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))
// cambiare provider
web3.setProvider("ws://localhost:8546")
// or
web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))
// Usare il provider IPC in node.js
var net = require("net")
var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // percorso mac os
// or
var web3 = new Web3(
new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)
) // percorso mac os
// su windows il percorso è: "\\\\.\\pipe\\geth.ipc"
// su linux il percorso è: "/users/myuser/.ethereum/geth.ipc"
Una volta configurato, sarai in grado di interrogare la blockchain per:
- numeri di blocco
- stime del gas
- eventi degli smart contract
- ID di rete
- e altro ancora...
Funzionalità del portafoglio
Queste librerie ti offrono funzionalità per creare portafogli, gestire chiavi e firmare transazioni.
Ecco un esempio da Ethers
// Crea un'istanza del portafoglio da una frase mnemonica...
mnemonic =
"announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"
walletMnemonic = Wallet.fromPhrase(mnemonic)
// ...o da una chiave privata
walletPrivateKey = new Wallet(walletMnemonic.privateKey)
walletMnemonic.address === walletPrivateKey.address
// true
// L'indirizzo come Promise secondo l'API del Signer
walletMnemonic.getAddress()
// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }
// Un indirizzo del portafoglio è disponibile anche in modo sincrono
walletMnemonic.address
// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'
// I componenti crittografici interni
walletMnemonic.privateKey
// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'
walletMnemonic.publicKey
// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'
// La frase mnemonica del portafoglio
walletMnemonic.mnemonic
// {
// locale: 'en',
// path: 'm/44\'/60\'/0\'/0/0',
// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol'
// }
// Nota: Un portafoglio creato con una chiave privata non
// ha una frase mnemonica (la derivazione lo impedisce)
walletPrivateKey.mnemonic
// null
// Firma di un messaggio
walletMnemonic.signMessage("Hello World")
// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }
tx = {
to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
value: utils.parseEther("1.0"),
}
// Firma di una transazione
walletMnemonic.signTransaction(tx)
// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }
// Il metodo connect restituisce una nuova istanza del
// Portafoglio connesso a un provider
wallet = walletMnemonic.connect(provider)
// Interrogazione della rete
wallet.getBalance()
// { Promise: { BigNumber: "42" } }
wallet.getTransactionCount()
// { Promise: 0 }
// Invio di ether
wallet.sendTransaction(tx)
Leggi la documentazione completa (opens in a new tab)
Una volta configurato, sarai in grado di:
- creare account
- inviare transazioni
- firmare transazioni
- e altro ancora...
Interagire con le funzioni degli smart contract
Le librerie client JavaScript consentono alla tua applicazione di chiamare le funzioni degli smart contract leggendo l'Application Binary Interface (ABI) di un contratto compilato.
L'ABI spiega essenzialmente le funzioni del contratto in un formato JSON e ti consente di utilizzarlo come un normale oggetto JavaScript.
Quindi il seguente contratto Solidity:
contract Test {
uint a;
address d = 0x12345678901234567890123456789012;
constructor(uint testInt) { a = testInt;}
event Event(uint indexed b, bytes32 c);
event Event2(uint indexed b, bytes32 c);
function foo(uint b, bytes32 c) returns(address) {
Event(b, c);
return d;
}
}
Risulterebbe nel seguente JSON:
[{
"type":"constructor",
"payable":false,
"stateMutability":"nonpayable"
"inputs":[{"name":"testInt","type":"uint256"}],
},{
"type":"function",
"name":"foo",
"constant":false,
"payable":false,
"stateMutability":"nonpayable",
"inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}],
"outputs":[{"name":"","type":"address"}]
},{
"type":"event",
"name":"Event",
"inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}],
"anonymous":false
},{
"type":"event",
"name":"Event2",
"inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],
"anonymous":false
}]
Questo significa che puoi:
- Inviare una transazione allo smart contract ed eseguire il suo metodo
- Chiamare per stimare il gas che richiederà l'esecuzione di un metodo quando eseguito nell'EVM
- Distribuire un contratto
- E altro ancora...
Funzioni di utilità
Le funzioni di utilità ti offrono comode scorciatoie che rendono la costruzione con Ethereum un po' più semplice.
I valori in ETH sono in Wei per impostazione predefinita. 1 ETH = 1.000.000.000.000.000.000 WEI – questo significa che hai a che fare con molti numeri! web3.utils.toWei converte gli ether in Wei per te.
E in Ethers si presenta così:
// Ottieni il saldo di un account (tramite indirizzo o nome ENS)
balance = await provider.getBalance("ethers.eth")
// { BigNumber: "2337132817842795605" }
// Spesso sarà necessario formattare l'output per l'utente
// che preferisce vedere i valori in ether (invece che in Wei)
ethers.utils.formatEther(balance)
// '2.337132817842795605'
- Funzioni di utilità di Web3js (opens in a new tab)
- Funzioni di utilità di Ethers (opens in a new tab)
Librerie disponibili
Web3.js - API JavaScript di Ethereum.
Ethers.js - Implementazione completa del portafoglio Ethereum e utilità in JavaScript e TypeScript.
- Home di Ethers.js (opens in a new tab)
- Documentazione (opens in a new tab)
- GitHub (opens in a new tab)
The Graph - Un protocollo per l'indicizzazione dei dati di Ethereum e IPFS e per interrogarli utilizzando GraphQL.
- The Graph (opens in a new tab)
- Graph Explorer (opens in a new tab)
- Documentazione (opens in a new tab)
- GitHub (opens in a new tab)
- Discord (opens in a new tab)
Alchemy SDK - Wrapper per Ethers.js con API migliorate.
viem - Interfaccia TypeScript per Ethereum.
Codex - API di dati blockchain arricchiti e in tempo reale su dozzine di catene.
- Documentazione (opens in a new tab)
- Explorer (opens in a new tab)
- GitHub (opens in a new tab)
- Discord (opens in a new tab)
Drift - Meta-libreria TypeScript con caching integrato, hook e mock di test.
Letture consigliate
Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!
Argomenti correlati
Tutorial correlati
- Configurare Web3js per usare la blockchain di Ethereum in JavaScript – Istruzioni per configurare web3.js nel tuo progetto.
- Chiamare uno smart contract da JavaScript – Usando il token DAI, scopri come chiamare le funzioni dei contratti usando JavaScript.
- Inviare transazioni usando Web3 e Alchemy – Guida passo passo per l'invio di transazioni dal backend.
Tutorial: API JavaScript e WebSocket su Ethereum
- Usare i WebSocket – Come usare i WebSocket con Alchemy per iscriversi agli eventi di Ethereum ed effettuare richieste JSON-RPC in tempo reale.