Ajută la actualizarea acestei pagini

🌏

Există o nouă versiune a acestei pagini, dar acum este doar în engleză. Ajută-ne să traducem cea mai recentă versiune.

Apelare contract inteligent din JavaScript

Î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ă fii deja familiarizat cu configurarea unui mediu JS pentru a interacționa cu blockchain-ul.

Pentru aceste exemple, o să ne 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"
47
Afișează tot
📋 Copiere

Pentru acest proiect am eliminat complet ABI-ul ERC20 pentru a păstra doar funcția balanceOf și transfer, dar poți găsi ABI-ul ERC20 complet aici.

Apoi, trebuie să cream o instanță a contractului nostru inteligent:

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

Vom configura, de asemenea, 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"
3
📋 Copiere

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

Call: 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. Citește articolul nostru despre tokenuri ERC20.

Poți accesa o metodă unei instanțe de contract inteligent pentru care ai furnizat ABI-ul astfel: yourContract.methods.methodname. Prin utilizarea funcției call vei 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})
8
📋 Copiere

Reține că DAI ERC20 are 18 zecimale, ceea ce înseamnă că trebuie să elimini 18 zerouri pentru a obține suma corectă. uint256 sunt returnate ca stringuri deoarece JavaScript nu operează cu valori numerice mari. Dacă nu știi sigur cum să te ocupi de numerelor mari în JS, consultă tutorialul nostru despre bignumber.js.

Send: 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 })
10
Afișează tot
📋 Copiere

Funcția call 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 (află cum sunt calculate hash-urile aici).

Deoarece funcția trimite doar tranzacția către blockchain, nu putem vedea rezultatul până când nu știm când este minată și inclusă în blockchain. În următorul tutorial vom învăța cum să așteptăm ca o tranzacție să fie executată pe blockchain știind care este hash-ul ei.

Ultima editare: , Invalid DateTime
Edit page