Перейти к основному контенту

Смарт-контракт Hello World для начинающих

Solidity
Hardhat
Alchemy
смарт-контракты
развертывание
Для начинающих
elanh
31 марта 2021 г.
12 минут на чтение

Если вы новичок в разработке на блокчейне и не знаете, с чего начать, или если вы просто хотите понять, как развернуть смарт-контракты и взаимодействовать с ними, это руководство для вас. Мы шаг за шагом создадим и развернем простой смарт-контракт в тестовой сети Sepolia, используя виртуальный кошелек МетаМаск (открывается в новой вкладке), Solidity (открывается в новой вкладке), Hardhat (открывается в новой вкладке) и Alchemy (открывается в новой вкладке) (не волнуйтесь, если вы пока не понимаете, что все это значит, мы все объясним).

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

Если у вас возникнут вопросы на любом этапе, не стесняйтесь обращаться в Дискорд Alchemy (открывается в новой вкладке)!

Шаг 1: Подключение к сети Эфириум

Существует множество способов делать запросы к цепи Эфириума. Для простоты мы будем использовать бесплатный аккаунт на Alchemy — платформе для разработчиков блокчейна и API, которая позволяет нам взаимодействовать с цепью Эфириума без необходимости запускать собственные узлы. Платформа также предоставляет инструменты разработчика для мониторинга и аналитики, которыми мы воспользуемся в этом руководстве, чтобы понять, как технически устроено развертывание нашего смарт-контракта. Если у вас еще нет аккаунта Alchemy, вы можете бесплатно зарегистрироваться здесь (открывается в новой вкладке).

Шаг 2: Создание приложения (и ключа API)

После создания аккаунта Alchemy вы можете сгенерировать ключ API, создав приложение. Это позволит нам делать запросы к тестовой сети Sepolia. Если вы не знакомы с тестовыми сетями, загляните на эту страницу.

  1. Перейдите на страницу «Create new app» (Создать новое приложение) на панели управления Alchemy, выбрав «Select an app» (Выбрать приложение) на панели навигации и нажав «Create new app».

Hello world create app

  1. Назовите свое приложение «Hello World», добавьте краткое описание и выберите вариант использования, например, «Infra & Tooling» (Инфраструктура и инструменты). Затем найдите «Ethereum» и выберите сеть.

create app view hello world

  1. Нажмите «Next» (Далее) для продолжения, затем «Create app» (Создать приложение), и все готово! Ваше приложение должно появиться в выпадающем меню на панели навигации, а ключ API будет доступен для копирования.

Шаг 3: Создание аккаунта (адреса) Эфириума

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

Вы можете скачать МетаМаск и бесплатно создать аккаунт Эфириума здесь (открывается в новой вкладке). При создании аккаунта (или если он у вас уже есть) обязательно переключитесь на тестовую сеть Sepolia с помощью выпадающего меню сетей (чтобы мы не имели дело с реальными деньгами).

Если вы не видите Sepolia в списке, откройте меню в правом верхнем углу, выберите «Networks» (Сети) и включите «Show test networks» (Показывать тестовые сети) внизу списка сетей (см. руководство МетаМаск по просмотру тестовых сетей (открывается в новой вкладке)). Затем выберите «Sepolia» в меню выбора сети.

metamask sepolia example

Шаг 4: Получение эфира из крана

Чтобы развернуть наш смарт-контракт в тестовой сети, нам понадобится немного тестового эфира. Чтобы получить Sepolia ETH, вы можете перейти к информации о сети Sepolia, чтобы просмотреть список различных кранов. Если один не работает, попробуйте другой, так как иногда они могут иссякать. В некоторых кранах есть правила допуска; например, кран Sepolia от Alchemy требует, чтобы на адресе получателя было не менее 0.001 ETH в основной сети Ethereum. Получение тестовых ETH может занять некоторое время из-за загруженности сети. Вскоре после этого вы должны увидеть ETH в своем аккаунте МетаМаск!

Шаг 5: Проверка баланса

Чтобы убедиться, что наш баланс пополнен, давайте сделаем запрос eth_getBalance с помощью инструмента composer от Alchemy (открывается в новой вкладке). Это вернет количество ETH в нашем кошельке. После того как вы введете адрес своего аккаунта МетаМаск и нажмете «Send Request» (Отправить запрос), вы должны увидеть примерно такой ответ:

{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }

ПРИМЕЧАНИЕ: Этот результат указан в Wei, а не в ETH. Wei используется как наименьший номинал эфира. Конвертация из Wei в ETH: 1 ETH = 1018 Wei. Таким образом, если мы переведем 0x2B5E3AF16B1880000 в десятичную систему, мы получим 5*10¹⁸, что равно 5 ETH.

Фух! Наши тестовые деньги на месте .

Шаг 6: Инициализация нашего проекта

Сначала нам нужно создать папку для нашего проекта. Перейдите в командную строку и введите:

mkdir hello-world
cd hello-world

Теперь, когда мы находимся в папке нашего проекта, мы используем npm init для инициализации проекта. Если у вас еще не установлен npm, следуйте инструкциям по установке Node.js (открывается в новой вкладке) (для этого руководства нам понадобятся Node.js и npm).

npm init

Не имеет особого значения, как вы ответите на вопросы при установке, вот как это сделали мы для примера:

Одобрите package.json. Hardhat 3, который мы установим следующим, поддерживает только проекты с модулями ES, поэтому отметьте проект соответствующим образом:

npm pkg set type=module

И мы готовы к работе!

Шаг 7: Скачивание Hardhat (открывается в новой вкладке)

Hardhat — это среда разработки для компиляции, развертывания, тестирования и отладки вашего программного обеспечения для Эфириума. Она помогает разработчикам при локальном создании смарт-контрактов и децентрализованных приложений (dapp) перед их развертыванием в рабочей цепи.

Hardhat 3 требует Node.js версии 22.13.0 или новее. Внутри нашего проекта hello-world выполните:

npm install --save-dev hardhat

Посетите эту страницу для получения более подробной информации об инструкциях по установке (открывается в новой вкладке).

Шаг 8: Создание проекта Hardhat

Выполнение npx hardhat --init сгенерировало бы полный пример проекта, но для этого руководства мы настроим все вручную, чтобы вы могли увидеть каждую деталь. В корневой папке вашего проекта создайте файл с именем hardhat.config.js со следующим содержимым:

import { defineConfig } from "hardhat/config"

export default defineConfig({
  solidity: "0.8.34",
})

Здесь мы укажем все настройки для нашего проекта (на шаге 13). Пока что это просто указывает Hardhat, какую версию компилятора Solidity использовать.

Шаг 9: Добавление папок проекта

Чтобы поддерживать порядок в нашем проекте, мы создадим две новые папки. Перейдите в корневой каталог вашего проекта в командной строке и введите:

mkdir contracts
mkdir scripts
  • contracts/ — здесь мы будем хранить файл кода нашего смарт-контракта hello world
  • scripts/ — здесь мы будем хранить скрипты для развертывания и взаимодействия с нашим контрактом

Шаг 10: Написание нашего контракта

Вы, наверное, спрашиваете себя: когда же мы, черт возьми, начнем писать код?? Что ж, вот мы и добрались до шага 10.

Откройте проект hello-world в вашем любимом редакторе (нам нравится VSCode (открывается в новой вкладке)). Смарт-контракты пишутся на языке под названием Solidity, который мы и будем использовать для написания нашего смарт-контракта HelloWorld.sol.‌

  1. Перейдите в папку «contracts» и создайте новый файл с именем HelloWorld.sol.
  2. Ниже приведен пример смарт-контракта Hello World от Фонда Ethereum, который мы будем использовать в этом руководстве. Скопируйте и вставьте приведенное ниже содержимое в ваш файл HelloWorld.sol и обязательно прочитайте комментарии, чтобы понять, что делает этот контракт:

Это очень простой смарт-контракт, который сохраняет сообщение при создании и может быть обновлен путем вызова функции update.

Шаг 11: Подключение МетаМаск и Alchemy к вашему проекту

Мы создали кошелек МетаМаск, аккаунт Alchemy и написали наш смарт-контракт, теперь пришло время соединить их вместе.

Каждая транзакция, отправленная с вашего виртуального кошелька, требует подписи с использованием вашего уникального приватного ключа. Чтобы предоставить нашей программе это разрешение, мы можем безопасно сохранить наш приватный ключ (и ключ программного интерфейса приложения (API) Alchemy) в файле среды.

Чтобы узнать больше об отправке транзакций, ознакомьтесь с документацией по транзакциям.

Создайте файл .env в корневом каталоге нашего проекта и добавьте в него ваш приватный ключ МетаМаск и HTTP-адрес API Alchemy.

get alchemy api key

Скопируйте URL-адрес API Alchemy

Ваш файл .env должен выглядеть так:

API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"

Чтобы фактически подключить их к нашему коду, мы сошлемся на эти переменные в нашем файле hardhat.config.js на шаге 13. Node.js может самостоятельно читать файлы .env, поэтому устанавливать дополнительные пакеты не нужно.

Не коммитьте .env! Пожалуйста, убедитесь, что вы никогда не делитесь и не раскрываете свой файл .env кому-либо, так как тем самым вы ставите под угрозу свои секреты. Если вы используете систему контроля версий, добавьте ваш .env в файл gitignore.

Шаг 12: Установка Ethers.js

Ethers.js — это библиотека, которая упрощает взаимодействие и выполнение запросов к Эфириуму, оборачивая стандартные методы JSON-RPC в более удобные для пользователя методы.

Hardhat позволяет очень легко интегрировать плагины (открывается в новой вкладке) для дополнительных инструментов и расширенной функциональности. Мы воспользуемся плагином Ethers (открывается в новой вкладке) для развертывания контрактов (в Ethers.js (открывается в новой вкладке) есть очень удобные методы развертывания контрактов).

В каталоге вашего проекта введите:

npm install --save-dev @nomicfoundation/hardhat-ethers ethers

Мы также добавим плагин в наш hardhat.config.js на следующем шаге.

Шаг 13: Обновление hardhat.config.js

К этому моменту мы добавили несколько зависимостей и плагинов, теперь нам нужно обновить hardhat.config.js, чтобы наш проект знал о них всех.

Обновите ваш hardhat.config.js, чтобы он выглядел так:

configVariable указывает Hardhat считывать каждое значение из переменной среды только тогда, когда это необходимо, поэтому такие команды, как compile, работают даже до того, как значения будут установлены. Если вы предпочитаете не хранить свой приватный ключ в виде обычного текстового файла, Hardhat также может считывать переменные конфигурации из зашифрованного хранилища ключей (открывается в новой вкладке).

Шаг 14: Компиляция нашего контракта

Чтобы убедиться, что пока все работает, давайте скомпилируем наш контракт. Задача compile — одна из встроенных задач Hardhat.

В командной строке выполните:

npx hardhat compile

При первой компиляции Hardhat скачивает компилятор Solidity. Затем вы должны увидеть что-то вроде Compiled 1 Solidity file with solc 0.8.34. Если нет, вы всегда можете написать в Дискорд Alchemy (открывается в новой вкладке).

Шаг 15: Написание нашего скрипта развертывания

Теперь, когда наш контракт написан, а файл конфигурации готов к работе, пришло время написать скрипт развертывания нашего контракта.

Перейдите в папку scripts/ и создайте новый файл с именем deploy.js, добавив в него следующее содержимое:

Давайте разберем, что делает каждая из этих строк кода.

const { ethers } = await network.create()

В Hardhat 3 скрипт явно открывает подключение к сети. network.create() подключается к сети, которую вы выбираете с помощью параметра --network при запуске скрипта, а плагин hardhat-ethers добавляет объект ethers к этому подключению.

const HelloWorld = await ethers.getContractFactory("HelloWorld")

ContractFactory в ethers.js — это абстракция, используемая для развертывания новых смарт-контрактов, поэтому HelloWorld здесь является фабрикой для экземпляров нашего контракта hello world. При использовании плагина hardhat-ethers экземпляры ContractFactory и Contract по умолчанию подключаются к первому подписанту.

const hello_world = await HelloWorld.deploy("Hello World!")

Вызов deploy() для ContractFactory запустит развертывание и вернет Promise, который разрешается в Contract. Это объект, который имеет метод для каждой из функций нашего смарт-контракта. Аргументы, которые вы передаете в deploy(), отправляются в конструктор контракта, в данном случае это начальное сообщение.

waitForDeployment() ожидает, пока транзакция развертывания не будет включена в блок, а getAddress() возвращает адрес нового контракта. Для получения более подробной информации см. документацию по контрактам ethers.js (открывается в новой вкладке).

Шаг 16: Развертывание нашего контракта

Мы наконец-то готовы развернуть наш смарт-контракт! Перейдите в командную строку и выполните:

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

Затем вы должны увидеть что-то вроде:

Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

Если мы перейдем в Etherscan для Sepolia (открывается в новой вкладке) и выполним поиск по адресу нашего контракта, мы сможем увидеть, что он был успешно развернут. Транзакция будет выглядеть примерно так:

etherscan contract

Адрес From должен совпадать с адресом вашего аккаунта МетаМаск, а в адресе To будет указано «Contract Creation», но если мы нажмем на транзакцию, мы увидим адрес нашего контракта в поле To:

etherscan transaction

Поздравляем! Вы только что развернули смарт-контракт в цепи Эфириума 🎉

Чтобы понять, как это работает технически, вы можете посмотреть на запросы, которые ваше приложение «Hello World» получило на панели управления Alchemy (открывается в новой вкладке).

Там вы увидите несколько вызовов JSON-RPC, которые Hardhat/Ethers сделали для нас внутренне, когда мы вызвали функцию .deploy(). Здесь стоит отметить два важных вызова: eth_sendRawTransaction — это запрос на фактическую запись нашего контракта в цепь Sepolia, и eth_getTransactionByHash — это запрос на чтение информации о нашей транзакции по заданному хешу (типичный паттерн при отправке транзакций). Чтобы узнать больше об отправке транзакций, ознакомьтесь с документацией по транзакциям.

На этом данное руководство завершено. Далее вы можете создать пользовательский интерфейс для вашего контракта.