Перейти к основному содержанию

Как разработать и протестировать децентрализованное приложение в локальной многоклиентской тестовой сети

клиенты
узлы
Умные контракты
композиционность
уровень консенсуса
Уровень исполнения
тестирование
Intermediate
Tedi Mitiku
11 апреля 2023 г.
10 минута прочтения

Введение

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

В этом руководстве вы:

  • Создадите локальную тестовую сеть Ethereum с помощью eth-network-packageopens in a new tab, используя Kurtosisopens in a new tab,
  • Подключите среду разработки децентрализованных приложений Hardhat к локальной тестовой сети, чтобы скомпилировать, развернуть и протестировать децентрализованное приложение, и
  • Настроите локальную тестовую сеть, включая такие параметры, как количество узлов и конкретные пары клиентов EL/CL, чтобы обеспечить рабочие процессы разработки и тестирования для различных конфигураций сети.

Что такое Kurtosis?

Kurtosisopens in a new tab — это компонуемая система сборки, предназначенная для настройки многоконтейнерных тестовых сред. Он специально позволяет разработчикам создавать воспроизводимые среды, требующие динамической логики настройки, например, тестовые сети блокчейна.

В этом руководстве пакет Kurtosis eth-network-package запускает локальную тестовую сеть Ethereum с поддержкой клиента уровня исполнения (EL) gethopens in a new tab, а также клиентов уровня консенсуса (CL) tekuopens in a new tab, lighthouseopens in a new tab и lodestaropens in a new tab. Этот пакет служит настраиваемой и компонуемой альтернативой сетям во фреймворках, таких как Hardhat Network, Ganache и Anvil. Kurtosis предлагает разработчикам больший контроль и гибкость над используемыми ими тестовыми сетями, что является основной причиной, по которой Ethereum Foundation использовал Kurtosis для тестирования Слиянияopens in a new tab и продолжает использовать его для тестирования обновлений сети.

Настройка Kurtosis

Прежде чем продолжить, убедитесь, что у вас есть:

Создание локальной тестовой сети Ethereum

Чтобы запустить локальную тестовую сеть Ethereum, выполните:

1kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-package

Примечание: эта команда дает вашей сети имя «local-eth-testnet» с помощью флага --enclave.

Kurtosis выведет на экран шаги, которые он выполняет «под капотом» в процессе интерпретации, проверки и последующего выполнения инструкций. В конце вы должны увидеть вывод, похожий на следующий:

1INFO[2023-04-04T18:09:44-04:00] ======================================================
2INFO[2023-04-04T18:09:44-04:00] || Created enclave: local-eth-testnet ||
3INFO[2023-04-04T18:09:44-04:00] ======================================================
4Name: local-eth-testnet
5UUID: 39372d756ae8
6Status: RUNNING
7Creation Time: Tue, 04 Apr 2023 18:09:03 EDT
8
9========================================= Files Artifacts =========================================
10UUID Name
11d4085a064230 cl-genesis-data
121c62cb792e4c el-genesis-data
13bd60489b73a7 genesis-generation-config-cl
14b2e593fe5228 genesis-generation-config-el
15d552a54acf78 geth-prefunded-keys
165f7e661eb838 prysm-password
17054e7338bb59 validator-keystore-0
18
19========================================== User Services ==========================================
20UUID Name Ports Status
21e20f129ee0c5 cl-client-0-beacon http: 4000/tcp -> <http://127.0.0.1:54261> RUNNING
22 metrics: 5054/tcp -> <http://127.0.0.1:54262>
23 tcp-discovery: 9000/tcp -> 127.0.0.1:54263
24 udp-discovery: 9000/udp -> 127.0.0.1:60470
25a8b6c926cdb4 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:54267 RUNNING
26 metrics: 5064/tcp -> <http://127.0.0.1:54268>
27d7b802f623e8 el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:54253 RUNNING
28 rpc: 8545/tcp -> 127.0.0.1:54251
29 tcp-discovery: 30303/tcp -> 127.0.0.1:54254
30 udp-discovery: 30303/udp -> 127.0.0.1:53834
31 ws: 8546/tcp -> 127.0.0.1:54252
32514a829c0a84 prelaunch-data-generator-1680646157905431468 <none> STOPPED
3362bd62d0aa7a prelaunch-data-generator-1680646157915424301 <none> STOPPED
3405e9619e0e90 prelaunch-data-generator-1680646157922872635 <none> STOPPED
35
Показать все

Поздравляем! Вы использовали Kurtosis для создания локальной тестовой сети Ethereum с клиентом CL (lighthouse) и клиентом EL (geth) через Docker.

Обзор

В этом разделе вы выполнили команду, которая указала Kurtosis использовать eth-network-package, размещенный удаленно на GitHubopens in a new tab, для запуска локальной тестовой сети Ethereum в Kurtosis Enclaveopens in a new tab. Внутри вашего анклава вы найдете как «файловые артефакты», так и «пользовательские службы».

Файловые артефактыopens in a new tab в вашем анклаве включают все данные, сгенерированные и используемые для начальной загрузки клиентов EL и CL. Данные были созданы с помощью службы prelaunch-data-generator, созданной на основе этого образа Dockeropens in a new tab.

Пользовательские службы отображают все контейнеризированные службы, работающие в вашем анклаве. Вы заметите, что был создан один узел, включающий как клиент EL, так и клиент CL.

Подключите среду разработки децентрализованного приложения к локальной тестовой сети Ethereum

Настройка среды разработки децентрализованного приложения

Теперь, когда у вас есть запущенная локальная тестовая сеть, вы можете подключить свою среду разработки децентрализованного приложения для использования локальной тестовой сети. Фреймворк Hardhat будет использоваться в этом руководстве для развертывания децентрализованного приложения для игры в блэкджек в вашей локальной тестовой сети.

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

1git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarn

Папка smart-contract-exampleopens in a new tab, используемая здесь, содержит типичную настройку для разработчика децентрализованного приложения, использующего фреймворк Hardhatopens in a new tab:

  • contracts/opens in a new tab содержит несколько простых смарт-контрактов для децентрализованного приложения Blackjack
  • scripts/opens in a new tab содержит скрипт для развертывания контракта токена в вашей локальной сети Ethereum
  • test/opens in a new tab содержит простой тест на .js для вашего контракта токена, чтобы подтвердить, что для каждого игрока в нашем децентрализованном приложении Blackjack отчеканено 1000 фишек
  • hardhat.config.tsopens in a new tab настраивает вашу установку Hardhat

Настройка Hardhat для использования локальной тестовой сети

После настройки среды разработки децентрализованного приложения вы подключите Hardhat для использования локальной тестовой сети Ethereum, созданной с помощью Kurtosis. Для этого замените <$YOUR_PORT> в структуре localnet в файле конфигурации hardhat.config.ts на порт из вывода RPC URI любой службы el-client-<num>. В этом примере порт будет 64248. Ваш порт будет другим.

Пример в hardhat.config.ts:

1localnet: {
2url: 'http://127.0.0.1:<$YOUR_PORT>',// TODO: ЗАМЕНИТЕ $YOUR_PORT НА ПОРТ URI УЗЛА, ВЫДАННЫЙ ПАКЕТОМ СЕТИ ETH KURTOSIS
3
4// Это приватные ключи, связанные с предварительно пополненными тестовыми аккаунтами, созданными пакетом eth-network-package
5// <https://github.com/kurtosis-tech/eth-network-package/blob/main/src/prelaunch_data_generator/genesis_constants/genesis_constants.star>
6accounts: [
7 "ef5177cd0b6b21c87db5a0bf35d4084a8a57a9d6a064f86d51ac85f2b873a4e2",
8 "48fcc39ae27a0e8bf0274021ae6ebd8fe4a0e12623d61464c498900b28feb567",
9 "7988b3a148716ff800414935b305436493e1f25237a2a03e5eebc343735e2f31",
10 "b3c409b6b0b3aa5e65ab2dc1930534608239a478106acf6f3d9178e9f9b00b35",
11 "df9bb6de5d3dc59595bcaa676397d837ff49441d211878c024eabda2cd067c9f",
12 "7da08f856b5956d40a72968f93396f6acff17193f013e8053f6fbb6c08c194d6",
13 ],
14},
Показать все

После сохранения файла ваша среда разработки децентрализованных приложений Hardhat будет подключена к вашей локальной тестовой сети Ethereum! Вы можете убедиться, что ваша тестовая сеть работает, выполнив команду:

1npx hardhat balances --network localnet

Вывод должен выглядеть примерно так:

10x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 10000000000000000000000000
20x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 10000000000000000000000000
30xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 10000000000000000000000000
40x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 10000000000000000000000000
50x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 10000000000000000000000000
60x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000

Это подтверждает, что Hardhat использует вашу локальную тестовую сеть и обнаруживает предварительно пополненные аккаунты, созданные eth-network-package.

Развертывание и тестирование вашего децентрализованного приложения локально

Когда среда разработки децентрализованного приложения полностью подключена к локальной тестовой сети Ethereum, вы можете запускать рабочие процессы разработки и тестирования для вашего децентрализованного приложения, используя локальную тестовую сеть.

Чтобы скомпилировать и развернуть смарт-контракт ChipToken.sol для локального прототипирования и разработки, выполните:

1npx hardhat compile
2npx hardhat run scripts/deploy.ts --network localnet

Вывод должен выглядеть примерно так:

1ChipToken развернут по адресу: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d

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

Вывод должен выглядеть примерно так:

1npx hardhat test --network localnet

Вывод должен выглядеть примерно так:

1ChipToken
2 чеканка
3 ✔ должно быть отчеканено 1000 фишек для ИГРОКА ОДИН
4
5 1 пройден (654 мс)

Обзор

К этому моменту вы настроили среду разработки децентрализованного приложения, подключили ее к локальной сети Ethereum, созданной Kurtosis, и скомпилировали, развернули и запустили простой тест для вашего децентрализованного приложения.

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

Настройка локальной тестовой сети Ethereum

Изменение конфигураций клиентов и количества узлов

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

Попробуйте! Вы можете передавать различные параметры конфигурации в eth-network-package через JSON-файл. Этот JSON-файл с параметрами сети предоставляет конкретные конфигурации, которые Kurtosis будет использовать для настройки локальной сети Ethereum.

Возьмите файл конфигурации по умолчанию и отредактируйте его, чтобы запустить три узла с разными парами EL/CL:

  • Узел 1 с geth/lighthouse
  • Узел 2 с geth/lodestar
  • Узел 3 с geth/teku

Эта конфигурация создает гетерогенную сеть реализаций узлов Ethereum для тестирования вашего децентрализованного приложения. Ваш файл конфигурации теперь должен выглядеть так:

1{
2 "participants":
3 [
4 {
5 "el_client_type": "geth",
6 "el_client_image": "",
7 "el_client_log_level": "",
8 "cl_client_type": "lighthouse",
9 "cl_client_image": "",
10 "cl_client_log_level": "",
11 "beacon_extra_params": [],
12 "el_extra_params": [],
13 "validator_extra_params": [],
14 "builder_network_params": null,
15 },
16 {
17 "el_client_type": "geth",
18 "el_client_image": "",
19 "el_client_log_level": "",
20 "cl_client_type": "lodestar",
21 "cl_client_image": "",
22 "cl_client_log_level": "",
23 "beacon_extra_params": [],
24 "el_extra_params": [],
25 "validator_extra_params": [],
26 "builder_network_params": null,
27 },
28 {
29 "el_client_type": "geth",
30 "el_client_image": "",
31 "el_client_log_level": "",
32 "cl_client_type": "teku",
33 "cl_client_image": "",
34 "cl_client_log_level": "",
35 "beacon_extra_params": [],
36 "el_extra_params": [],
37 "validator_extra_params": [],
38 "builder_network_params": null,
39 },
40 ],
41 "network_params":
42 {
43 "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",
44 "num_validator_keys_per_node": 64,
45 "network_id": "3151908",
46 "deposit_contract_address": "0x4242424242424242424242424242424242424242",
47 "seconds_per_slot": 12,
48 "genesis_delay": 120,
49 "capella_fork_epoch": 5,
50 },
51}
Показать все

Каждая структура participants сопоставляется с узлом в сети, поэтому 3 структуры participants сообщат Kurtosis о запуске 3 узлов в вашей сети. Каждая структура participants позволит вам указать пару EL и CL, используемую для этого конкретного узла.

Структура network_params настраивает параметры сети, которые используются для создания файлов генезиса для каждого узла, а также другие настройки, такие как количество секунд на слот в сети.

Сохраните отредактированный файл параметров в любом каталоге (в примере ниже он сохранен на рабочем столе), а затем используйте его для запуска пакета Kurtosis, выполнив:

1kurtosis 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 будет некоторое время работать и выводить на печать отдельные шаги, которые выполняются. В конечном итоге вывод должен выглядеть примерно так:

1Starlark code successfully run. No output was returned.
2INFO[2023-04-07T11:43:16-04:00] ==========================================================
3INFO[2023-04-07T11:43:16-04:00] || Created enclave: local-eth-testnet ||
4INFO[2023-04-07T11:43:16-04:00] ==========================================================
5Name: local-eth-testnet
6UUID: bef8c192008e
7Status: RUNNING
8Creation Time: Fri, 07 Apr 2023 11:41:58 EDT
9
10========================================= Files Artifacts =========================================
11UUID Name
12cc495a8e364a cl-genesis-data
137033fcdb5471 el-genesis-data
14a3aef43fc738 genesis-generation-config-cl
158e968005fc9d genesis-generation-config-el
163182cca9d3cd geth-prefunded-keys
178421166e234f prysm-password
18d9e6e8d44d99 validator-keystore-0
1923f5ba517394 validator-keystore-1
204d28dea40b5c validator-keystore-2
21
22========================================== User Services ==========================================
23UUID Name Ports Status
24485e6fde55ae cl-client-0-beacon http: 4000/tcp -> http://127.0.0.1:65010 RUNNING
25 metrics: 5054/tcp -> http://127.0.0.1:65011
26 tcp-discovery: 9000/tcp -> 127.0.0.1:65012
27 udp-discovery: 9000/udp -> 127.0.0.1:54455
2873739bd158b2 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:65016 RUNNING
29 metrics: 5064/tcp -> http://127.0.0.1:65017
301b0a233cd011 cl-client-1-beacon http: 4000/tcp -> 127.0.0.1:65021 RUNNING
31 metrics: 8008/tcp -> 127.0.0.1:65023
32 tcp-discovery: 9000/tcp -> 127.0.0.1:65024
33 udp-discovery: 9000/udp -> 127.0.0.1:56031
34 validator-metrics: 5064/tcp -> 127.0.0.1:65022
35949b8220cd53 cl-client-1-validator http: 4000/tcp -> 127.0.0.1:65028 RUNNING
36 metrics: 8008/tcp -> 127.0.0.1:65030
37 tcp-discovery: 9000/tcp -> 127.0.0.1:65031
38 udp-discovery: 9000/udp -> 127.0.0.1:60784
39 validator-metrics: 5064/tcp -> 127.0.0.1:65029
40c34417bea5fa cl-client-2 http: 4000/tcp -> 127.0.0.1:65037 RUNNING
41 metrics: 8008/tcp -> 127.0.0.1:65035
42 tcp-discovery: 9000/tcp -> 127.0.0.1:65036
43 udp-discovery: 9000/udp -> 127.0.0.1:63581
44e19738e6329d el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:64986 RUNNING
45 rpc: 8545/tcp -> 127.0.0.1:64988
46 tcp-discovery: 30303/tcp -> 127.0.0.1:64987
47 udp-discovery: 30303/udp -> 127.0.0.1:55706
48 ws: 8546/tcp -> 127.0.0.1:64989
49e904687449d9 el-client-1 engine-rpc: 8551/tcp -> 127.0.0.1:64993 RUNNING
50 rpc: 8545/tcp -> 127.0.0.1:64995
51 tcp-discovery: 30303/tcp -> 127.0.0.1:64994
52 udp-discovery: 30303/udp -> 127.0.0.1:58096
53 ws: 8546/tcp -> 127.0.0.1:64996
54ad6f401126fa el-client-2 engine-rpc: 8551/tcp -> 127.0.0.1:65003 RUNNING
55 rpc: 8545/tcp -> 127.0.0.1:65001
56 tcp-discovery: 30303/tcp -> 127.0.0.1:65000
57 udp-discovery: 30303/udp -> 127.0.0.1:57269
58 ws: 8546/tcp -> 127.0.0.1:65002
5912d04a9dbb69 prelaunch-data-generator-1680882122181135513 <none> STOPPED
605b45f9c0504b prelaunch-data-generator-1680882122192182847 <none> STOPPED
613d4aaa75e218 prelaunch-data-generator-1680882122201668972 <none> STOPPED
Показать все

Поздравляем! Вы успешно настроили свою локальную тестовую сеть, чтобы в ней было 3 узла вместо 1. Чтобы запустить те же рабочие процессы, что и раньше, для вашего децентрализованного приложения (развертывание и тестирование), выполните те же операции, что и раньше, заменив <$YOUR_PORT> в структуре localnet в вашем файле конфигурации hardhat.config.ts на порт из вывода RPC URI любой службы el-client-<num> в вашей новой 3-узловой локальной тестовой сети.

Заключение

Вот и все! Подводя итоги этого краткого руководства, вы:

  • Создали локальную тестовую сеть Ethereum через Docker с помощью Kurtosis
  • Подключили свою локальную среду разработки децентрализованных приложений к локальной сети Ethereum
  • Развернули децентрализованное приложение и запустили для него простой тест в локальной сети Ethereum
  • Настроили базовую сеть Ethereum на 3 узла

Мы будем рады услышать от вас о том, что у вас получилось, что можно улучшить, или ответить на любые ваши вопросы. Не стесняйтесь обращаться к нам через GitHubopens in a new tab или пишите нам по электронной почтеopens email client!

Другие примеры и руководства

Мы рекомендуем вам ознакомиться с нашим кратким руководствомopens in a new tab и другими примерами в нашем репозитории awesome-kurtosisopens in a new tab, где вы найдете несколько отличных примеров, включая пакеты для:

  • Запуск той же локальной тестовой сети Ethereum, но с подключением дополнительных служб, таких как спамер транзакций (для имитации транзакций), монитор форков и подключенные экземпляры Grafana и Prometheus
  • Проведение теста подсетиopens in a new tab в той же локальной сети Ethereum

Последнее обновление страницы: 23 сентября 2025 г.

Было ли это руководство полезным?