Vai al contenuto principale
Change page

Librerie API JavaScript

Ultima modifica: @Pierlu_be(opens in a new tab), 15 novembre 2023

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.

Per questo scopo, ogni client di Ethereum implementa la specifica JSON-RPC, quindi esiste una serie uniforme di metodi su cui possono basarsi le applicazioni.

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.

Si noti che, a partire da La Fusione, per eseguire un nodo occorrono due elementi di software di Ethereum connessi (un client di esecuzione e un client di consenso). Assicurati che il tuo nodo includa sia un client di esecuzione che un client di consenso. Se il tuo nodo non si trova sulla tua macchina locale (ad es. se è in esecuzione su un'istanza AWS), occorrerà aggiornare di conseguenza gli indirizzi IP nel tutorial. Per ulteriori informazioni, consulta la nostra pagina sull'esecuzione di un nodo.

Prerequisiti

Potrebbe essere utile conoscere non solo Javascript ma anche lo stack di Ethereum e i client di Ethereum.

Perché usare una libreria?

Queste librerie eliminano buona parte della complessità legata al dover interagire direttamente con un nodo Ethereum. Assicurano inoltre funzioni di utilità (ad esempio la conversione da ETH a Gwei) per fare in modo che gli sviluppatori debbano dedidare meno tempo alle complessità dei client Ethereum e più tempo alle funzionalità specifiche 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 da Ethers

1// Un Web3Provider avvolge un fornitore standard di Web3, che è
2// ciò che MetaMask inseriscie come window.ethereum in ogni pagina
3const provider = new ethers.providers.Web3Provider(window.ethereum)
4
5// Il plugin di MetaMask consente anche di firmare le transazioni per
6// inviare ether e pagare per modificare lo stato nella blockchain.
7// Per questo, abbiamo bisogno del firmatario dell'account...
8const signer = provider.getSigner()
Copia

Esempio da Web3js

1var web3 = new Web3("http://localhost:8545")
2// o
3var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))
4
5// cambiamento di provider
6web3.setProvider("ws://localhost:8546")
7// o
8web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))
9
10// Uso del provider IPC in node.js
11var net = require("net")
12var web3 = new Web3("/Users/myuser/Library/Ethereum/geth. pc", net) // mac os path
13// o
14var web3 = new Web3(
15 new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)
16) // percorso MacOS
17// in Windows il percorso è: "\\\\.\\pipe\\geth.ipc"
18// in Linux il percorso è: "/users/myuser/.ethereum/geth.ipc"Web3
Mostra tutto
Copia

Una volta eseguita la configurazione, sarà possibile interrogare la blockchain per avere:

  • numeri di blocco
  • stime del gas
  • eventi del contratto intelligenti
  • 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)
5
6// ...oppure da una chiave privata
7walletPrivateKey = new Wallet(walletMnemonic.privateKey)
8
9walletMnemonic.address === walletPrivateKey.address
10// true
11
12// L'indirizzo come promessa per l'API del firmatario
13walletMnemonic.getAddress()
14// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }
15
16// Un indirizzo di pPortafoglio è disponibile anche in modo sincrono
17walletMnemonic.address
18// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'
19
20// I componenti crittografici interni
21walletMnemonic.privateKey
22// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'
23walletMnemonic.publicKey
24// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'
25
26// Il mnemonico del portafoglio
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: un portafoglio creato con una chiave personale
35// non ha un mnemonico (la derivazione lo impedisce)
36walletPrivateKey.mnemonic
37// null
38
39// Firma di un messaggio
40walletMnemonic.signMessage("Hello World")
41// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }
42
43tx = {
44 to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
45 value: utils.parseEther("1.0"),
46}
47
48// Firma di una transazione
49walletMnemonic.signTransaction(tx)
50// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }
51
52// Il metodo di connessione restituisce una nuova istanza del
53// portafoglio connesso a un provider
54wallet = walletMnemonic.connect(provider)
55
56// Query sulla rete
57wallet.getBalance()
58// { Promise: { BigNumber: "42" } }
59wallet.getTransactionCount()
60// { Promise: 0 }
61
62// Invio di ether
63wallet.sendTransaction(tx)
64CONTEXTREQUEST
Mostra tutto
Copia

Consulta la documentazione completa(opens in a new tab)

Una volta eseguita la configurazione, sarà possibile:

  • creare conti
  • inviare transazioni
  • firmare transazioni
  • e molto altro...

Interagire con le funzioni dei contratti intelligenti

Le librerie del client di JavaScript consentono alla tua applicazione di chiamare le funzioni dei contratti intelligenti, leggendo l'Interfaccia Binaria dell'Applicazione (ABI) 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;
4
5 function Test(uint testInt) { a = testInt;}
6
7 event Event(uint indexed b, bytes32 c);
8
9 evento 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}
Mostra tutto
Copia

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":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}]
Mostra tutto
Copia

Ciò significa che è possibile:

  • Invia una transazione al contratto intelligente ed eseguine il metodo
  • Chiamarla per stimare il gas che l'esecuzione di un metodo richiederà, all'esecuzione nell'EVM
  • Distribuire un contratto
  • E molto altro...

Funzioni di utilità

Le funzioni di utilità forniscono pratiche scorciatoie che rendono la programmazione con Ethereum un po' più semplice.

I valori ETH sono in Wei per default. 1 ETH = 1.000.000.000.000.000.000 WEI, un numero di cifre veramente elevato! 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" }
4
5// Spesso è necessario formattare l'output per l'utente
6// che preferisce vedere i valori in ether anziché in wei
7ethers.utils.formatEther(balance)
8// '2.337132817842795605'
Copia

Librerie disponibili

Web3.js - API JavaScript Ethereum

Ethers.js - Implementazione completa del portafoglio Ethereum e delle utility 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

Alchemy NFT API - API per recuperare i dati degli NFT, inclusi proprietà, attributi dei metadati e altro

viem - Interfaccia TypeScript per Ethereum.

Letture consigliate

Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!

Questo articolo è stato utile?