---
title: "Смарт-контракт Hello World для начинающих"
description: "Вводное руководство по написанию и развертыванию простого смарт-контракта в Эфириуме."
author: "elanh"
tags: ["Solidity", "Hardhat", "Alchemy", "смарт-контракты", "развертывание"]
skill: beginner
breadcrumb: "Контракт Hello World"
lang: ru
published: 2021-03-31
---

Если вы новичок в разработке на блокчейне и не знаете, с чего начать, или если вы просто хотите понять, как развернуть смарт-контракты и взаимодействовать с ними, это руководство для вас. Мы пройдем через создание и развертывание простого смарт-контракта в тестовой сети Sepolia, используя виртуальный кошелек [МетаМаск](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) и [Alchemy](https://www.alchemy.com/eth) (не волнуйтесь, если вы пока не понимаете, что все это значит, мы все объясним).

Во [второй части](/developers/tutorials/hello-world-smart-contract-fullstack/#part-2-interact-with-your-smart-contract) этого руководства мы рассмотрим, как можно взаимодействовать с нашим смарт-контрактом после его развертывания, а в [третьей части](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan) мы расскажем, как опубликовать его на Etherscan.

Если у вас возникнут вопросы на любом этапе, не стесняйтесь обращаться в [Дискорд Alchemy](https://discord.gg/gWuC7zB)!

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

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

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

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

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

![Hello world create app](./hello-world-create-app.png)

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

![create app view hello world](./create-app-view-hello-world.png)

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

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

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

Вы можете скачать МетаМаск и бесплатно создать аккаунт Эфириума [здесь](https://metamask.io/download). При создании аккаунта, или если он у вас уже есть, обязательно переключитесь на тестовую сеть «Sepolia» с помощью выпадающего меню сетей (чтобы мы не имели дело с реальными деньгами).

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

![metamask sepolia example](./metamask-sepolia-example.png)

## Шаг 4: Добавление эфира из крана {#step-4}

Чтобы развернуть наш смарт-контракт в тестовой сети, нам понадобится немного тестового ETH. Чтобы получить Sepolia ETH, вы можете перейти к [деталям сети Sepolia](/developers/docs/networks/#sepolia), чтобы просмотреть список различных кранов. Если один не работает, попробуйте другой, так как иногда они могут иссякать. Получение тестового ETH может занять некоторое время из-за загруженности сети. Вскоре после этого вы должны увидеть ETH в своем аккаунте МетаМаск!

## Шаг 5: Проверка баланса {#step-5}

Чтобы убедиться, что наш баланс пополнен, давайте сделаем запрос [eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance) с помощью [инструмента composer от Alchemy](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest). Это вернет количество ETH в нашем кошельке. После того как вы введете адрес своего аккаунта МетаМаск и нажмете «Send Request» (Отправить запрос), вы должны увидеть примерно такой ответ:

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

> **ПРИМЕЧАНИЕ:** Этот результат указан в Wei, а не в ETH. Wei используется как наименьший номинал эфира. Конвертация из Wei в ETH: 1 ETH = 10<sup>18</sup> Wei. Таким образом, если мы переведем 0x2B5E3AF16B1880000 в десятичную систему, мы получим 5\*10¹⁸, что равно 5 ETH.
>
> Фух! Наши тестовые деньги на месте <Emoji text=":money_mouth_face:" size={1} />.

## Шаг 6: Инициализация нашего проекта {#step-6}

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

```
mkdir hello-world
cd hello-world
```

Теперь, когда мы находимся внутри папки нашего проекта, мы используем `npm init` для инициализации проекта. Если у вас еще не установлен npm, следуйте [инструкциям по установке Node.js](https://nodejs.org/en/download/) (для этого руководства нам понадобятся 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](https://hardhat.org/getting-started/#overview) {#step-7}

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

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

```
npm install --save-dev hardhat
```

Посетите эту страницу для получения более подробной информации об [инструкциях по установке](https://hardhat.org/getting-started/#overview).

## Шаг 8: Создание проекта Hardhat {#step-8}

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

```
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: Добавление папок проекта {#step-9}

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

```
mkdir contracts
mkdir scripts
```

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

## Шаг 10: Написание нашего контракта {#step-10}

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

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

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

```solidity
// Указывает версию 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 к вашему проекту {#step-11}

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

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

> Чтобы узнать больше об отправке транзакций, ознакомьтесь с [этим руководством](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) по отправке транзакций с использованием Web3.

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

```
npm install dotenv --save
```

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

- Следуйте [этим инструкциям](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/), чтобы экспортировать свой приватный ключ
- См. ниже, чтобы получить HTTP URL API Alchemy

![get alchemy api key](./get-alchemy-api-key.png)

Скопируйте 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.

<Alert variant="warning">
<AlertContent>
<AlertDescription>
Не коммитьте <code>.env</code>! Пожалуйста, убедитесь, что вы никогда не делитесь и не раскрываете свой файл <code>.env</code> кому-либо, так как тем самым вы ставите под угрозу свои секреты. Если вы используете систему контроля версий, добавьте ваш <code>.env</code> в файл <a href="https://git-scm.com/docs/gitignore">gitignore</a>.
</AlertDescription>
</AlertContent>
</Alert>

## Шаг 12: Установка Ethers.js {#step-12-install-ethersjs}

Ethers.js — это библиотека, которая упрощает взаимодействие и выполнение запросов к Эфириуму, оборачивая [стандартные методы JSON-RPC](/developers/docs/apis/json-rpc/) в более удобные для пользователя методы.

Hardhat позволяет очень легко интегрировать [плагины](https://hardhat.org/plugins/) для дополнительных инструментов и расширенной функциональности. Мы воспользуемся [плагином Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) для развертывания контракта (в [Ethers.js](https://github.com/ethers-io/ethers.js/) есть несколько очень удобных методов развертывания контрактов).

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

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

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

## Шаг 13: Обновление hardhat.config.js {#step-13-update-hardhatconfigjs}

К этому моменту мы добавили несколько зависимостей и плагинов, теперь нам нужно обновить `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: Компиляция нашего контракта {#step-14-compile-our-contracts}

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

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

```
npx hardhat compile
```

Вы можете получить предупреждение о `SPDX license identifier not provided in source file`, но об этом не стоит беспокоиться — надеемся, что все остальное выглядит хорошо! Если нет, вы всегда можете написать в [Дискорд Alchemy](https://discord.gg/u72VCg3).

## Шаг 15: Написание нашего скрипта развертывания {#step-15-write-our-deploy-scripts}

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

Перейдите в папку `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 отлично объясняет, что делает каждая из этих строк кода, в своем [руководстве по контрактам](https://hardhat.org/tutorial/testing-contracts.html#writing-tests), мы позаимствовали их объяснения здесь.

```
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: Развертывание нашего контракта {#step-16-deploy-our-contract}

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

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

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

```
Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
```

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

![etherscan contract](./etherscan-contract.png)

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

![etherscan transaction](./etherscan-transaction.png)

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

Чтобы понять, как это работает технически, давайте перейдем на вкладку «Explorer» (Обозреватель) на нашей [панели управления Alchemy](https://dashboard.alchemy.com/explorer). Если у вас несколько приложений Alchemy, обязательно отфильтруйте их по приложению и выберите «Hello World».
![hello world explorer](./hello-world-explorer.png)

Здесь вы увидите несколько вызовов JSON-RPC, которые Hardhat/Ethers сделали для нас в фоновом режиме, когда мы вызвали функцию `.deploy()`. Два важных вызова, которые стоит отметить здесь, — это [`eth_sendRawTransaction`](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-send-raw-transaction), который является запросом на фактическую запись нашего контракта в цепь Sepolia, и [`eth_getTransactionByHash`](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-get-transaction-by-hash), который является запросом на чтение информации о нашей транзакции по заданному хешу (типичный паттерн при транзакциях). Чтобы узнать больше об отправке транзакций, ознакомьтесь с этим руководством по [отправке транзакций с использованием Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/).

На этом первая часть данного руководства завершена. Во второй части мы будем [взаимодействовать с нашим смарт-контрактом](/developers/tutorials/hello-world-smart-contract-fullstack/#part-2-interact-with-your-smart-contract), обновив наше исходное сообщение, а в третьей части мы [опубликуем наш смарт-контракт на Etherscan](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan), чтобы все знали, как с ним взаимодействовать.

**Хотите узнать больше об Alchemy? Посетите наш [веб-сайт](https://www.alchemy.com/eth). Не хотите пропускать обновления? Подпишитесь на нашу рассылку [здесь](https://www.alchemy.com/newsletter)! Также обязательно присоединяйтесь к нашему [Дискорду](https://discord.gg/u72VCg3).**
