November 16, 2021

Создание и деплой смарт-контракта Moonbeam используя hardhat

В данном документе мы расскажем как создать и задеплоить смарт-контракт Moonbeam используя локальную ноду, с помощью hardhat

1. Для запуска локальной ноды Moonbeam Development Node мы в нашем примере будем использовать docker. Подготовим наш сервер для использования докера :

sudo apt update
sudo apt install wget -y
wget -O get-docker.sh https://get.docker.com
sudo sh get-docker.sh
sudo apt install -y docker-compose
rm -f get-docker.sh

2. Устанавливаем локальную ноду Moonbeam Development Node :

docker pull purestake/moonbeam:v0.14.2
Делаем пулл реквест актуальной версии
docker run --rm --name moonbeam_development --network host \
purestake/moonbeam:v0.14.2 \
--dev
Вот такой вывод мы должны получить Мы запустили локальную Moonbeam Development Node

3. Локальная нода запущена, теперь установим Node.js :

sudo apt install curl git
curl https://deb.nodesource.com/setup_12.x | bash  -
sudo apt install nodejs

Проверяем что Node.js установился и его версию:

node --version

4. Устанавливаем hardhat

mkdir hardhat-dev && cd hardhat-dev
npm init --yes
npm install --save-dev hardhat

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

npx hardhat
Запускаем hardhat
На примере используется значения по умолчанию для sample project

6. Теперь компилируем проект

npx hardhat compile

7. Теперь подготовим файлы для деплоя смарт контракта. Нам требуется файл конфига, файл скрит-деплоя и файл приватного ключа.
Сначала установим сеть в файл конфига:

nano hardhat.config.js
  networks: {
    dev: {
      url: "http://127.0.0.1:9933",
      chainId: 1281,
      accounts: [privateKey]
    }
  }

!help Файл конфига должен выглядеть следующим образом :

require("@nomiclabs/hardhat-waffle");

// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

// You need to export an object to set up your config
// Go to https://hardhat.org/config/ to learn more

/**
 * @type import('hardhat/config').HardhatUserConfig
 */
const { privateKey } = require('./secrets.json');


module.exports = {
  solidity: "0.8.4",

  networks: {
    dev: {
      url: "http://127.0.0.1:9933",
      chainId: 1281,
      accounts: [privateKey]
    }
  }
};
Файл конфига выглядит таким образом

Теперь создаем скрипт деплоя

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

    // Instantiating a new smart contract
    const greeter = await Greeter.deploy('Hi!');

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

main()
   .then(() => process.exit(0))
   .catch((error) => {
      console.error(error);
      process.exit(1);
   });
Скрипт деплоя должен выглядеть таким образом

Создаем файл с приватным ключом от метамаска.
Ознакомится с ключами для разработки можете здесь .

nano secrets.json
{
   "privateKey": "0x99b3c12287537e38c90a9219d4cb074a89a16e9cdb20bf85728ebd97c343e342"
}
Ваш приватный ключ должен выглядить таким образом

8. Запускаем деплой

npx hardhat run scripts/deploy.js --network dev
Вывод успешного деплоя
Проверям логи что наш деплой был успешный и прошел блок

Ошибки с которыми вы можете столкнутся :

Если видите такую картину, то вы не установили приватный ключ. Проверьте файл конфига и файл приватного ключа

Ошибка из за отсутствия приватного ключа

Если видите такую картину, то вы пропустили аргумент в файле деплоя. В нашем примере это аргумент const greeter = await Greeter.deploy('Hi!');

Ошибка из за отсутсвия аргумента

Полезные ссылки :

https://docs.moonbeam.network/builders/get-started/moonbeam-dev/

https://hardhat.org/tutorial/

https://remix.ethereum.org/