Как разработать и протестировать децентрализованное приложение в локальной многоклиентской тестовой сети
Введение
Это руководство проведет вас через процесс создания настраиваемой локальной тестовой сети 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
Прежде чем продолжить, убедитесь, что у вас есть:
- Установленный и запущенный движок Dockeropens in a new tab на вашем локальном компьютере
- Установленный Kurtosis CLIopens in a new tab (или обновленный до последней версии, если CLI у вас уже установлен)
- Установленные Node.jsopens in a new tab, yarnopens in a new tab и npxopens in a new tab (для вашей среды децентрализованных приложений)
Создание локальной тестовой сети 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-testnet5UUID: 39372d756ae86Status: RUNNING7Creation Time: Tue, 04 Apr 2023 18:09:03 EDT89========================================= Files Artifacts =========================================10UUID Name11d4085a064230 cl-genesis-data121c62cb792e4c el-genesis-data13bd60489b73a7 genesis-generation-config-cl14b2e593fe5228 genesis-generation-config-el15d552a54acf78 geth-prefunded-keys165f7e661eb838 prysm-password17054e7338bb59 validator-keystore-01819========================================== User Services ==========================================20UUID Name Ports Status21e20f129ee0c5 cl-client-0-beacon http: 4000/tcp -> <http://127.0.0.1:54261> RUNNING22 metrics: 5054/tcp -> <http://127.0.0.1:54262>23 tcp-discovery: 9000/tcp -> 127.0.0.1:5426324 udp-discovery: 9000/udp -> 127.0.0.1:6047025a8b6c926cdb4 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:54267 RUNNING26 metrics: 5064/tcp -> <http://127.0.0.1:54268>27d7b802f623e8 el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:54253 RUNNING28 rpc: 8545/tcp -> 127.0.0.1:5425129 tcp-discovery: 30303/tcp -> 127.0.0.1:5425430 udp-discovery: 30303/udp -> 127.0.0.1:5383431 ws: 8546/tcp -> 127.0.0.1:5425232514a829c0a84 prelaunch-data-generator-1680646157905431468 <none> STOPPED3362bd62d0aa7a prelaunch-data-generator-1680646157915424301 <none> STOPPED3405e9619e0e90 prelaunch-data-generator-1680646157922872635 <none> STOPPED35Показать всеПоздравляем! Вы использовали 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 содержит несколько простых смарт-контрактов для децентрализованного приложения Blackjackscripts/opens in a new tab содержит скрипт для развертывания контракта токена в вашей локальной сети Ethereumtest/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 KURTOSIS34// Это приватные ключи, связанные с предварительно пополненными тестовыми аккаунтами, созданными пакетом eth-network-package5// <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 1000000000000000000000000020x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 1000000000000000000000000030xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 1000000000000000000000000040x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 1000000000000000000000000050x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 1000000000000000000000000060x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000Это подтверждает, что Hardhat использует вашу локальную тестовую сеть и обнаруживает предварительно пополненные аккаунты, созданные eth-network-package.
Развертывание и тестирование вашего децентрализованного приложения локально
Когда среда разработки децентрализованного приложения полностью подключена к локальной тестовой сети Ethereum, вы можете запускать рабочие процессы разработки и тестирования для вашего децентрализованного приложения, используя локальную тестовую сеть.
Чтобы скомпилировать и развернуть смарт-контракт ChipToken.sol для локального прототипирования и разработки, выполните:
1npx hardhat compile2npx hardhat run scripts/deploy.ts --network localnetВывод должен выглядеть примерно так:
1ChipToken развернут по адресу: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487dТеперь попробуйте запустить тест simple.js для вашего локального децентрализованного приложения, чтобы подтвердить, что для каждого игрока в нашем децентрализованном приложении Blackjack отчеканено 1000 фишек:
Вывод должен выглядеть примерно так:
1npx hardhat test --network localnetВывод должен выглядеть примерно так:
1ChipToken2 чеканка3 ✔ должно быть отчеканено 1000 фишек для ИГРОКА ОДИН45 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-testnet6UUID: bef8c192008e7Status: RUNNING8Creation Time: Fri, 07 Apr 2023 11:41:58 EDT910========================================= Files Artifacts =========================================11UUID Name12cc495a8e364a cl-genesis-data137033fcdb5471 el-genesis-data14a3aef43fc738 genesis-generation-config-cl158e968005fc9d genesis-generation-config-el163182cca9d3cd geth-prefunded-keys178421166e234f prysm-password18d9e6e8d44d99 validator-keystore-01923f5ba517394 validator-keystore-1204d28dea40b5c validator-keystore-22122========================================== User Services ==========================================23UUID Name Ports Status24485e6fde55ae cl-client-0-beacon http: 4000/tcp -> http://127.0.0.1:65010 RUNNING25 metrics: 5054/tcp -> http://127.0.0.1:6501126 tcp-discovery: 9000/tcp -> 127.0.0.1:6501227 udp-discovery: 9000/udp -> 127.0.0.1:544552873739bd158b2 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:65016 RUNNING29 metrics: 5064/tcp -> http://127.0.0.1:65017301b0a233cd011 cl-client-1-beacon http: 4000/tcp -> 127.0.0.1:65021 RUNNING31 metrics: 8008/tcp -> 127.0.0.1:6502332 tcp-discovery: 9000/tcp -> 127.0.0.1:6502433 udp-discovery: 9000/udp -> 127.0.0.1:5603134 validator-metrics: 5064/tcp -> 127.0.0.1:6502235949b8220cd53 cl-client-1-validator http: 4000/tcp -> 127.0.0.1:65028 RUNNING36 metrics: 8008/tcp -> 127.0.0.1:6503037 tcp-discovery: 9000/tcp -> 127.0.0.1:6503138 udp-discovery: 9000/udp -> 127.0.0.1:6078439 validator-metrics: 5064/tcp -> 127.0.0.1:6502940c34417bea5fa cl-client-2 http: 4000/tcp -> 127.0.0.1:65037 RUNNING41 metrics: 8008/tcp -> 127.0.0.1:6503542 tcp-discovery: 9000/tcp -> 127.0.0.1:6503643 udp-discovery: 9000/udp -> 127.0.0.1:6358144e19738e6329d el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:64986 RUNNING45 rpc: 8545/tcp -> 127.0.0.1:6498846 tcp-discovery: 30303/tcp -> 127.0.0.1:6498747 udp-discovery: 30303/udp -> 127.0.0.1:5570648 ws: 8546/tcp -> 127.0.0.1:6498949e904687449d9 el-client-1 engine-rpc: 8551/tcp -> 127.0.0.1:64993 RUNNING50 rpc: 8545/tcp -> 127.0.0.1:6499551 tcp-discovery: 30303/tcp -> 127.0.0.1:6499452 udp-discovery: 30303/udp -> 127.0.0.1:5809653 ws: 8546/tcp -> 127.0.0.1:6499654ad6f401126fa el-client-2 engine-rpc: 8551/tcp -> 127.0.0.1:65003 RUNNING55 rpc: 8545/tcp -> 127.0.0.1:6500156 tcp-discovery: 30303/tcp -> 127.0.0.1:6500057 udp-discovery: 30303/udp -> 127.0.0.1:5726958 ws: 8546/tcp -> 127.0.0.1:650025912d04a9dbb69 prelaunch-data-generator-1680882122181135513 <none> STOPPED605b45f9c0504b prelaunch-data-generator-1680882122192182847 <none> STOPPED613d4aaa75e218 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 г.