Chiamare uno Smart Contract da JavaScript
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]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"47Mostra tuttoCopia
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")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)4Copia
Configuriamo inoltre due indirizzi:
- quello che riceverà il trasferimento e
- quello che abbiamo già sbloccato che lo invierà:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"3Copia
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 return5 }6 console.log("The balance is: ", res)7})8Copia
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.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("An error occured", err)6 return7 }8 console.log("Hash of the transaction: " + res)9 })10Mostra tuttoCopia
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.