Эта статья научит вас читать и выполнять транзакции с сервера NodeJs. Предположим, вы хотите отправлять NFT пользователям каждый день в 23:59 или открывать продажу со своего смарт-контракта каждый вторник. Смарт-контракты не могут помочь в будущем или вставить, поскольку смарт-контракты отправляют транзакции в режиме реального времени. ChainLink решил эту проблему с помощью Хранителей для запуска транзакций при определенных условиях. Вы должны заплатить некоторую ссылку (токен ChainLink), чтобы использовать их сервис. В этой статье рассказывается, как создать своего хранителя для запуска транзакций смарт-контракта.

Предварительный запрос

  1. Уже знаком с Nodejs.
  2. Знать брала элементарно.

Что именно мы будем делать?

Мы создадим сервер Node.js, который ежедневно и в зависимости от этих данных считывает данные из блокчейна. Сервер выполнит некоторые транзакции блокчейна.

Шаги:

  1. Создайте сервер Node.js для взаимодействия со смарт-контрактом.
  2. Создайте функцию запроса, чтобы проверить, нужно ли выполнить транзакцию. (с сервера Node.js)
  3. Отправьте транзакцию для отправки NFT пользователям. (с сервера Node.js)
  4. Создайте задачу крона, чтобы запланировать выполнение.
  5. Запустите сервер с помощью pm2 (объясню подробно).

Создание сервера Nodejs

Сначала я инициализирую сервер

yarn init -y

Мне нужно добавить шесть пакетов:

  • @truffle/contract и @truffle/hdwallet-provider Для взаимодействия со смарт-контрактом. Запрос и отправка транзакций.
  • web3 Создать провайдера и подключиться к сети блокчейн.
  • dotenv Чтобы добавить закрытый ключ и URL-адрес RPC в переменные среды.
  • node-cron Для планирования задач crone.
  • pm2 Для управления производственным процессом во время развертывания.
yarn add @truffle/contract @truffle/hdwallet-provider dotenv node-cron pm2 web3

затем создайте файл index.js (внутри каталога сервера)

touch index.js

и добавьте скрипт запуска в package.json

"scripts": {    
   "dev": "node index.js" 
 },

Вернуться к файлу index.js

Импортируйте пакеты truffle и web3 для подключения к блокчейну.

"use strict";
const Contract = require("@truffle/contract");
const WalletProvider = require("@truffle/hdwallet-provider");
const Web3 = require("web3");

Импорт пакета задач крона, Dotenv и пакета файловой системы для загрузки смарт-контрактов abi

const cron = require("node-cron"); 
const path = require("path");
const fs = require("fs");

После импорта всех пакетов запустите

yarn start

чтобы убедиться, что все в порядке, создайте файл .env

nano .env

и добавьте следующие переменные

RPC_URL=https://data-seed-prebsc-1-s1.binance.org:8545/
CONTRACT_ADDRESS=<Add Contract Address here>
PRIVATE_KEY=<Add Private Key here>

для RPV_URL я буду использовать умную сеть Binance для работы. Вы можете добавить любой блокчейн, какой захотите. Файл env готов к использованию, и мы можем инициализировать провайдера и начать выполнять вызовы JSON-RPC.

давайте добавим переменные окружения в файл index.js

require("dotenv").config();
const RPC_URL = process.env.RPC_URL;
const contractAddress = process.env.CONTRACT_ADDRESS;

Затем инициализируйте поставщика.

const web3 = new Web3(new Web3.providers.HttpProvider(RPC_URL));

Создать функцию выполнения

const execute = async () => {}

загрузить смарт-контракт abi

// Inside the execute function
const abiPath = path.resolve("abi/stake.json");  
const rawData = fs.readFileSync(abiPath);  
const contractAbi = JSON.parse(rawData);

Теперь мы можем создать экземпляр смарт-контракта после создания объекта abi JSON.

// After contractAbi variable
const contract = Contract({ abi: contractAbi });  
const provider = new WalletProvider(process.env.PRIVATE_KEY, RPC_URL);  
contract.setProvider(provider);  
const contractInstance = await contract.at(contractAddress);

Вот и все. Теперь мы готовы взаимодействовать с блокчейном.

Пример
Чтобы прочитать/запросить данные из блокчейна, все, что вам нужно сделать

const result = await contractInstance.functionName(<parameters>)

Для записи данных и отправки транзакций (то же самое, что и выше, но вам нужно указать свойство from)

await contractInstance.functionName(<parameters>,{
from:   web3.eth.accounts.privateKeyToAccount(process.env.PRIVATE_KEY)              .address
})

Вернуться к нашему коду

Последнее, что нам нужно сделать, это инициализировать задачу крона.

В нашем случае мы хотим, чтобы задача крона выполнялась ежедневно в 23:59, поэтому она должна выглядеть так (вы можете проверить документацию)

// 59 for minutes
// 23 for hours
cron.schedule("59 23 * * *", async () => {
// Code go here
})

проверяем, нужно ли нам выполнять задачу

// inside cron task callback
const isTaskNeedToBeExecuted = 
          await contractInstance.checkIfTaskNeedToBeExecuted();

Если он возвращает true, то мы отправим транзакцию

if(isTaskNeedToBeExecuted){
await contractInstance.performTask({                                                                               
from:       web3.eth.accounts.privateKeyToAccount(process.env.PRIVATE_KEY)              .address
});
}

Некоторые исключения могут возникать при запуске этого сервера в течение определенного времени, например, время ожидания вызова. В вашем кошельке недостаточно средств для оплаты стоимости газа или любой ошибки самого смарт-контракта. Итак, нам нужно обернуть код try/catch И код должен выглядеть так

cron.schedule('59 23 * * *', async () => {
try {
const isTaskNeedToBeExecuted = await contractInstance.checkIfTaskNeedToBeExecuted()
if (isTaskNeedToBeExecuted) {
await contractInstance.performTask({
from: web3.eth.accounts.privateKeyToAccount(process.env.PRIVATE_KEY).address,
})
}
} catch (error) {
console.error(error)
}
})

Вот и все. Теперь код готов к развертыванию. Вы можете проверить полный исходный код здесь.

Развернуть код

Последний шаг — развертывание кода. Во-первых, вам нужно добавить сценарий развертывания в файл package.json.

"scripts": {    
      "dev": "node index.js",    
      "deploy": "pm2 start index.js"  
},

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

pm2 logs

Вы можете развернуть код на любой облачной платформе. Сервер не требует никаких мощностей, поэтому ваш уровень бесплатного пользования AWS будет хорошим и бесплатным!

Присоединяйтесь к Coinmonks, Каналу Telegram и Каналу Youtube, узнайте о криптотрейдинге и инвестировании

Также читайте