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]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"47Afișează totCopiere
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")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)4Copiere
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"3Copiere
Î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 return5 }6 console.log("Soldul este: ", res)7})8Copiere
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.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("A apărut o eroare", err)6 return7 }8 console.log("Hash-ul tranzacției: " + res)9 })10Afișează totCopiere
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.