Vai al contenuto principale

Chiamare un contratto intelligente da JavaScript

transazionifrontendJavaScriptweb3.js
Principiante
jdourlens
EthereumDev(opens in a new tab)
19 aprile 2020
3 minuti letti minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

In questo tutorial vedremo come chiamare la funzione di un Contratto Intelligente da JavaScript. Prima, bisogna leggere lo stato di un contratto intelligente (es. il saldo di un titolare di ERC20), poi modificheremo lo stato della blockchain effettuando un trasferimento di token. Dovresti esser già familiare con la configurazione di un ambiente JS per interagire con la blockchain.

Per questo esempio, avremo a che fare con il token DAI e, per scopi di testing biforcheremo la blockchain usando ganache-cli e sbloccheremo un indirizzo che contiene già molti DAI:

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

Per interagire con un contratto intelligente, avremo bisogno del suo indirizzo e 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"
Mostra tutto
Copia

Per questo progetto abbiamo ridotto l'ABI completa dell'ERC20 per mantenere solo la funzione balancecOf e transfer, ma puoi trovare l'ABI completa dell'ERC20 qui(opens in a new tab).

Poi dobbiamo istanziare il nostro contratto intelligente:

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

Inoltre, configureremo due indirizzi:

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

Nella prossima parte, chiameremo la funzione balanceOf per recuperare l'importo corrente dei token posseduti da entrambi gli indirizzi.

Chiamata: Leggere il valore da un contratto intelligente

Il primo esempio chiamerà un metodo "constant" ed eseguirà il metodo del suo contratto intelligente 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 un contratto intelligente 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})
Copia

Ricorda che l'ERC20 di DAI contiene 18 cifre decimali, il 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(opens in a new tab).

Invio: Inviare una transazione alla funzione di un contratto intelligente

Per il secondo esempio, chiameremo la funzione di trasferimento del contratto intelligente di 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 })
Mostra tutto
Copia

La funzione di chiamata restituiscec l'hash dedlla transazione che sarà minato nella blockchain. Su Ethereum, gli hash della transazione sono prevedibili, così possiamo ottenere l'hash della transazione prima che sia eseguita (scopri qui come sono calcolati gli hash(opens in a new tab)).

Poiché la funzione invia soltanto la transazione alla blockchain, non possiamo vedere il risultato finché non sappiamo quando è minato e incluso nella blockchain. Nel prossimo tutorial, impareremo come attendedre l'esecuzione di una transazione, conoscendone l'hash(opens in a new tab).

Ultima modifica: @pettinarip(opens in a new tab), 23 novembre 2023

Questo tutorial è stato utile?