Перейти до основного контенту

Виклик смарт-контракту з JavaScript

транзакції
frontend
JavaScript
web3.js
Початківець
jdourlens
19 квітня 2020 р.
3 читається за хвилину

У цьому посібнику ми розглянемо, як викликати функцію смарт-контракту з JavaScript. Спочатку ми зчитаємо стан смарт-контракту (наприклад, баланс власника ERC20), а потім змінимо стан блокчейну, виконавши переказ токенів. Ви вже повинні бути знайомі з налаштуванням середовища JS для взаємодії з блокчейном.

У цьому прикладі ми попрацюємо з токеном DAI, з метою тестування ми зробимо форк блокчейну за допомогою ganache-cli та розблокуємо адресу, яка вже має багато DAI:

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

Щоб взаємодіяти зі смарт-контрактом, нам знадобиться його адреса та 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"
Показати все

Для цього проєкту ми скоротили повний ERC20 ABI, щоб залишити лише функції balanceOf та transfer, але ви можете знайти повний ERC20 ABI тут (opens in a new tab).

Потім нам потрібно створити екземпляр нашого смарт-контракту:

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

Ми також підготуємо дві адреси:

  • адреса, що отримає переказ, і
  • адреса, яку ми вже розблокували і яка його надішле:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"

У наступній частині ми викличемо функцію balanceOf, щоб отримати поточну кількість токенів, якими володіють обидві адреси.

Виклик: зчитування значення зі смарт-контракту

У першому прикладі ми викличемо «константний» метод і виконаємо його метод смарт-контракту в EVM без надсилання транзакції. Для цього ми зчитаємо баланс ERC20 адреси. Прочитайте нашу статтю про токени ERC20.

Ви можете отримати доступ до методів екземпляра смарт-контракту, для якого ви надали ABI, наступним чином: yourContract.methods.methodname. За допомогою функції call ви отримаєте результат виконання функції.

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("Сталася помилка", err)
4 return
5 }
6 console.log("Баланс: ", res)
7})

Пам'ятайте, що DAI ERC20 має 18 десяткових знаків, а це означає, що вам потрібно видалити 18 нулів, щоб отримати правильну суму. uint256 повертаються як рядки, оскільки JavaScript не обробляє великі числові значення. Якщо ви не впевнені, як працювати з великими числами в JS, перегляньте наш посібник про bignumber.js (opens in a new tab).

Надсилання: надсилання транзакції до функції смарт-контракту

У другому прикладі ми викличемо функцію transfer смарт-контракту DAI, щоб надіслати 10 DAI на нашу другу адресу. Функція transfer приймає два параметри: адресу одержувача та кількість токенів для переказу:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("Сталася помилка", err)
6 return
7 }
8 console.log("Хеш транзакції: " + res)
9 })
Показати все

Функція send повертає хеш транзакції, що буде додана до блокчейну. В Ethereum хеші транзакцій є передбачуваними — саме так ми можемо отримати хеш транзакції до її виконання (дізнайтеся, як розраховуються хеші, тут (opens in a new tab)).

Оскільки функція лише надсилає транзакцію до блокчейну, ми не можемо побачити результат, доки не дізнаємось, коли її буде додано та включено до блокчейну. У наступному посібнику ми дізнаємося, як дочекатися виконання транзакції в блокчейні, знаючи її хеш (opens in a new tab).

Останні оновлення сторінки: 21 жовтня 2025 р.

Чи була ця інструкція корисною?