Aiuta ad aggiornare questa pagina

🌏

C'è una nuova versione di questa pagina, ma al momento è solo in inglese. Aiutaci a tradurre l'ultima versione.

Questa pagina è incompleta. Se conosci bene l'argomento, modificala e condividi un po' del tuo sapere.

Librerie API JavaScript

Ultima modifica: , Invalid DateTime
Edit page

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 pagina
3const provider = new ethers.providers.eb3Provider(window.ethereum)
4
5// Il plugin Metamask permette anche di firmare le transazioni per
6// inviare ether e pagare per cambiare stato all'interno della blockchain.
7// Per questo, abbiamo bisogno del firmatario dell'account...
8const signer = provider.getSigner()
9
📋 Copia

Esempio 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.etProvider("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.pcProvider("/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
19
Mostra tutto
📋 Copia

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)
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
65
Mostra tutto
📋 Copia

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;
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}
16
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}]
25
Mostra tutto
📋 Copia

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" }
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'
9
📋 Copia

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!