Перейти к основному содержанию

Вызов смарт-контракта из JavaScript

транзакции
интерфейс
JavaScript
web3.js
Beginner
jdourlens
19 апреля 2020 г.
3 минута прочтения

В этом руководстве мы рассмотрим, как вызвать функцию смарт-контракта из JavaScript. Сначала мы прочитаем состояние смарт-контракта (например, баланс держателя ERC20), а затем изменим состояние блокчейна, выполнив перевод токенов. Вы уже должны быть знакомы с настройкой JS-среды для взаимодействия с блокчейном.

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

ganache-cli -f https://mainnet.infura.io/v3/[ВАШ КЛЮЧ INFURA] -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"
Показать все

Для этого проекта мы урезали полный ABI ERC20, оставив только функции balanceOf и transfer, но вы можете найти полный ABI ERC20 здесь (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 })
Показать все

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

Поскольку функция только отправляет транзакцию в блокчейн, мы не можем увидеть результат, пока не узнаем, когда она будет добыта и включена в блокчейн. В следующем руководстве мы узнаем, как дождаться выполнения транзакции в блокчейне, зная ее хэш (opens in a new tab).

Последнее обновление страницы: 21 октября 2025 г.

Было ли это руководство полезным?