Chiamare un contratto intelligente da JavaScript
In questo tutorial vedremo come chiamare una funzione di un contratto intelligente da JavaScript. Prima leggeremo lo stato di un contratto intelligente (ad es., il saldo di un possessore di ERC20), poi modificheremo lo stato della blockchain effettuando un trasferimento di token. Dovresti avere già familiarità con la configurazione di un ambiente JS per interagire con la blockchain.
Per questo esempio giocheremo con il token DAI, a scopo di test effettueremo una biforcazione 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 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81Per interagire con un contratto intelligente avremo bisogno del suo indirizzo e dell'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]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"Mostra tuttoPer questo progetto abbiamo ridotto l'ABI completa dell'ERC20 per mantenere solo le funzioni balanceOf e transfer, ma puoi trovare l'ABI completa dell'ERC20 qui (opens in a new tab).
Dobbiamo quindi istanziare il nostro contratto intelligente:
1const web3 = new Web3("http://localhost:8545")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)Imposteremo anche due indirizzi:
- quello che riceverà il trasferimento e
- quello che abbiamo già sbloccato che lo invierà:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"Nella prossima parte chiameremo la funzione balanceOf per recuperare la quantità attuale di token posseduta da entrambi gli indirizzi.
Call: Leggere un valore da un contratto intelligente
Il primo esempio chiamerà un metodo "costante" ed eseguirà il suo metodo del contratto intelligente nella EVM senza inviare alcuna transazione. Per questo leggeremo il saldo ERC20 di un indirizzo. Leggi il nostro articolo sui token ERC20.
Puoi accedere ai metodi di un contratto intelligente istanziato per cui hai fornito l'ABI nel modo seguente: 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 occurred", err)4 return5 }6 console.log("The balance is: ", res)7})Ricorda che il DAI ERC20 ha 18 decimali, il che significa che devi rimuovere 18 zeri per ottenere l'importo corretto. Gli uint256 vengono restituiti come stringhe poiché JavaScript non gestisce valori numerici grandi. Se non sei sicuro di come gestire i grandi numeri in JS, dai un'occhiata al nostro tutorial su bignumber.js (opens in a new tab).
Send: Inviare una transazione a una funzione di un contratto intelligente
Per il secondo esempio chiameremo la funzione di trasferimento del contratto intelligente DAI per inviare 10 DAI al nostro secondo indirizzo. La funzione di trasferimento accetta due parametri: l'indirizzo del destinatario e la quantità di token da trasferire:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("An error occurred", err)6 return7 }8 console.log("Hash of the transaction: " + res)9 })Mostra tuttoLa funzione call restituisce l'hash della transazione che verrà minata nella blockchain. Su Ethereum, gli hash delle transazioni sono prevedibili: ecco come possiamo ottenere l'hash della transazione prima che venga eseguita (scopri come vengono calcolati gli hash qui (opens in a new tab)).
Poiché la funzione invia solo la transazione alla blockchain, non possiamo vedere il risultato finché non sappiamo quando viene minata e inclusa nella blockchain. Nel prossimo tutorial impareremo come attendere che una transazione venga eseguita sulla blockchain conoscendone l'hash (opens in a new tab).
Ultimo aggiornamento della pagina: 21 ottobre 2025