Vai al contenuto principale

Aiuta ad aggiornare questa pagina

🌏

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

Traduci la pagina
Visualizza in inglese

Nessun bug qui!🐛

Questa pagina non è stata tradotta. Per il momento, è stata intenzionalmente lasciata in inglese.

Chiamare uno Smart Contract da JavaScript

transazioni
frontend
JavaScript
web3.js
Principiante
✍jdourlens
📚EthereumDev
📆19 aprile 2020
⏱️3 minuti letti
Autore suggerimento 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

In questo tutorial vedremo come chiamare una funzione di Smart Contract da JavaScript. Prima viene letto lo stato di uno Smart Contract (ad esempio il saldo di un titolare ERC20), poi modificheremo lo stato della blockchain effettuando un trasferimento di token. Dovresti avere già famigliarità con la configurazione di un ambiente JS per interagire con la blockchain.

Per questi esempi utilizzeremo il token DAI, a scopo di test creeremo una diramazione della blockchain usando ganache-cli e sbloccheremo un indirizzo che ha già molti DAI:

ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81

Per interagire con uno Smart Contract ci servirà il suo indirizzo e l'ABI:

1const ERC20TransferABI = [
2 {
3 constant: false,
4 inputs: [
5 {
6 name: "_to",
7 type: "address",
8 },
9 {
10 name: "_value",
11 type: "uint256",
12 },
13 ],
14 name: "transfer",
15 outputs: [
16 {
17 name: "",
18 type: "bool",
19 },
20 ],
21 payable: false,
22 stateMutability: "nonpayable",
23 type: "function",
24 },
25 {
26 constant: true,
27 inputs: [
28 {
29 name: "_owner",
30 type: "address",
31 },
32 ],
33 name: "balanceOf",
34 outputs: [
35 {
36 name: "balance",
37 type: "uint256",
38 },
39 ],
40 payable: false,
41 stateMutability: "view",
42 type: "function",
43 },
44]
45
46const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
47
Mostra tutto
📋 Copia

Per questo progetto abbiamo ridotto l'ABI completa di ERC20 tenendo solo le funzioni balanceOf e transfer, ma potete trovare qui l'ABI di ERC20 completa.

Poi dobbiamo istanziare il nostro Smart Contract:

1const web3 = new Web3("http://localhost:8545")
2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)
4
📋 Copia

Configuriamo inoltre due indirizzi:

  • quello che riceverà il trasferimento e
  • quello che abbiamo già sbloccato che lo invierà:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
3
📋 Copia

Nella prossima parte chiameremo la funzione balanceOf per recuperare l'importo corrente di token posseduto da entrambi gli indirizzi.

Call: lettura del valore da uno Smart Contract

Il primo esempio chiamerà un metodo di una "costante" e ne eseguirà il metodo dello Smart Contract nell'EVM senza inviare alcuna transazione. Per questo leggeremo il saldo di ERC20 di un indirizzo. Leggi il nostro articolo sui token ERC20.

Puoi accedere ai metodi di uno smart contract istanziato per cui hai fornito l'ABI come segue: yourContract.methods.methodname. Usando la funzione call riceverai il risultato dell'esecuzione della funzione.

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("An error occured", err)
4 return
5 }
6 console.log("The balance is: ", res)
7})
8
📋 Copia

Ricorda che il ERC20 DAI ha 18 cifre decimali, che significa che devi rimuovere 18 zeri per ottenere l'importo corretto. I valori uint256 sono restituiti come stringhe, poiché JavaScript non gestisce i grandi valori numerici. Se non sai come gestire i grandi numeri in JS consulta il nostro tutorial su bignumber.js.

Send: invio di una transazione a una funzione di Smart Contract

Per il secondo esempio chiamiamo la funzione di trasferimento dello Smart Contract DAI per inviare 10 DAI al nostro secondo indirizzo. La funzione di trasferimento accetta due parametri: l'indirizzo del destinatario e l'importo di token da trasferire:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("An error occured", err)
6 return
7 }
8 console.log("Hash of the transaction: " + res)
9 })
10
Mostra tutto
📋 Copia

La funzione di chiamata restituisce l'hash della transazione di cui verrà eseguito il mining nella blockchain. Su Ethereum, gli hash delle transazioni sono prevedibili; è così che possiamo ottenere l'hash della transazione prima che questa venga eseguita (vedi qui come sono calcolati gli hash).

Poiché la funzione non fa altro che inviare la transazione alla blockchain, non possiamo vedere il risultato finché non sappiamo quando ne viene eseguito il mining e quando viene inclusa nella blockchain. Nel prossimo tutorial impareremo come attendere l'esecuzione di una transazione sulla blockchain conoscendone l'hash.

Ultima modifica: , Invalid DateTime
Modifica la pagina

Questa pagina è stata utile?