Настройка окружения — Node, Hardhat, MetaMask
Как подготовить локальное окружение для Ethereum-разработки: установить Node.js, создать Hardhat-проект, скомпилировать контракт и подключить MetaMask к локальной сети.
Что нужно установить
Для старта нужны три инструмента: Node.js для запуска TypeScript-кода, Hardhat для компиляции и локальной сети, MetaMask для подписи транзакций в браузере.
Такое окружение позволяет пройти полный цикл без реальных денег: написать контракт, запустить локальный Ethereum, задеплоить контракт и увидеть тестовый аккаунт в кошельке.
Создаём Hardhat-проект
mkdir eth-dev-start
cd eth-dev-start
npm init -y
npm pkg set type="module"
npm install --save-dev hardhat typescript tsx @types/node @nomicfoundation/hardhat-toolbox-mocha-ethers
mkdir contracts scriptsЭти команды создают пустой npm-проект и ставят Hardhat 3 с TypeScript, ethers.js и Mocha-toolbox.
Добавляем конфиг Hardhat
Создайте файл hardhat.config.ts:
import { defineConfig } from "hardhat/config";
import hardhatToolboxMochaEthers from "@nomicfoundation/hardhat-toolbox-mocha-ethers";
export default defineConfig({
plugins: [hardhatToolboxMochaEthers],
solidity: {
version: "0.8.28",
},
});defineConfig() описывает проект для Hardhat. Плагин добавляет ethers.js, тесты и удобные helpers для деплоя контрактов.
Пишем минимальный контракт
Создайте файл contracts/Counter.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
contract Counter {
uint256 public value;
event Incremented(uint256 newValue);
function increment() external {
value += 1;
emit Incremented(value);
}
}Проверьте, что контракт компилируется:
npx hardhat buildЕсли команда прошла без ошибок, Hardhat понял структуру проекта и смог скомпилировать Solidity-код.
Деплоим в локальную сеть
Создайте файл scripts/deploy-counter.ts:
import { network } from "hardhat";
const { ethers } = await network.create();
const counter = await ethers.deployContract("Counter");
await counter.waitForDeployment();
console.log("Counter deployed to:", await counter.getAddress());
console.log("Initial value:", (await counter.value()).toString());
const tx = await counter.increment();
await tx.wait();
console.log("Value after increment:", (await counter.value()).toString());В первом терминале запустите локальную сеть:
npx hardhat nodeВо втором терминале выполните деплой:
npx hardhat run scripts/deploy-counter.ts --network localhostHardhat поднимет локальный RPC на http://127.0.0.1:8545, создаст тестовые аккаунты и позволит отправлять транзакции без реального ETH.
Подключаем MetaMask к Hardhat
Добавьте сеть вручную в MetaMask:
| Поле | Значение |
|---|---|
| Network name | Hardhat Local |
| RPC URL | http://127.0.0.1:8545 |
| Chain ID | 31337 |
| Currency symbol | ETH |
После запуска npx hardhat node в терминале появятся тестовые аккаунты с приватными ключами. Импортируйте один из них в MetaMask только для локальной разработки.
Никогда не используйте приватный ключ от основного кошелька в локальных проектах,
.envили примерах из интернета.
Как это работает
npm pkg set type="module" — включает ES Modules, которые использует Hardhat 3.
hardhat.config.ts — центральный файл проекта: здесь подключаются плагины, версия Solidity и сети.
npx hardhat build — компилирует контракты и обновляет артефакты.
npx hardhat node — запускает локальный Ethereum RPC на вашем компьютере.
--network localhost — говорит Hardhat выполнить скрипт не во временной сети, а в уже запущенной локальной сети.
network.create() — создаёт подключение к выбранной сети и возвращает ethers.js helpers для этой сети.
ethers.deployContract("Counter") — компилирует и деплоит контракт по имени из папки contracts.
Частые ошибки
MetaMask не подключается к сети → проверьте, что npx hardhat node всё ещё запущен, а RPC URL равен http://127.0.0.1:8545.
Hardhat пишет, что проект не найден → запускайте команды из папки eth-dev-start, где лежит hardhat.config.ts.
После перезапуска Hardhat node контракт пропал → локальная сеть хранит состояние только пока работает процесс. После перезапуска нужно снова выполнить deploy-скрипт.
Что дальше
- Что такое Ethereum для разработчика — разобраться, что именно запускает локальная сеть Hardhat
- Провайдер vs Сайнер — понять разницу между чтением сети и подписанием транзакций
- Деплой контракта — перейти от локального Counter к полноценному deploy-скрипту