Изучаем Ethereum через практику: моя история деплоя смарт-контракта в Sepolia
В этой статье я хочу поделиться своим личным опытом развертывания смарт-контрактов двумя различными способами в тестовой сети Sepolia.
Заметьте, основная цель этого материала - продемонстрировать различные подходы к развертыванию смарт-контрактов, а не детальное обучение созданию самих смарт-контрактов. Если вы новичок в программировании и еще не знакомы с JavaScript или Solidity, не беспокойтесь. Все необходимые фрагменты кода для наших смарт-контрактов будут автоматически сгенерированы во время процесса.
Выбор тестовой сети Sepolia обусловлен несколькими причинами. Во-первых, она предоставляет бесплатную и безопасную среду для экспериментов. Во-вторых, эта сеть является частью экосистемы Ethereum и повторяет ее функциональность, что позволяет нам на практике применить теоретические знания. В-третьих, на Sepolia доступна верификация контрактов через Etherscan, что значительно упрощает отладку и проверку корректности работы наших смарт-контрактов.
В конце мы верифицируем наши смарт-контракты на Sepolia Etherscan, чтобы убедиться в их правильности и надежности. Давайте начнем.
Начинаем с основ: Создание учетной записи Ethereum
Первым этапом на пути к созданию смарт-контракта станет регистрация учетной записи Ethereum. Это необходимо для выполнения транзакций. Для управления Ethereum-адресом в данном руководстве мы используем MetaMask, простой в использовании кошелек, интегрированный в браузер.
Вы можете скачать расширение MetaMask для вашего браузера. После загрузки следуйте инструкциям для создания нового аккаунта.
Если вы создаете новую учетную запись или используете уже существующую, обязательно переключитесь на тестовую сеть Sepolia. Этот параметр можно найти в верхнем левом углу интерфейса MetaMask. Использование сети Sepolia позволит проводить все операции без использования реальных денег.
Если Sepolia не отображается в списке доступных сетей, убедитесь, что в настройках MetaMask включена функция "Show test networks" (показать тестовые сети).
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/1c5/f3f/8cd/1c5f3f8cde940d65849eb92e937151cc.png)
Для нашего задания важно иметь ненулевой баланс в кошельке. Поскольку Sepolia - это тестовая среда, мы можем получить тестовые токены ETH, которые будут использоваться для оплаты развертывания смарт-контракта. Для этого пройдите по ссылке, зарегистрируйте аккаунт Alchemy* (аккаунт понадобится и во втором способе), введите адрес своего кошелька и нажмите кнопку "Send me ETH".
*Alchemy - бесплатная платформа для разработки блокчейн-приложений
Мы готовы к созданию и развертке смарт-контрактов.
Способ первый: при помощи OpenZeppelin и Remix
Начнем наш путь к деплою смарт-контракта с OpenZeppelin's Contracts Wizard.
OpenZeppelin - платформа, которая предлагает инструменты для написания безопасных смарт-контрактов
По ссылке вы увидите интерфейс с различными фильтрами и кодом, соответствующим выбранным опциям.
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/197/a0d/a42/197a0da42189d1c2e1f663818658829e.png)
Выбор протокола
В верхней части окна находятся кнопки выбора протоколов:
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/640/f06/7d2/640f067d2b5979fa5383f5cee95071da.png)
ERC20: стандарт для токенов;
ERC721: стандарт для NFT;
ERC1155: мульти-токен;
Governor: Governance токен
Custom: кастомизированный код.
В этом примере выберем ERC20.
Настройка токена
Задайте имя, обозначение и количество предварительно созданных токенов (premint tokens). Выберите дополнительные особенности из списка, и код вашего смарт-контракта будет сформирован автоматически.
Так выглядит мой код:
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/4bd/b29/140/4bdb29140c835f3a802d2985bb07538e.png)
Открыть в Remix
Нажмите кнопку "Open in Remix" в правом верхнем углу. Откроется компилятор с вашим кодом из OpenZeppelin.
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/ffb/d0e/ab2/ffbd0eab2a209dfef373a8d209c81788.png)
Компиляция
На скриншоте выше мы видим версию компилятора и дополнительные настройки. В advanced configurations - находятся дополнительные опции, одна из которых - Enable optimisation. Оптимизация полезна, когда мы развертываем в среде Mainnet, это поможет снизить газовые сборы (gas fees) на запуск смарт-контракта. Далее компилируем контракт (нажимаем "Compile contract").
Объединение слоев кода (Flatten)
Перейдите в File explorer, найдите файл с контрактом. Щелкните правой кнопкой мыши на файл и выберите "flatten":
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/9d4/048/da8/9d4048da8c078149ebb4a34e9e366798.png)
у нас появился второй файл - имяконтракта_flattened.sol:
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/37c/12a/4f9/37c12a4f9ca9bc44398c10ab18f4722e.png)
Деплой
Перейдите в раздел "Deploy & Run Transactions", выберите ваш смарт-контракт (имя_контракта.sol) и в среде (environment) выберите "Injected Provider - MetaMask". Подключите кошелек, убедитесь, что выбрана правильная сеть (Sepolia), и нажмите "deploy". Подтвердите транзакцию в уведомлении MetaMask.
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/b21/317/58d/b2131758dffc7ad27bb55031ba596e19.png)
Просмотр на Etherscan
После выполнения транзакции перейдите по ссылке "view on Etherscan" и ознакомьтесь со всеми деталями транзакции.
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/dc0/410/c6c/dc0410c6ca8c144cf5806b687c0c860c.png)
На открывшейся странице EtherScan мы видим данные о развертывании нашего контракта. В каком блоке транзакция, адрес создателя (адрес нашего кошелька), сколько мы заплатили за транзакцию, и другое. Далее нам надо верифицировать смарт-контракт.
Верификация контракта
Нажимаем на название смарт-контракта, у меня Mango:
Переходим в раздел - "Contract", выбираем "Verify and Publish".
Адрес контракта заполняется автоматически. Тип компилятора - Solidity (Single file). После надо выбрать версию, для этого возвращаемся в Remix:
Далее тип лицензии - MIT (выбрана по умолчанию в OpenZeppelin).
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/28f/702/3f9/28f7023f96f81103c105110bbc7ed241.png)
Нажимаем - продолжить ("Continue"). В открывшемся окне вставляем код, который копируем из файла имяконтракта_flatten.sol (файл из шага 5):
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/e09/608/07f/e0960807fb8eff1ab35f257245ff00d5.png)
Пролистываем вниз страницы - выбираем "Verify and publish". При успешной верификации получим сообщение:
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/eee/fb3/3fe/eeefb33fe8c557086c896c5f20c6df35.png)
Тестирование
Можете проверить работоспособность контракта, импортировав токены в MetaMask и отправив их другому пользователю.
Заходим в MetaMask ->Tokens -> Import Tokens. Вставляем адрес смарт-контракта -> импортируем токены. Теперь в вашем кошельке появились созданные токены. Вы можете отправить их на другой адрес. Выбираем токен -> send -> пишем адрес -> отправляем. После отправки на странице смарт-контракта на EtherScan мы видим новую транзакцию (сколько, кому и когда было отправлено).
Поздравляю! Вы успешно задеплоили смарт-контракт, и теперь он полностью функционирует в тестовой сети Sepolia. Этот подход является прекрасным вариантом для тех, кто хочет быстро и эффективно создать смарт-контракт, используя проверенные инструменты, такие как OpenZeppelin и Remix.
Второй способ: Alchemy API и Hardhat
1. Подключение к сети Ethereum и выполнение RPC-запросов
Существует множество методов для выполнения запросов к сети Ethereum. Для упрощения процесса мы выбрали Alchemy, бесплатную платформу для разработки блокчейн-приложений, которая предоставляет API для взаимодействия с Ethereum без необходимости запуска собственных узлов. Эта платформа также предлагает инструменты для мониторинга и аналитики, которые мы будем использовать для понимания процессов, происходящих "под капотом" при развертывании нашего смарт-контракта. Если у вас нет учетной записи Alchemy, вы можете зарегистрироваться бесплатно здесь.
Создание приложения и получение API-ключа
После регистрации учетной записи Alchemy, вы сможете сгенерировать API-ключ, создав новое приложение. Это позволит нам отправлять запросы к тестовой сети Sepolia (или любой другой, например, Goerli).
Перейдите на страницу "Apps" в панели управления Alchemy, затем выберите "Create new app".
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/be6/069/2a2/be60692a2cbc940a557f4d41f35c77a4.png)
Заполните необходимые поля, включая имя, описание приложения, выберите Network: Sepolia Testnet, Chain: Ethereum, и нажмите "Create app".
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/70d/301/b34/70d301b341c86e1e68df89b440e16f23.png)
Инициализация проекта
Сначала нам нужно создать папку для нашего проекта. Откройте командную строку и введите соответствующие команды:
mkdir figaro
cd figaro
Затем, находясь в директории проекта, используйте команду npm init для инициализации проекта:
npm init
Введите данные о вашем проекте. Информация, которую вы вводите, не критична для текущего проекта:
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/01e/566/b5b/01e566b5bf86901cd45c1c9416472217.png)
Установка Hardhat
Hardhat — это среда разработки для компиляции, развертывания, тестирования и отладки Ethereum-программного обеспечения. Она помогает разработчикам создавать смарт-контракты и dApps локально перед их развертыванием. Для установки Hardhat выполните соответствующую команду в корневой директории вашего проекта:
npm install --save-dev hardhat
Создание проекта Hardhat
Для создания проекта Hardhat, запустите соответствующую команду в папке вашего проекта:
npx hardhat
После этого должно появиться сообщение. Выберите опцию "Create an empty hardhat.config.js". Это создаст файл hardhat.config.js, где мы укажем все настройки для нашего проекта (на шаге 10).
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/905/098/083/90509808346b03432ea79f0d9a3130d2.png)
Добавление папок проекта
Чтобы поддерживать порядок в нашем проекте, создадим две новые папки. В корневой папке проекта в командной строке введите команду:
mkdir contracts
mkdir scripts
Contracts/
- здесь будет храниться файл с кодом нашего смарт-контракта.scripts/
- здесь будут храниться сценарии для развертывания и взаимодействия с нашим контрактом.
Написание смарт-контракта
Мы будем использовать готовый код для нашего смарт-контракта. Создайте файл MyContract.sol в папке Contracts и вставьте в него код:
// Указываем минимальную версию Solidity
// Подробнее тут: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity >=0.7.3;
// Определяем контракт с именем `Figaro`.
//Подробнее тут: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract Figaro {
//Объявление события, которое будет использоваться для логирования обновлений сообщений.
//Событие принимает старую и новую строки в качестве аргументов.
event UpdatedMessages(string oldStr, string newStr);
// Определение переменной состояния "message". Это public переменная,
// поэтому Solidity автоматически создаст функцию "getter", которую можно вызывать для чтения значения переменной.
string public message;
// Конструктор вызывается при создании нового контракта.
// В этом случае он устанавливает начальное значение для переменной "message".
//Подробнее тут: https://docs.soliditylang.org/en/v0.5.10/contracts.html#constructors
constructor(string memory initMessage) {
//Принимает строковый аргумент `initMessage` и устанавливает значение в переменную хранения `message` контракта).
message = initMessage;
}
//Это функция, которая позволяет обновить значение переменной "message".
// Она сначала сохраняет старое значение "message" во временной переменной, затем обновляет "message"
// новым значением, и, наконец, инициирует событие "UpdatedMessages" с обоими значениями.
function update(string memory newMessage) public {
string memory oldMsg = message;
message = newMessage;
emit UpdatedMessages(oldMsg, newMessage);
}
}
Соединяем Metamask & Alchemy с нашим проектом
Мы успешно создали Metamask кошелек и учетную запись Alchemy, а также написали наш смарт-контракт. Теперь настало время объединить все эти элементы.
Каждая транзакция, отправляемая из вашего виртуального кошелька, требует подписи, осуществляемой с использованием вашего уникального закрытого ключа. Для того чтобы предоставить нашей программе эту возможность, мы можем безопасно хранить наш закрытый ключ и ключ API Alchemy локально на своем устройстве в папке проекта.
Для начала, установим пакет dotenv в директорию нашего проекта:
npm install dotenv --save
Теперь создайте файл .env в корневом каталоге проекта и добавьте в него ваш закрытый ключ Metamask и URL-адрес HTTP Alchemy API.
Пожалуйста, не создавайте .env вручную через текстовый документ, иначе его название будет выглядеть как: .env.txt, что не будет корректно распознано системой.
API_URL можно найти здесь:
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/a3a/ce9/6c5/a3ace96c5fb1de84da5f9725168d812e.png)
Инструкция по экспорту закрытого ключа.
Ваш .env файл должен выглядеть примерно так:
Устанавливаем Ether.js
npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
Hidden text
Ether.js - это библиотека JavaScript, которую разработчики используют для взаимодействия с блокчейном Ethereum. Она предоставляет удобный интерфейс и инструменты для выполнения таких задач, как подписание и отправка транзакций, взаимодействие со смарт-контрактами, генерация и управление кошельками и ключами, а также обработка данных и конвертация между различными форматами, используемыми в Ethereum.
Обновляем hardhat.config.js
Мы добавили несколько зависимостей и плагинов, и теперь нам нужно обновить файл hardhat.config.js, чтобы наш проект знал о каждом из них. Откройте файл в любом редакторе кода (например, VS Code).
Обновляем hardhat.config.js, чтобы он выглядел следующим образом:
/**
* @type import('hardhat/config').HardhatUserConfig
*/
require('dotenv').config();
require("@nomiclabs/hardhat-ethers");
const { API_URL, PRIVATE_KEY } = process.env;
module.exports = {
solidity: "0.7.3",
defaultNetwork: "sepolia",
networks: {
hardhat: {},
sepolia: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
},
}
Компиляция смарт-контракта
Чтобы убедиться, что все работает корректно на данный момент, давайте скомпилируем наш контракт. Задача компиляции — одна из встроенных задач Hardhat.
npx hardhat compile
Возможно, вы получите предупреждение о том, что идентификатор лицензии SPDX не указан в исходном файле. Это обычное предупреждение и оно не влияет на процесс развертывания.
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code.
Написание скрипта для развертывания смарт-контракта
Перейдите в папку scripts/ и создайте новый файл с именем deploy.js, добавив в него следующее содержимое:
async function main() {
const Figaro = await ethers.getContractFactory("Figaro");
//Здесь мы развертываем наш контракт. "Figaro!" - это аргумент, передаваемый в конструктор контракта.
// Возвращаемое значение - это объект контракта, который включает в себя множество полезных свойств и методов для взаимодействия с контрактом.
const figaro = await Figaro.deploy("Figaro!");
//Выводим на консоль адрес, по которому был развернут наш контракт.
console.log("Contract deployed to address:", figaro.address);
}
main()
.then(() => process.exit(0)) // Если все прошло успешно, завершаем процесс с кодом 0
.catch(error => { // В случае ошибки выводим информацию об ошибке и завершаем процесс с кодом 1
console.error(error);
process.exit(1);
});
В руководстве по контрактам Hardhat подробно объясняется, что делает каждая из этих строк кода.
Развертывание смарт-контракта
Наконец, мы готовы развернуть наш смарт-контракт! Перейдите в командную строку и выполните:
npx hardhat run scripts/deploy.js --network sepolia
Вы увидите сообщение, которое говорит вам, что ваш контракт был успешно развернут.
Contract deployed to address: 0x66013b6c4926Cc59B0405E7a275Db497916*****
Сохраните адрес контракта для дальнейшего использования. Следующим шагом перейдите на Sepolia Scan, введите адрес контракта в поисковой строке и проверьте, что контракт успешно развернут.
Поздравляю! Вы только что развернули смарт-контракт в сети Ethereum.
Hidden text
Просмотр запросов RPC к Ethereum
Чтобы более детально разобраться в процессе, вы можете перейти в приложение, созданное на шаге 2 в Alchemy dashboard, и просмотреть историю всех ваших запросов. Заходим в приложение, пролистываем страничку вниз и видим историю всех наших запросов.
Верификация и cмарт-контракта
Теперь, когда контракт развернут, мы можем приступить к его верификации, по аналогии с тем, что мы делали в первом способе.
При верификации контракта вам придется выбрать немного другие параметры.
Перейдите в раздел Contract -> Verify and Publish. Версию компилятора можно взять из файла hardhat.config.js.
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/784/f1f/2a5/784f1f2a52f7f5e57fa0776d27abf1cb.png)
В лицензии выберите - None.
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/16b/2f0/cde/16b2f0cde6b4412969db39fcb56b8b00.png)
В поле для кода вставьте код из файла MyContract.sol и нажмите кнопку "Verify".
После успешной верификации вы увидите соответствующее сообщение:
![](https://webcf.waybackmachine.org/web/20240902221706/https://habrastorage.org/getpro/habr/upload_files/63e/f7e/c78/63ef7ec784f5fe28c970d62f17fdaeea.png)
Поздравляю, ваш смарт-контракт верифицирован!
Заключение
В ходе нашей работы, мы подробно рассмотрели два различных подхода к развертыванию смарт-контрактов на тестовой сети Ethereum - Sepolia.
Первый метод - это использование Remix IDE, онлайн-инструмента, который предлагает удобный и наглядный интерфейс для разработки и развертывания смарт-контрактов. Этот подход идеален для начинающих блокчейн-разработчиков благодаря его простоте и удобству.
Второй метод включает использование фреймворка Hardhat вместе с библиотекой ethers.js для локальной разработки и деплоя контрактов. Этот подход предлагает больше гибкости и контроля, позволяя использовать полноценные среды разработки и воспользоваться всеми преимуществами современных инструментов программирования.
Оба этих способа помогают приобрести важные навыки и опыт, который максимально приближен к деплою смарт-контрактов на главной сети Ethereum (mainnet). Изучение обоих методов обеспечит вам глубокое понимание процесса развертывания смарт-контрактов и позволит выбирать подходящий инструмент в зависимости от ваших задач и предпочтений.