Як розробляти та тестувати dapp у локальній багатоклієнтській тестовій мережі
Вступ
Цей посібник проведе вас через процес створення налаштовуваної локальної тестової мережі Етеріуму, розгортання в ній смарт-контракту та використання тестової мережі для запуску тестів вашого децентралізованого застосунку (dapp). Цей посібник призначений для розробників dapp, які хочуть розробляти та тестувати свої застосунки локально з різними конфігураціями мережі перед розгортанням у живій тестовій мережі або Головній мережі.
У цьому посібнику ви:
- Створите локальну тестову мережу Етеріуму за допомогою
eth-network-package(opens in a new tab), використовуючи Kurtosis (opens in a new tab), - Підключите середовище розробки dapp Hardhat до локальної тестової мережі для компіляції, розгортання та тестування dapp, а також
- Налаштуєте локальну тестову мережу, включно з такими параметрами, як кількість вузлів і конкретні пари клієнтів рівня виконання (EL) та рівня консенсусу (CL), щоб забезпечити робочі процеси розробки та тестування для різних конфігурацій мережі.
Що таке Kurtosis?
Kurtosis (opens in a new tab) — це компонована система збірки, призначена для налаштування багатоконтейнерних тестових середовищ. Зокрема, вона дозволяє розробникам створювати відтворювані середовища, які вимагають динамічної логіки налаштування, наприклад, тестові мережі блокчейну.
У цьому посібнику пакет Kurtosis eth-network-package розгортає локальну тестову мережу Етеріуму з підтримкою клієнта рівня виконання (EL) geth (opens in a new tab), а також клієнтів рівня консенсусу (CL) teku (opens in a new tab), lighthouse (opens in a new tab) та lodestar (opens in a new tab). Цей пакет слугує налаштовуваною та компонованою альтернативою мережам у таких фреймворках, як Hardhat Network, Ganache та Anvil. Kurtosis пропонує розробникам більший контроль і гнучкість над тестовими мережами, які вони використовують, що є головною причиною, чому Фундація Ethereum використовувала Kurtosis для тестування Злиття (opens in a new tab) і продовжує використовувати його для тестування оновлень мережі.
Налаштування Kurtosis
Перш ніж продовжити, переконайтеся, що ви:
- Встановили та запустили рушій Docker (opens in a new tab) на вашій локальній машині
- Встановили Kurtosis CLI (opens in a new tab) (або оновили його до останньої версії, якщо CLI вже встановлено)
- Встановили Node.js (opens in a new tab), yarn (opens in a new tab) та npx (opens in a new tab) (для вашого середовища dapp)
Створення локальної тестової мережі Етеріуму
Щоб розгорнути локальну тестову мережу Етеріуму, виконайте:
kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-package
Примітка: Ця команда називає вашу мережу «local-eth-testnet» за допомогою прапорця --enclave.
Kurtosis виводитиме кроки, які він виконує внутрішньо, під час інтерпретації, перевірки та виконання інструкцій. Наприкінці ви побачите вивід, схожий на цей:
INFO[2023-04-04T18:09:44-04:00] ======================================================
INFO[2023-04-04T18:09:44-04:00] || Created enclave: local-eth-testnet ||
INFO[2023-04-04T18:09:44-04:00] ======================================================
Name: local-eth-testnet
UUID: 39372d756ae8
Status: RUNNING
Creation Time: Tue, 04 Apr 2023 18:09:03 EDT
========================================= Files Artifacts =========================================
UUID Name
d4085a064230 cl-genesis-data
1c62cb792e4c el-genesis-data
bd60489b73a7 genesis-generation-config-cl
b2e593fe5228 genesis-generation-config-el
d552a54acf78 geth-prefunded-keys
5f7e661eb838 prysm-password
054e7338bb59 validator-keystore-0
========================================== User Services ==========================================
UUID Name Ports Status
e20f129ee0c5 cl-client-0-beacon http: 4000/tcp -> <http://127.0.0.1:54261> RUNNING
metrics: 5054/tcp -> <http://127.0.0.1:54262>
tcp-discovery: 9000/tcp -> 127.0.0.1:54263
udp-discovery: 9000/udp -> 127.0.0.1:60470
a8b6c926cdb4 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:54267 RUNNING
metrics: 5064/tcp -> <http://127.0.0.1:54268>
d7b802f623e8 el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:54253 RUNNING
rpc: 8545/tcp -> 127.0.0.1:54251
tcp-discovery: 30303/tcp -> 127.0.0.1:54254
udp-discovery: 30303/udp -> 127.0.0.1:53834
ws: 8546/tcp -> 127.0.0.1:54252
514a829c0a84 prelaunch-data-generator-1680646157905431468 <none> STOPPED
62bd62d0aa7a prelaunch-data-generator-1680646157915424301 <none> STOPPED
05e9619e0e90 prelaunch-data-generator-1680646157922872635 <none> STOPPED
Вітаємо! Ви використали Kurtosis для створення локальної тестової мережі Етеріуму з клієнтом CL (lighthouse) та EL (geth) через Docker.
Огляд
У цьому розділі ви виконали команду, яка вказала Kurtosis використати eth-network-package, розміщений віддалено на GitHub (opens in a new tab), щоб розгорнути локальну тестову мережу Етеріуму в межах Enclave (opens in a new tab) Kurtosis. Усередині вашого анклаву ви знайдете як «файлові артефакти» (file artifacts), так і «користувацькі сервіси» (user services).
Файлові артефакти (opens in a new tab) у вашому анклаві включають усі дані, згенеровані та використані для початкового завантаження клієнтів EL та CL. Дані були створені за допомогою сервісу prelaunch-data-generator, зібраного з цього образу Docker (opens in a new tab).
Користувацькі сервіси відображають усі контейнеризовані сервіси, що працюють у вашому анклаві. Ви помітите, що було створено один вузол, який містить як клієнт EL, так і клієнт CL.
Підключення середовища розробки dapp до локальної тестової мережі Етеріуму
Налаштування середовища розробки dapp
Тепер, коли у вас запущена локальна тестова мережа, ви можете підключити середовище розробки dapp для її використання. У цьому посібнику буде використано фреймворк Hardhat для розгортання dapp для гри в блекджек у вашій локальній тестовій мережі.
Щоб налаштувати середовище розробки dapp, клонуйте репозиторій, який містить наш зразок dapp, і встановіть його залежності, виконавши:
git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarn
Папка smart-contract-example (opens in a new tab), яка тут використовується, містить типове налаштування для розробника dapp, що використовує фреймворк Hardhat (opens in a new tab):
contracts/(opens in a new tab) містить кілька простих смарт-контрактів для dapp блекджекуscripts/(opens in a new tab) містить скрипт для розгортання контракту токена у вашій локальній мережі Етеріумуtest/(opens in a new tab) містить простий .js тест для вашого контракту токена, щоб підтвердити, що для кожного гравця в нашому dapp блекджеку викарбувано 1000 токенівhardhat.config.ts(opens in a new tab) налаштовує вашу конфігурацію Hardhat
Налаштування Hardhat для використання локальної тестової мережі
Після налаштування середовища розробки dapp ви підключите Hardhat для використання локальної тестової мережі Етеріуму, згенерованої за допомогою Kurtosis. Для цього замініть <$YOUR_PORT> у структурі localnet у вашому файлі конфігурації hardhat.config.ts на порт RPC URI, виведений з будь-якого сервісу el-client-<num>. У цьому прикладі портом буде 64248. Ваш порт буде іншим.
Приклад у hardhat.config.ts:
localnet: {
url: 'http://127.0.0.1:<$YOUR_PORT>',// TODO: ЗАМІНІТЬ $YOUR_PORT НА ПОРТ URI ВУЗЛА, СТВОРЕНОГО ПАКЕТОМ МЕРЕЖІ ETH KURTOSIS
// Це приватні ключі, пов'язані з попередньо поповненими тестовими обліковими записами, створеними пакетом eth-network-package
// <https://github.com/kurtosis-tech/eth-network-package/blob/main/src/prelaunch_data_generator/genesis_constants/genesis_constants.star>
accounts: [
"ef5177cd0b6b21c87db5a0bf35d4084a8a57a9d6a064f86d51ac85f2b873a4e2",
"48fcc39ae27a0e8bf0274021ae6ebd8fe4a0e12623d61464c498900b28feb567",
"7988b3a148716ff800414935b305436493e1f25237a2a03e5eebc343735e2f31",
"b3c409b6b0b3aa5e65ab2dc1930534608239a478106acf6f3d9178e9f9b00b35",
"df9bb6de5d3dc59595bcaa676397d837ff49441d211878c024eabda2cd067c9f",
"7da08f856b5956d40a72968f93396f6acff17193f013e8053f6fbb6c08c194d6",
],
},
Після збереження файлу ваше середовище розробки dapp Hardhat буде підключено до локальної тестової мережі Етеріуму! Ви можете перевірити, чи працює ваша тестова мережа, виконавши:
npx hardhat balances --network localnet
Вивід має виглядати приблизно так:
0x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 10000000000000000000000000
0x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 10000000000000000000000000
0xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 10000000000000000000000000
0x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 10000000000000000000000000
0x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 10000000000000000000000000
0x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000
Це підтверджує, що Hardhat використовує вашу локальну тестову мережу та виявляє попередньо поповнені акаунти, створені eth-network-package.
Розгортання та тестування dapp локально
Коли середовище розробки dapp повністю підключено до локальної тестової мережі Етеріуму, ви можете запускати робочі процеси розробки та тестування вашого dapp, використовуючи локальну тестову мережу.
Щоб скомпілювати та розгорнути смарт-контракт ChipToken.sol для локального прототипування та розробки, виконайте:
npx hardhat compile
npx hardhat run scripts/deploy.ts --network localnet
Вивід має виглядати приблизно так:
ChipToken deployed to: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d
Тепер спробуйте запустити тест simple.js для вашого локального dapp, щоб підтвердити, що для кожного гравця в нашому dapp блекджеку викарбувано 1000 токенів:
Вивід має виглядати приблизно так:
npx hardhat test --network localnet
Вивід має виглядати приблизно так:
ChipToken
mint
✔ should mint 1000 chips for PLAYER ONE
1 passing (654ms)
Огляд
На цьому етапі ви налаштували середовище розробки dapp, підключили його до локальної мережі Етеріуму, створеної Kurtosis, а також скомпілювали, розгорнули та запустили простий тест для вашого dapp.
Тепер давайте розглянемо, як можна налаштувати базову мережу для тестування наших dapp за різних конфігурацій мережі.
Налаштування локальної тестової мережі Етеріуму
Зміна конфігурацій клієнтів та кількості вузлів
Вашу локальну тестову мережу Етеріуму можна налаштувати на використання різних пар клієнтів EL та CL, а також різної кількості вузлів, залежно від сценарію та конкретної конфігурації мережі, яку ви хочете розробляти або тестувати. Це означає, що після налаштування ви можете розгорнути кастомізовану локальну тестову мережу та використовувати її для запуску тих самих робочих процесів (розгортання, тести тощо) за різних конфігурацій мережі, щоб переконатися, що все працює як очікувалося. Щоб дізнатися більше про інші параметри, які можна змінити, перейдіть за цим посиланням.
Спробуйте! Ви можете передати різні параметри конфігурації до eth-network-package через файл JSON. Цей JSON-файл параметрів мережі містить конкретні конфігурації, які Kurtosis використовуватиме для налаштування локальної мережі Етеріуму.
Візьміть файл конфігурації за замовчуванням і відредагуйте його, щоб розгорнути два вузли з різними парами EL/CL:
- Вузол 1 з
geth/lighthouse - Вузол 2 з
geth/lodestar - Вузол 3 з
geth/teku
Ця конфігурація створює гетерогенну мережу реалізацій вузлів Етеріуму для тестування вашого dapp. Тепер ваш файл конфігурації має виглядати так:
{
"participants":
[
{
"el_client_type": "geth",
"el_client_image": "",
"el_client_log_level": "",
"cl_client_type": "lighthouse",
"cl_client_image": "",
"cl_client_log_level": "",
"beacon_extra_params": [],
"el_extra_params": [],
"validator_extra_params": [],
"builder_network_params": null,
},
{
"el_client_type": "geth",
"el_client_image": "",
"el_client_log_level": "",
"cl_client_type": "lodestar",
"cl_client_image": "",
"cl_client_log_level": "",
"beacon_extra_params": [],
"el_extra_params": [],
"validator_extra_params": [],
"builder_network_params": null,
},
{
"el_client_type": "geth",
"el_client_image": "",
"el_client_log_level": "",
"cl_client_type": "teku",
"cl_client_image": "",
"cl_client_log_level": "",
"beacon_extra_params": [],
"el_extra_params": [],
"validator_extra_params": [],
"builder_network_params": null,
},
],
"network_params":
{
"preregistered_validator_keys_mnemonic": "giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete",
"num_validator_keys_per_node": 64,
"network_id": "3151908",
"deposit_contract_address": "0x4242424242424242424242424242424242424242",
"seconds_per_slot": 12,
"genesis_delay": 120,
"capella_fork_epoch": 5,
},
}
Кожна структура participants відповідає вузлу в мережі, тому 3 структури participants вкажуть Kurtosis розгорнути 3 вузли у вашій мережі. Кожна структура participants дозволить вам вказати пару EL та CL, що використовується для цього конкретного вузла.
Структура network_params налаштовує параметри мережі, які використовуються для створення файлів генезису для кожного вузла, а також інші параметри, як-от кількість секунд на слот мережі.
Збережіть відредагований файл параметрів у будь-якому каталозі за вашим бажанням (у прикладі нижче він збережений на робочому столі), а потім використайте його для запуску вашого пакета Kurtosis, виконавши:
kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)"
Примітка: команда kurtosis clean -a використовується тут, щоб дати вказівку Kurtosis знищити стару тестову мережу та її вміст перед запуском нової.
Знову ж таки, Kurtosis попрацює деякий час і виведе окремі кроки, які виконуються. Зрештою, вивід має виглядати приблизно так:
Starlark code successfully run. No output was returned.
INFO[2023-04-07T11:43:16-04:00] ==========================================================
INFO[2023-04-07T11:43:16-04:00] || Created enclave: local-eth-testnet ||
INFO[2023-04-07T11:43:16-04:00] ==========================================================
Name: local-eth-testnet
UUID: bef8c192008e
Status: RUNNING
Creation Time: Fri, 07 Apr 2023 11:41:58 EDT
========================================= Files Artifacts =========================================
UUID Name
cc495a8e364a cl-genesis-data
7033fcdb5471 el-genesis-data
a3aef43fc738 genesis-generation-config-cl
8e968005fc9d genesis-generation-config-el
3182cca9d3cd geth-prefunded-keys
8421166e234f prysm-password
d9e6e8d44d99 validator-keystore-0
23f5ba517394 validator-keystore-1
4d28dea40b5c validator-keystore-2
========================================== User Services ==========================================
UUID Name Ports Status
485e6fde55ae cl-client-0-beacon http: 4000/tcp -> http://127.0.0.1:65010 RUNNING
metrics: 5054/tcp -> http://127.0.0.1:65011
tcp-discovery: 9000/tcp -> 127.0.0.1:65012
udp-discovery: 9000/udp -> 127.0.0.1:54455
73739bd158b2 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:65016 RUNNING
metrics: 5064/tcp -> http://127.0.0.1:65017
1b0a233cd011 cl-client-1-beacon http: 4000/tcp -> 127.0.0.1:65021 RUNNING
metrics: 8008/tcp -> 127.0.0.1:65023
tcp-discovery: 9000/tcp -> 127.0.0.1:65024
udp-discovery: 9000/udp -> 127.0.0.1:56031
validator-metrics: 5064/tcp -> 127.0.0.1:65022
949b8220cd53 cl-client-1-validator http: 4000/tcp -> 127.0.0.1:65028 RUNNING
metrics: 8008/tcp -> 127.0.0.1:65030
tcp-discovery: 9000/tcp -> 127.0.0.1:65031
udp-discovery: 9000/udp -> 127.0.0.1:60784
validator-metrics: 5064/tcp -> 127.0.0.1:65029
c34417bea5fa cl-client-2 http: 4000/tcp -> 127.0.0.1:65037 RUNNING
metrics: 8008/tcp -> 127.0.0.1:65035
tcp-discovery: 9000/tcp -> 127.0.0.1:65036
udp-discovery: 9000/udp -> 127.0.0.1:63581
e19738e6329d el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:64986 RUNNING
rpc: 8545/tcp -> 127.0.0.1:64988
tcp-discovery: 30303/tcp -> 127.0.0.1:64987
udp-discovery: 30303/udp -> 127.0.0.1:55706
ws: 8546/tcp -> 127.0.0.1:64989
e904687449d9 el-client-1 engine-rpc: 8551/tcp -> 127.0.0.1:64993 RUNNING
rpc: 8545/tcp -> 127.0.0.1:64995
tcp-discovery: 30303/tcp -> 127.0.0.1:64994
udp-discovery: 30303/udp -> 127.0.0.1:58096
ws: 8546/tcp -> 127.0.0.1:64996
ad6f401126fa el-client-2 engine-rpc: 8551/tcp -> 127.0.0.1:65003 RUNNING
rpc: 8545/tcp -> 127.0.0.1:65001
tcp-discovery: 30303/tcp -> 127.0.0.1:65000
udp-discovery: 30303/udp -> 127.0.0.1:57269
ws: 8546/tcp -> 127.0.0.1:65002
12d04a9dbb69 prelaunch-data-generator-1680882122181135513 <none> STOPPED
5b45f9c0504b prelaunch-data-generator-1680882122192182847 <none> STOPPED
3d4aaa75e218 prelaunch-data-generator-1680882122201668972 <none> STOPPED
Вітаємо! Ви успішно налаштували локальну тестову мережу на 3 вузли замість 1. Щоб запустити ті самі робочі процеси для вашого dapp, що й раніше (розгортання та тестування), виконайте ті самі операції, замінивши <$YOUR_PORT> у структурі localnet у вашому файлі конфігурації hardhat.config.ts на порт RPC URI, виведений з будь-якого сервісу el-client-<num> у вашій новій локальній тестовій мережі з 3 вузлами.
Висновок
Ось і все! Підсумовуючи цей короткий посібник, ви:
- Створили локальну тестову мережу Етеріуму через Docker за допомогою Kurtosis
- Підключили локальне середовище розробки dapp до локальної мережі Етеріуму
- Розгорнули dapp і запустили для нього простий тест у локальній мережі Етеріуму
- Налаштували базову мережу Етеріуму на 3 вузли
Ми хотіли б почути від вас, що пройшло добре, що можна покращити, або відповісти на будь-які ваші запитання. Не соромтеся звертатися через GitHub (opens in a new tab) або напишіть нам на електронну пошту (opens email client)!
Інші приклади та посібники
Ми рекомендуємо вам ознайомитися з нашим коротким посібником (opens in a new tab) (де ви створите базу даних Postgres і API поверх неї) та іншими нашими прикладами в репозиторії awesome-kurtosis (opens in a new tab), де ви знайдете чудові приклади, зокрема пакети для:
- Розгортання такої ж локальної тестової мережі Етеріуму (opens in a new tab), але з підключеними додатковими сервісами, такими як спамер транзакцій (для симуляції транзакцій), монітор форків, а також підключені екземпляри Grafana та Prometheus
- Виконання тестування підмереж (opens in a new tab) у тій самій локальній мережі Етеріуму