Смарт-контракт Hello World для начинающих
Если вы новичок в разработке на блокчейне и не знаете, с чего начать, или если вы просто хотите понять, как развернуть смарт-контракты и взаимодействовать с ними, это руководство для вас. Мы пройдем через создание и развертывание простого смарт-контракта в тестовой сети 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. Если вы не знакомы с тестовыми сетями, загляните на эту страницу.
- Перейдите на страницу «Create new app» (Создать новое приложение) на панели управления Alchemy, выбрав «Select an app» (Выбрать приложение) на панели навигации и нажав «Create new app».
- Назовите свое приложение «Hello World», добавьте краткое описание и выберите вариант использования, например, «Infra & Tooling» (Инфраструктура и инструменты). Затем найдите «Ethereum» и выберите сеть.
- Нажмите «Next» (Далее) для продолжения, затем «Create app» (Создать приложение), и все готово! Ваше приложение должно появиться в выпадающем меню на панели навигации, а ключ API будет доступен для копирования.
Шаг 3: Создание аккаунта Эфириума (адреса)
Нам нужен аккаунт Эфириума для отправки и получения транзакций. В этом руководстве мы будем использовать МетаМаск — виртуальный кошелек в браузере, используемый для управления адресом вашего аккаунта Эфириума. Подробнее о транзакциях.
Вы можете скачать МетаМаск и бесплатно создать аккаунт Эфириума здесь (opens in a new tab). При создании аккаунта, или если он у вас уже есть, обязательно переключитесь на тестовую сеть «Sepolia» с помощью выпадающего меню сетей (чтобы мы не имели дело с реальными деньгами).
Если вы не видите Sepolia в списке, зайдите в меню, затем в «Advanced» (Дополнительно) и прокрутите вниз, чтобы включить «Show test networks» (Показывать тестовые сети). В меню выбора сети перейдите на вкладку «Custom» (Пользовательские), чтобы найти список тестовых сетей, и выберите «Sepolia».
Шаг 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 name: (hello-world)
version: (1.0.0)
description: hello world smart contract
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/.../.../.../hello-world/package.json:
{
"name": "hello-world",
"version": "1.0.0",
"description": "hello world smart contract",
"main": "index.js",
"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1"
},
"author": "",
"license": "ISC"
}
Одобрите файл 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»:
888 888 888 888 888
888 888 888 888 888
888 888 888 888 888
8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
888 888 "88b 888P" d88" 888 888 "88b "88b 888
888 888 .d888888 888 888 888 888 888 .d888888 888
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
👷 Welcome to Hardhat v2.0.11 👷?
What do you want to do? …
Create a sample project
❯ Create an empty hardhat.config.js
Quit
Это сгенерирует для нас файл hardhat.config.js, в котором мы укажем все настройки для нашего проекта (на шаге 13).
Шаг 9: Добавление папок проекта
Чтобы поддерживать порядок в нашем проекте, мы создадим две новые папки. Перейдите в корневой каталог вашего проекта в командной строке и введите:
mkdir contracts
mkdir scripts
contracts/— здесь мы будем хранить файл кода нашего смарт-контракта hello worldscripts/— здесь мы будем хранить скрипты для развертывания и взаимодействия с нашим контрактом
Шаг 10: Написание нашего контракта
Вы можете спросить себя: когда же мы, черт возьми, будем писать код?? Что ж, вот мы и добрались до шага 10.
Откройте проект hello-world в вашем любимом редакторе (нам нравится VSCode (opens in a new tab)). Смарт-контракты пишутся на языке под названием Solidity, который мы и будем использовать для написания нашего смарт-контракта HelloWorld.sol.
- Перейдите в папку «contracts» и создайте новый файл с именем HelloWorld.sol
- Ниже приведен пример смарт-контракта Hello World от Фонда Ethereum, который мы будем использовать в этом руководстве. Скопируйте и вставьте приведенное ниже содержимое в ваш файл HelloWorld.sol и обязательно прочитайте комментарии, чтобы понять, что делает этот контракт:
// Указывает версию Solidity, используя семантическое версионирование.
// Узнать больше: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity ^0.7.0;
// Определяет контракт с именем `HelloWorld`.
// Контракт — это набор функций и данных (его состояния). После того как контракт развернут, он находится по определенному адресу в Блокчейне Эфириум. Узнать больше: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract HelloWorld {
// Объявляет переменную состояния `message` типа `string`.
// Переменные состояния — это переменные, значения которых постоянно хранятся в хранилище контракта. Ключевое слово `public` делает переменные доступными извне контракта и создает функцию, которую могут вызывать другие контракты или клиенты для получения доступа к значению.
string public message;
// Как и во многих классовых объектно-ориентированных языках, конструктор — это специальная функция, которая выполняется только при создании контракта.
// Конструкторы используются для инициализации данных контракта. Узнать больше:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
constructor(string memory initMessage) {
// Принимает строковый аргумент `initMessage` и устанавливает значение в переменную хранилища контракта `message`).
message = initMessage;
}
// Публичная функция, которая принимает строковый аргумент и обновляет переменную хранилища `message`.
function update(string memory newMessage) public {
message = newMessage;
}
}
Это суперпростой смарт-контракт, который сохраняет сообщение при создании и может быть обновлен путем вызова функции update.
Шаг 11: Подключение МетаМаск и Alchemy к вашему проекту
Мы создали кошелек МетаМаск, аккаунт Alchemy и написали наш смарт-контракт, теперь пришло время соединить их вместе.
Каждая транзакция, отправленная с вашего виртуального кошелька, требует подписи с использованием вашего уникального приватного ключа. Чтобы предоставить нашей программе это разрешение, мы можем безопасно сохранить наш приватный ключ (и ключ API Alchemy) в файле среды.
Чтобы узнать больше об отправке транзакций, ознакомьтесь с этим руководством по отправке транзакций с использованием Web3.
Сначала установите пакет dotenv в каталоге вашего проекта:
npm install dotenv --save
Затем создайте файл .env в корневом каталоге нашего проекта и добавьте в него ваш приватный ключ МетаМаск и HTTP URL API Alchemy.
- Следуйте этим инструкциям (opens in a new tab), чтобы экспортировать свой приватный ключ
- См. ниже, чтобы получить HTTP URL API Alchemy
Скопируйте 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, чтобы он выглядел так:
require('dotenv').config();
require("@nomiclabs/hardhat-ethers");
const { API_URL, PRIVATE_KEY } = process.env;
/**
* @type import('hardhat/config').HardhatUserConfig
*/
module.exports = {
solidity: "0.7.3",
defaultNetwork: "sepolia",
networks: {
hardhat: {},
sepolia: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
},
}
Шаг 14: Компиляция нашего контракта
Чтобы убедиться, что пока все работает, давайте скомпилируем наш контракт. Задача compile — одна из встроенных задач Hardhat.
Из командной строки выполните:
npx hardhat compile
Вы можете получить предупреждение о SPDX license identifier not provided in source file, но об этом не стоит беспокоиться — надеемся, что все остальное выглядит хорошо! Если нет, вы всегда можете написать в Дискорд Alchemy (opens in a new tab).
Шаг 15: Написание нашего скрипта развертывания
Теперь, когда наш контракт написан, а конфигурационный файл готов к работе, пришло время написать скрипт развертывания нашего контракта.
Перейдите в папку scripts/ и создайте новый файл с именем deploy.js, добавив в него следующее содержимое:
async function main() {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
// Начать развертывание, возвращая промис, который разрешается в объект контракта
const hello_world = await HelloWorld.deploy("Hello World!");
console.log("Contract deployed to address:", hello_world.address);}
main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});
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) и выполним поиск по адресу нашего контракта, мы должны увидеть, что он был успешно развернут. Транзакция будет выглядеть примерно так:
Адрес From должен совпадать с адресом вашего аккаунта МетаМаск, а в адресе «To» (Кому) будет указано «Contract Creation» (Создание контракта), но если мы нажмем на транзакцию, мы увидим адрес нашего контракта в поле To:
Поздравляем! Вы только что развернули смарт-контракт в цепи Эфириума 🎉
Чтобы понять, как это работает технически, давайте перейдем на вкладку «Explorer» (Обозреватель) на нашей панели управления Alchemy (opens in a new tab). Если у вас несколько приложений Alchemy, обязательно отфильтруйте их по приложению и выберите «Hello World».

Здесь вы увидите несколько вызовов 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).





