Взаимодействие с контрактами Ethereum

В предыдущем блоге я описал, как создать токен ERC20 простым способом с помощью OpenZepellin. Этот контракт дает нам возможность чеканить токены (mint), сжигать токены (burnable) и приостанавливать передачу токенов (pausable), однако я еще не показал, как вызывать функции контракта с этими свойствами. Сегодня мы узнаем, как это сделать.

Прежде чем начать, нам нужно понять разницу между вызовом и транзакцией.

Звоните на

Когда мы совершаем вызов, мы выполняем код, который выполняет блокчейн, но это выполнение не изменит никаких данных в блокчейне. Поэтому звонки не стоят ETH, то есть основное использование звонков — это чтение данных из блокчейна. В общем случае вызовы возвращают значение.

Транзакция

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

Очень важно знать эту разницу как при программировании смарт-контрактов, так и когда мы хотим получить или записать данные в блокчейн.

Взаимодействие с контрактами с помощью truffle.

Truffle дает нам возможность взаимодействовать с контрактами через их абстракции. Мы можем создавать эти абстракции либо в консоли разработки, либо путем создания сценариев с помощью JavaScript.

Консоль

Сначала нам нужно войти в консоль разработчика, указав сеть, на которой мы развернули контракт.

truffle console --network kovan
Войдите в полноэкранный режим Выход из полноэкранного режима

Консоль truffle позволяет нам взаимодействовать с нашими контрактами с помощью JavaScript. Теперь нам нужно получить абстракцию нашего контракта, если вы следовали предыдущему руководству, то помните, что имя контракта моего токена ERC20 — Moonify.

truffle(kovan)> let instance = await Moonify.deployed()
Войдите в полноэкранный режим Выход из полноэкранного режима

Теперь, например, если мы вызовем нашу переменную экземпляра, мы увидим, как она возвращает абстракцию нашего контракта.

truffle(kovan)> instance
Войдите в полноэкранный режим Выход из полноэкранного режима

Как вы видите, абстракция контракта содержит функции, переменные, события и адрес нашего токена. Когда абстракция готова, мы можем начать использовать функции нашего контракта.

Давайте попробуем приостановить передачу нашего токена, для этого мы создали функцию pause, которая не принимает никаких параметров, но может быть вызвана только владельцем контракта.

function pause() public onlyOwner {
    _pause();
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Чтобы вызвать его, просто введите следующую команду:

truffle(kovan)> instance.pause()
Войдите в полноэкранный режим Выход из полноэкранного режима

Теперь, например, если мы захотим отправить наши токены на другой счет с помощью metamask, мы увидим, что наша транзакция завершится неудачей. На самом деле, мы можем просмотреть нашу неудачную транзакцию в Etherscan и увидеть, что транзакция была отменена, а наши ETH возвращены.

Конечно, чтобы снова включить наши транзакции с токенами, просто выполните команду:

truffle(kovan)> instance.unpause()
Войдите в полноэкранный режим Выход из полноэкранного режима

Как вы могли заметить, мы вызывали только те функции, которые не требуют параметров. Наша функция монетного двора, например, требует указания адреса и количества. Это можно легко сделать из консоли, но это приносит много неудобств, таких как копирование и вставка различных адресов, а также необходимость повторять всю процедуру после закрытия консоли. Решение? Создайте сценарий и запустите его с помощью Truffle.

Скрипты

Как я только что упомянул, у скриптов есть много преимуществ. Начнем с создания папки scripts, в которую мы поместим скрипты для повторного использования.

mkdir scripts
Войдите в полноэкранный режим Выход из полноэкранного режима

Теперь давайте быстро создадим скрипт, который позволит нам чеканить токены для аккаунта. Название скрипта будет mint.js, не забудьте сохранить его в папке scripts.

const web3 = require("web3")
var cantidad = 100
var address = "0x8A7320D4E9bcA258E73f8ec61F4e4149f22f6F96"

module.exports = async function main(callback){
    try {
        // Obtenemos la abstracción del contrato
        const contrato = await artifacts.require("Moonify").deployed()
        // Convertimos la cantidad a acuñar en Big Number
        const value = web3.utils.toBN(cantidad * 1e18)
        // Llamamos a nuestra función mint con una address y valor a acuñar
        await contrato.mint(address, value.toString());
        callback(0);
    } catch (error) {
        console.error(error);
        callback(1);
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Этот скрипт довольно прост и является хорошей основой для создания других скриптов для других функций. Однако я оставил комментарии, поясняющие наиболее важные строки.

Наконец, запустите наш скрипт:

truffle exec mint.js --network kovan
Войдите в полноэкранный режим Выход из полноэкранного режима

Если все прошло успешно, мы начеканим 100 токенов на счет, указанный в переменной address.

Выводы

Как мы только что заметили, взаимодействовать с нашим контрактом с помощью truffle довольно просто. Следует отметить, что мы взаимодействовали с созданным нами токеном. Для взаимодействия с контрактами третьих сторон нам понадобится ABI контракта, и мы воспользуемся пакетом @truffle/contract. Я также приглашаю вас изучить контракты OpenZepellin, чтобы вы могли вызывать множество других функций, например, owner() — это вызов, который позволяет нам узнать адрес владельца контракта.

Оцените статью
Procodings.ru
Добавить комментарий