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

Смарт-контракт Hello World для початківців

Solidity
Hardhat
Alchemy
Смарт-контракти
розгортання
Початківець
elanh
31 березня 2021 р.
11 читається за хвилину

Якщо ви новачок у розробці на блокчейні та не знаєте, з чого почати, або якщо ви просто хочете зрозуміти, як розгортати та взаємодіяти зі смарт-контрактами, цей посібник для вас. Ми розглянемо створення та розгортання простого смарт-контракту в тестовій мережі Sepolia, використовуючи віртуальний гаманець MetaMask (opens in a new tab), Solidity (opens in a new tab), Hardhat (opens in a new tab) та Alchemy (opens in a new tab) (не хвилюйтеся, якщо ви ще не розумієте, що все це означає, ми це пояснимо).

У частині 2 (opens in a new tab) цього посібника ми розглянемо, як можна взаємодіяти з нашим смарт-контрактом після його розгортання, а в частині 3 (opens in a new tab) ми розповімо, як опублікувати його на Etherscan.

Якщо у вас виникнуть запитання, сміливо звертайтеся в Alchemy Discord (opens in a new tab)!

Крок 1: Підключення до мережі Ethereum

Існує багато способів робити запити до ланцюга Ethereum. Для простоти ми будемо використовувати безкоштовний обліковий запис на Alchemy, платформі для розробників блокчейну та API, яка дозволяє нам взаємодіяти з ланцюгом Ethereum без необхідності запускати власні вузли. Платформа також має інструменти розробника для моніторингу та аналітики, якими ми скористаємося в цьому посібнику, щоб зрозуміти, що відбувається «під капотом» під час розгортання нашого смарт-контракту. Якщо у вас ще немає облікового запису Alchemy, ви можете безкоштовно зареєструватися тут (opens in a new tab).

Крок 2: Створення вашого застосунку (та ключа API)

Після того, як ви створили обліковий запис у Alchemy, ви можете зробити ключ API, створивши додаток. Це дозволить нам робити запити до тестової мережі Sepolia. Якщо ви не знайомі з тестовими мережами, перегляньте цю сторінку.

  1. Перейдіть на сторінку "Create new app" у вашій Alchemy Dashboard, вибравши "Select an app" на панелі навігації та натиснувши "Create new app".

Створення застосунку Hello World

  1. Назвіть ваш застосунок «Hello World», надайте короткий опис і виберіть варіант використання, наприклад, "Infra & Tooling." Далі знайдіть «Ethereum» і виберіть мережу.

Створення застосунку Hello World

  1. Натисніть «Next», щоб продовжити, потім «Create app», і все! Ваш застосунок має з’явитися у випадному меню панелі навігації, а ключ API буде доступний для копіювання.

Крок 3: Створення облікового запису Ethereum (адреси)

Нам потрібен обліковий запис Ethereum для надсилання та отримання транзакцій. Для цього уроку ми будемо використовувати MetaMask, віртуальний гаманець в браузері, який використовується для керування адресою облікового запису Ethereum. Більше про транзакції.

Ви можете безкоштовно завантажити MetaMask і створити обліковий запис Ethereum тут (opens in a new tab). Коли ви створюєте обліковий запис, або якщо у вас уже є обліковий запис, обов’язково переключіться на тестову мережу «Sepolia» за допомогою випадаючого меню мережі (щоб ми не мали справу з реальними грошима).

Якщо ви не бачите Sepolia в списку, перейдіть до меню, потім у «Розширені» та прокрутіть униз, щоб увімкнути перемикач «Показувати тестові мережі». У меню вибору мережі виберіть вкладку «Користувацька», щоб знайти список тестових мереж, і виберіть «Sepolia».

Приклад MetaMask Sepolia

Крок 4: Додавання Ether із крана

Щоб розгорнути наш смарт-контракт у тестовій мережі, нам знадобляться тестові Eth. Щоб отримати тестові ETH у мережі Sepolia, ви можете перейти до деталей мережі Sepolia, щоб переглянути список різних кранів. Якщо один не працює, спробуйте інший, оскільки їхній баланс іноді може вичерпуватися. Отримання тестових ETH може зайняти деякий час через навантаження на мережу. Незабаром після цього ви повинні побачити ETH у своєму обліковому записі MetaMask!

Крок 5: Перевірка балансу

Щоб перевірити наш баланс, давайте зробимо запит eth_getBalance за допомогою інструмента Composer від Alchemy (opens in a new tab). Це поверне кількість ETH в ваш гаманець. Після введення вашої адреси облікового запису MetaMask і натисніть кнопку "Відправити запит", ви повинні побачити таку відповідь:

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

ПРИМІТКА: Цей результат у wei, а не в ETH. Wei використовується в якості найменшого номіналу ether. Конвертація з wei в ETH: 1 eth = 1018 wei. Отже, якщо ми конвертуємо 0x2B5E3AF16B1880000 у десяткове число, ми отримаємо 5*10¹⁸, що дорівнює 5 ETH.

Фух! Наші тестові гроші на місці .

Крок 6: Ініціалізація нашого проєкту

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

1mkdir hello-world
2cd hello-world

Тепер, коли ми всередині папки нашого проєкту, ми використаємо npm init для ініціалізації проєкту. Якщо у вас ще не встановлено npm, виконайте ці інструкції (opens in a new tab) (нам також знадобиться Node.js, тож завантажте і його!).

1npm init

Насправді не має значення, як ви відповісте на запитання щодо встановлення, ось як ми це зробили для довідки:

1package name: (hello-world)
2version: (1.0.0)
3description: смарт-контракт hello world
4entry point: (index.js)
5test command:
6git repository:
7keywords:
8author:
9license: (ISC)
10About to write to /Users/.../.../.../hello-world/package.json:
11
12{
13 "name": "hello-world",
14 "version": "1.0.0",
15 "description": "смарт-контракт hello world",
16 "main": "index.js",
17 "scripts": {
18 "test": "echo \"Помилка: тест не вказано\" && exit 1"
19 },
20 "author": "",
21 "license": "ISC"
22}
Показати все

Підтвердіть package.json, і можемо продовжувати!

Крок 7: Завантаження Hardhat (opens in a new tab)

Hardhat є середовищем розробки для компіляції, розгортання, тестування та налагодження вашого програмного забезпечення Ethereum. Це допомагає розробникам створювати смарт-контракти та dapp локально перед розгортанням у реальний ланцюжок.

Усередині нашого проєкту hello-world запустіть:

1npm install --save-dev hardhat

Перегляньте цю сторінку, щоб дізнатися більше про інструкції з установки (opens in a new tab).

Крок 8: Створення проєкту Hardhat

Всередині папки проєкту запустіть:

1npx hardhat

Потім ви маєте побачити вітальне повідомлення та вибір подальших бажаних дій. Оберіть "Створити порожній hardhat.config.js":

1888 888 888 888 888
2888 888 888 888 888
3888 888 888 888 888
48888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
5888 888 "88b 888P" d88" 888 888 "88b "88b 888
6888 888 .d888888 888 888 888 888 888 .d888888 888
7888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
8888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
9
10👷 Ласкаво просимо до Hardhat v2.0.11 👷‍?
11
12Що ви хочете зробити? …
13Створити зразок проєкту
14❯ Створити порожній hardhat.config.js
15Вийти
Показати все

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

Крок 9: Додавання папок проєкту

Щоб наш проєкт був упорядкованим, ми створимо дві нові папки. Перейдіть до кореневого каталогу вашого проєкту у командному рядку та надрукуйте:

1mkdir contracts
2mkdir 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 Foundation, який ми будемо використовувати в цьому посібнику. Скопіюйте та вставте наведений нижче вміст у свій файл HelloWorld.sol і обов’язково прочитайте коментарі, щоб зрозуміти, що робить цей контракт:
1// Указує версію Solidity з використанням семантичного версіонування.
2// Докладніше: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
3pragma solidity ^0.7.0;
4
5// Визначає контракт з назвою `HelloWorld`.
6// Контракт — це набір функцій і даних (його стану). Після розгортання контракт знаходиться за певною адресою в блокчейні Ethereum. Докладніше: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
7contract HelloWorld {
8
9 // Оголошує змінну стану `message` типу `string`.
10 // Змінні стану — це змінні, значення яких постійно зберігаються в сховищі контракту. Ключове слово `public` робить змінні доступними ззовні контракту та створює функцію, яку інші контракти або клієнти можуть викликати для доступу до значення.
11 string public message;
12
13 // Подібно до багатьох класово-орієнтованих мов, конструктор — це спеціальна функція, яка виконується лише під час створення контракту.
14 // Конструктори використовуються для ініціалізації даних контракту. Докладніше:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
15 constructor(string memory initMessage) {
16
17 // Приймає рядковий аргумент `initMessage` і встановлює значення в змінну сховища контракту `message`).
18 message = initMessage;
19 }
20
21 // Публічна функція, яка приймає рядковий аргумент і оновлює змінну сховища `message`.
22 function update(string memory newMessage) public {
23 message = newMessage;
24 }
25}
Показати все

Це дуже простий смарт-контракт, який зберігає повідомлення під час створення та може бути оновлений шляхом виклику функції update.

Крок 11: Підключення MetaMask та Alchemy до вашого проєкту

Ми створили гаманець MetaMask, обліковий запис Alchemy і написали наш смарт-контракт, тепер час з’єднати всі три компоненти.

Для кожної транзакції, що відправляється з вашого віртуального гаманця, потрібен підпис, який можна зробити, використавши ваш унікальний приватний ключ. Щоб надати програмі цей дозвіл, ми можемо безпечно зберегти наш приватний ключ (і ключ API Alchemy) у файлі environment.

Щоб дізнатися більше про надсилання транзакцій, перегляньте цей посібник про надсилання транзакцій за допомогою web3.

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

1npm install dotenv --save

Потім створіть файл .env у кореневому каталозі нашого проєкту та додайте до нього свій приватний ключ MetaMask та URL-адресу HTTP Alchemy API.

Отримання ключа Alchemy API

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

Ваш .env повинен виглядати так:

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

Щоб підключити їх до нашого коду, ми будемо посилатися на ці змінні в нашому файлі hardhat.config.js на кроці 13.

Крок 12: Встановлення Ethers.js

Ethers.js — це бібліотека, яка полегшує взаємодію та надсилання запитів до Ethereum, огортаючи стандартні методи JSON-RPC у більш зручні для користувача методи.

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

У каталозі вашого проєкту надрукуйте:

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

Ми також підключимо ethers у нашому hardhat.config.js на наступному кроці.

Крок 13: Оновлення hardhat.config.js

Ми вже додали кілька залежностей і плагінів, тепер нам потрібно оновити hardhat.config.js, щоб наш проєкт знав про них усі.

Оновіть ваш hardhat.config.js так, щоб він виглядав наступним чином:

1require('dotenv').config();
2
3require("@nomiclabs/hardhat-ethers");
4const { API_URL, PRIVATE_KEY } = process.env;
5
6/**
7* @type import('hardhat/config').HardhatUserConfig
8*/
9module.exports = {
10 solidity: "0.7.3",
11 defaultNetwork: "sepolia",
12 networks: {
13 hardhat: {},
14 sepolia: {
15 url: API_URL,
16 accounts: [`0x${PRIVATE_KEY}`]
17 }
18 },
19}
Показати все

Крок 14: Компіляція нашого контракту

Щоб переконатися, що все працює, скомпілюймо наш контракт. Завдання compile є одним із вбудованих завдань Hardhat.

З командного рядка запустіть:

1npx hardhat compile

Ви можете отримати попередження про SPDX license identifier not provided in source file (ідентифікатор ліцензії SPDX не надано у вихідному файлі), але не варто про це турбуватися — сподіваємось, усе інше виглядає добре! Якщо ні, ви завжди можете написати повідомлення в Discord-каналі Alchemy (opens in a new tab).

Крок 15: Написання нашого скрипту розгортання

Тепер, коли контракт написано, і файл конфігурації готовий до запуску, настав час написати скрипт розгортання контракту.

Перейдіть до папки scripts/ і створіть новий файл deploy.js, додавши до нього такий вміст:

1async function main() {
2 const HelloWorld = await ethers.getContractFactory("HelloWorld");
3
4 // Розпочати розгортання, повертаючи проміс, який перетворюється на об’єкт контракту
5 const hello_world = await HelloWorld.deploy("Привіт, світе!");
6 console.log("Контракт розгорнуто за адресою:", hello_world.address);}
7
8main()
9 .then(() => process.exit(0))
10 .catch(error => {
11 console.error(error);
12 process.exit(1);
13 });
Показати все

Hardhat чудово пояснює, що робить кожен із цих рядків коду, у своєму посібнику з контрактів (opens in a new tab), ми використали їхні пояснення тут.

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

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

1const hello_world = await HelloWorld.deploy();

Виклик deploy() для ContractFactory запустить розгортання та поверне Promise, який перетворюється на Contract. Це об'єкт, у якого є метод для кожної з наших функцій смартконтракту.

Крок 16: Розгортання нашого контракту

Ми нарешті готові розгорнути наш розумний контракт! Перейдіть до командного рядка та запустіть:

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

Тоді ви повинні побачити щось на кшталт:

1Контракт розгорнуто за адресою: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

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

Контракт на Etherscan

Адреса From (Відправник) має збігатися з адресою вашого облікового запису MetaMask, а адреса To (Одержувач) буде позначена як «Створення контракту», але якщо ми клацнемо на транзакцію, то побачимо адресу нашого контракту в полі To:

Транзакція на Etherscan

Вітаємо! Ви щойно розгорнули смарт-контракт у блокчейні Ethereum 🎉

Щоб зрозуміти, що відбувається «під капотом», перейдімо на вкладку «Explorer» на нашій панелі інструментів Alchemy (opens in a new tab). Якщо у вас кілька застосунків Alchemy, обов’язково відфільтруйте їх за застосунком і виберіть «Hello World». Провідник Hello World

Тут ви побачите кілька викликів JSON-RPC, які Hardhat/Ethers зробили для нас «під капотом», коли ми викликали функцію .deploy(). Тут варто виділити два важливі виклики: eth_sendRawTransaction (opens in a new tab), який є запитом на фактичний запис нашого контракту в ланцюг Sepolia, і eth_getTransactionByHash (opens in a new tab), який є запитом на читання інформації про нашу транзакцію за її хешем (типовий шаблон під час роботи з транзакціями). Щоб дізнатися більше про надсилання транзакцій, перегляньте цей посібник про надсилання транзакцій за допомогою Web3

Це все для частини 1 цього посібника, у частині 2 ми фактично взаємодіятимемо з нашим смарт-контрактом (opens in a new tab), оновивши наше початкове повідомлення, а в частині 3 ми опублікуємо наш смарт-контракт на Etherscan (opens in a new tab), щоб усі знали, як з ним взаємодіяти.

Хочете дізнатися більше про Alchemy? Відвідайте наш вебсайт (opens in a new tab). Не хочете пропускати оновлення? Підпишіться на нашу розсилку тут (opens in a new tab)! Також обов’язково приєднуйтесь до нашого Discord (opens in a new tab)..

Останні оновлення сторінки: 5 грудня 2025 р.

Чи була ця інструкція корисною?