Использование Hardhat

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

Взаимодействие с Edgeware EVM с помощью Hardhat

В этом руководстве описан процесс развертывания смарт-контракта на основе Solidity в тестовой сети Edgeware Beresheet с использованием Hardhat. Hardhat — это среда разработки для компиляции, развертывания, тестирования и отладки вашего программного обеспечения Ethereum. Это помогает разработчикам управлять и автоматизировать повторяющиеся задачи, присущие процессу создания смарт-контрактов и dApp, а также легко внедрять дополнительные функции в этот рабочий процесс. Это означает компиляцию, запуск и тестирование смарт-контрактов в самом ядре.

В Hardhat встроена Hardhat Network, локальная сеть Ethereum, предназначенная для разработки. Его функциональность сосредоточена на отладке Solidity, включая трассировку стека, console.log() и явные сообщения об ошибках при сбое транзакций.

Hardhat Runner, команда командной строки для взаимодействия с Hardhat, представляет собой расширяемое средство запуска задач. Он разработан на основе концепций задач и плагинов. Каждый раз, когда вы запускаете Hardhat из CLI, вы запускаете задачу. Например. npx hardhat compile запускает встроенную задачу компиляции. Задачи могут вызывать другие задачи, что позволяет определять сложные рабочие процессы. Пользователи и плагины могут переопределять существующие задачи, делая эти рабочие процессы настраиваемыми и расширяемыми.

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

Чтобы следовать этому руководству, вы должны уметь:

Нам нужно установить Node.js и менеджер пакетов npm. Вы можете скачать прямо с Node.js или в своем терминале.

{% tabs %} {% tab title="Mac OS" %}

# You can use homebrew (https://docs.brew.sh/Installation)
brew install node`

# Or you can use nvm (https://github.com/nvm-sh/nvm)
nvm install node

{% endtab %} {% endtabs %}

{% tabs %} {% tab title="Linux" %}

curl -sL https://deb.nodesource.com/setup_15.x | sudo -E bash -

sudo apt install -y nodejs

{% endtab %} {% endtabs %}

Вы можете убедиться, что все установлено правильно, запросив версию для каждого пакета:

node -v

npm -v

На момент написания этого руководства использовались версии 15.7.0 и 7.4.3 соответственно.

Также вам понадобится следующее:

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

Запуск проекта Hardhat

Чтобы начать новый проект, создайте для него каталог:

mkdir EDGhat && cd EDGhat

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

npm init -y

Вы заметите недавно созданный package.json, который будет продолжать расти по мере установки зависимостей проекта.

Чтобы начать работу с Hardhat, мы установим его в наш только что созданный каталог проекта:

npm install hardhat

После установки запустите:

npx hardhat

Это создаст файл конфигурации Hardhat (hardhat.config.js) в каталоге нашего проекта.

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

После запуска команды выберите «Создать пустой файл hardhat.config.js» с помощью клавиш со стрелками и введите:

Файл контракта

Мы собираемся хранить наш контракт в каталоге contracts. Создать это:

mkdir Contracts && cd Contracts или создав новый каталог в нашем корневом каталоге 'EDGHAT' в текстовом редакторе, таком как Visual Studio Code

Редактирование каталогов в терминале можно воспроизвести в текстовом редакторе в любой момент этого руководства.

Смарт-контракт, который мы развернем в качестве примера, будет называться Box: он позволит людям хранить значение, которое впоследствии можно будет извлечь.

Мы сохраним этот файл как contracts/Box.sol:

// contracts/Box.sol
pragma solidity ^0.8.1;

contract Box {
    uint256 private value;

    // Emitted when the stored value changes
    event ValueChanged(uint256 newValue);

    // Stores a new value in the contract
    function store(uint256 newValue) public {
        value = newValue;
        emit ValueChanged(newValue);
    }

    // Reads the last stored value
    function retrieve() public view returns (uint256) {
        return value;
    }
}

Файл конфигурации каски

Нам нужно изменить наш файл конфигурации Hardhat, чтобы мы могли компилировать и развертывать контракты в экосистеме Edgeware. Если вы еще этого не сделали, подключите свою учетную запись MetaMask к нашей экосистеме и пополните ее с помощью автоматического бота-сборщика в разногласиях. Мы будем использовать закрытый ключ учетной записи, созданной для развертывания контракта. Если вы не знаете закрытый ключ, вы можете экспортировать его из MetaMask.

Начнем с запроса плагина ethers, который содержит библиотеку [ethers.js][/integrations/ethers/], которая позволяет вам взаимодействовать с блокчейном простым способом. Мы можем установить плагин ethers, запустив:

npm install @nomiclabs/hardhat-ethers ethers

Затем мы импортируем закрытый ключ, полученный из MetaMask, и сохраняем его в файле .json. Этот файл должен быть создан в корневом каталоге и называться private.json. Поскольку этот ключ является очень конфиденциальной информацией, очень важно, чтобы мы не раскрывали какую-либо информацию при развертывании. Чтобы гарантировать это, мы хотим создать файл .gitignore в нашем корневом каталоге. Затем вы можете игнорировать любые файлы, используя формат: .filename, или любые каталоги, используя: directory/. В нашем случае мы пытаемся игнорировать наш файл закрытого ключа, поэтому он должен выглядеть так:

Файл private.json должен содержать запись privateKey, например:

{
  "privateKey": "YOUR-PRIVATE-KEY-HERE"
}

Внутри module.exports нам нужно указать версию Solidity (0.8.1 в соответствии с нашим файлом контракта) и сведения о сети. Здесь мы используем сеть testnet(Beresheet) для следующего примера:

Если вы хотите выполнить развертывание на локальном узле разработки Edgeware, вы можете использовать следующие сведения о сети:

Если вы хотите выполнить развертывание в основной сети Edgeware, вы можете использовать следующие сведения о сети:

Файл конфигурации Hardhat должен выглядеть так:

// ethers plugin required to interact with the contract
require('@nomiclabs/hardhat-ethers');

// private key from the pre-funded Beresheet testing account
const { privateKey } = require('./private.json');

module.exports = {
  // latest Solidity version
  solidity: "0.8.1",

  networks: {
    // Beresheet network specification
    Beresheet: {
      url: `https://beresheet2.edgewa.re/evm`,
      chainId: 2021,
      accounts: [privateKey]
    }
  }
};

Здорово! Теперь мы готовы к развертыванию.

Компиляция Solidity

Наш контракт Box.sol использует Solidity 0.8.1. Убедитесь, что файл конфигурации Hardhat правильно настроен для этой версии Solidity. Если это так, мы можем скомпилировать контракт, запустив:

npx hardhat compile

После компиляции создается каталог «artifacts»: он содержит байт-код и метаданные контракта, которые представляют собой файлы «.json». Рекомендуется добавить этот каталог в ваш .gitignore.

Развертывание контракта

Чтобы развернуть смарт-контракт Box, нам нужно написать простой «скрипт развертывания». Во-первых, давайте создадим новый каталог (scripts). Внутри только что созданного каталога добавьте новый файл deploy.js.

mkdir scripts && cd scripts
touch deploy.js

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

Мы начинаем с создания локального экземпляра контракта с помощью метода getContractFactory(). Далее давайте воспользуемся методом deploy(), который существует в этом экземпляре, чтобы инициировать смарт-контракт. Наконец, мы ждем его развертывания с помощью deployed(). После развертывания мы можем получить адрес контракта внутри экземпляра коробки.

// scripts/deploy.js
async function main() {
   // We get the contract to deploy
   const Box = await ethers.getContractFactory('Box');
   console.log('Deploying Box...');

   // Instantiating a new Box smart contract
   const box = await Box.deploy();

   // Waiting for the deployment to resolve
   await box.deployed();
   console.log('Box deployed to:', box.address);
}

main()
   .then(() => process.exit(0))
   .catch((error) => {
      console.error(error);
      process.exit(1);
   });

Используя команду запуска, теперь мы можем развернуть контракт Box на Beresheet.

npx hardhat run --network Beresheet scripts/deploy.js

Чтобы выполнить развертывание на узле разработки Edgeware, замените Beresheet на dev в команде запуска.

Через несколько секунд контракт развернут, и вы должны увидеть адрес в терминале.

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

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

Ограниченная функциональность

Давайте используем Hardhat для взаимодействия с нашим недавно развернутым контрактом в Beresheet. Для этого запустите консоль каски, выполнив:

npx hardhat console --network Beresheet

Чтобы выполнить развертывание на узле разработки Edgeware, замените Beresheet на dev в команде запуска.

Затем добавьте следующие строки кода по одной строке за раз. Во-первых, мы снова создаем локальный экземпляр контракта Box.sol. Не беспокойтесь о выводе undefined, который вы получите после выполнения каждой строки:

const Box = await ethers.getContractFactory('Box');

Далее давайте подключим этот экземпляр к существующему, передав адрес, который мы получили при развертывании контракта:

const box = await Box.attach('ADDRESS-GOES-HERE');

После привязки к договору мы готовы с ним взаимодействовать. Пока консоль все еще находится в сеансе, давайте вызовем метод store и сохраним простое значение:

await box.store(5)

Транзакция будет подписана вашей учетной записью Beresheet и транслирована в сеть. Вывод должен выглядеть примерно так:

Обратите внимание на свой адрес, помеченный от, адрес контракта и данные, которые передаются. Теперь давайте получим значение, запустив:

(await box.retrieve()).toNumber()

Мы должны увидеть 5 или значение, которое вы сохранили изначально.

Поздравляем, вы завершили обучение Hardhat!

Для получения дополнительной информации о Hardhat, подключаемых модулях Hardhat и других интересных функциях посетите hardhat.org.