Salt la conținutul principal

Apelarea unui contract inteligent din JavaScript

tranzacțiifrontendjavascriptweb3.js
Începător
jdourlens
EthereumDev(opens in a new tab)
19 aprilie 2020
3 minute de citit minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

În acest tutorial vom afla cum să apelăm o funcție a unui contract inteligent din JavaScript. Mai întâi citim starea unui contract inteligent (de exemplu, soldul unui titular ERC20), apoi modificăm starea blockchain-ului efectuând un transfer de tokenuri. Ar trebui să fiţi deja familiarizat cu configurarea unui mediu JS pentru a interacționa cu blockchain-ul.

Pentru aceste exemple, o să jucăm cu tokenul DAI, în scopul testării vom bifurca blockchain-ul folosind ganache-cli și vom debloca o adresă care are deja o mulțime de DAI:

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

Pentru a interacționa cu un contract inteligent, vom avea nevoie de adresa sa și de 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"
Afișează tot
Copiați

Pentru acest proiect am eliminat complet ABI-ul ERC20 pentru a păstra doar funcția balanceOf și transfer, dar puteţi găsi ABI-ul ERC20 complet aici(opens in a new tab).

Apoi trebuie să creăm o instanță a contractului nostru inteligent:

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

De asemenea, vom configura două adrese:

  • cea care va primi transferul și
  • cea pe care am deblocat-o deja, care îl va trimite:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
Copiați

În partea următoare vom apela funcția balanceOf pentru a prelua suma curentă de tokenuri deținute de ambele adrese.

Apel: citirea valorii dintr-un contract inteligent

Primul exemplu va apela o metodă „constantă” și va executa metoda sa de contract inteligent în EVM fără a trimite nicio tranzacție. Pentru aceasta vom citi soldul ERC20 al unei adrese. Citiţi articolul nostru despre tokenuri ERC20.

Puteți accesa metodele instanțiate ale unui contract inteligent pentru care ați furnizat ABI-ul, după cum urmează: contractul tău.methods.methodname. Prin utilizarea funcției call, veţi primi rezultatul executării funcției.

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("A apărut o eroare", err)
4 return
5 }
6 console.log("Soldul este: ", res)
7})
Copiați

Rețineţi că DAI ERC20 are 18 zecimale, ceea ce înseamnă că trebuie să eliminaţi 18 zerouri pentru a obține suma corectă. uint256 sunt returnate ca şiruri, deoarece JavaScript nu operează cu valori numerice mari. Dacă nu ştiţi sigur cum să vă ocupaţi de numerelor mari în JS, consultaţi tutorialul nostru despre bignumber.js(opens in a new tab).

Trimitere: trimiterea unei tranzacții către o funcție contract inteligent

Pentru al doilea exemplu, vom apela funcția „transfer” a contractului inteligent DAI pentru a trimite 10 DAI la a doua noastră adresă. Funcția „transfer” acceptă doi parametri: adresa destinatarului și cantitatea de tokenuri pentru transferuri:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("A apărut o eroare", err)
6 return
7 }
8 console.log("Hash-ul tranzacției: " + res)
9 })
Afișează tot
Copiați

Funcția apel returnează hash-ul tranzacției care va fi minată în blockchain. Pe Ethereum, hash-urile tranzacțiilor sunt previzibile - de aceea putem obține hash-ul tranzacției înainte de a o executa (aflaţi cum sunt calculate hash-urile aici)(opens in a new tab).

Deoarece funcția doar trimite tranzacția către blockchain, nu putem vedea rezultatul până când nu știm când este minată și inclusă în blockchain. În tutorialul următor vom învăța cum să așteptăm ca o tranzacție să fie executată pe blockchain prin cunoașterea hash-ului acesteia(opens in a new tab).

Ultima modificare: @nicklcanada(opens in a new tab), 15 august 2023

A fost util acest tutorial?