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

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

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

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

Во второй части этого руководства мы рассмотрим, как можно взаимодействовать с нашим смарт-контрактом после его развертывания, а в третьей части мы расскажем, как опубликовать его на Etherscan.

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

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

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

Шаг 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: Создание аккаунта Эфириума (адреса)

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

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

Если вы не видите Sepolia в списке, зайдите в меню, затем в «Advanced» (Дополнительно) и прокрутите вниз, чтобы включить «Show test networks» (Показывать тестовые сети). В меню выбора сети перейдите на вкладку «Custom» (Пользовательские), чтобы найти список тестовых сетей, и выберите «Sepolia».

metamask sepolia example

Шаг 4: Добавление эфира из крана

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

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

Чтобы убедиться, что наш баланс пополнен, давайте сделаем запрос eth_getBalance с помощью инструмента composer от Alchemy (opens in a new tab). Это вернет количество 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 (opens in a new tab) (для этого руководства нам понадобятся Node.js и npm).

npm init

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

Одобрите файл package.json, и мы готовы к работе!

Шаг 7: Загрузка Hardhat (opens in a new tab)

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

Внутри нашего проекта hello-world выполните:

npm install --save-dev hardhat

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

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

Внутри папки нашего проекта выполните:

npx hardhat

Затем вы должны увидеть приветственное сообщение и возможность выбрать, что вы хотите сделать. Выберите «create an empty hardhat.config.js»:

Это сгенерирует для нас файл hardhat.config.js, в котором мы укажем все настройки для нашего проекта (на шаге 13).

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

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

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

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

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

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

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

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

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

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

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

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

Сначала установите пакет dotenv в каталоге вашего проекта:

npm install dotenv --save

Затем создайте файл .env в корневом каталоге нашего проекта и добавьте в него ваш приватный ключ МетаМаск и HTTP URL 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.

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

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

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

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

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

npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"

Нам также потребуется ethers в нашем hardhat.config.js на следующем шаге.

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

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

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

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

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

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

npx hardhat compile

Вы можете получить предупреждение о SPDX license identifier not provided in source file, но об этом не стоит беспокоиться — надеемся, что все остальное выглядит хорошо! Если нет, вы всегда можете написать в Дискорд Alchemy (opens in a new tab).

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

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

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

Hardhat отлично объясняет, что делает каждая из этих строк кода, в своем руководстве по контрактам (opens in a new tab), мы позаимствовали их объяснения здесь.

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

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

const hello_world = await HelloWorld.deploy();

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

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

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

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

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

Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

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

etherscan contract

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

etherscan transaction

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

Чтобы понять, как это работает технически, давайте перейдем на вкладку «Explorer» (Обозреватель) на нашей панели управления Alchemy (opens in a new tab). Если у вас несколько приложений Alchemy, обязательно отфильтруйте их по приложению и выберите «Hello World». hello world explorer

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

На этом первая часть данного руководства завершена. Во второй части мы будем взаимодействовать с нашим смарт-контрактом, обновив наше исходное сообщение, а в третьей части мы опубликуем наш смарт-контракт на Etherscan, чтобы все знали, как с ним взаимодействовать.

Хотите узнать больше об Alchemy? Посетите наш веб-сайт (opens in a new tab). Не хотите пропускать обновления? Подпишитесь на нашу рассылку здесь (opens in a new tab)! Также обязательно присоединяйтесь к нашему Дискорду (opens in a new tab).