Lompat ke konten utama

Cara mengembangkan dan menguji dapp di testnet lokal multi-klien

klien
node
kontrak pintar
komposabilitas
lapisan konsensus
lapisan eksekusi
pengujian
Menengah
Tedi Mitiku
11 April 2023
10 menit baca

Pengantar

Panduan ini memandu Anda melalui proses menginisiasi testnet Ethereum lokal yang dapat dikonfigurasi, menerapkan kontrak pintar ke dalamnya, dan menggunakan testnet tersebut untuk menjalankan pengujian terhadap dapp Anda. Panduan ini dirancang untuk pengembang dapp yang ingin mengembangkan dan menguji dapp mereka secara lokal terhadap berbagai konfigurasi jaringan sebelum menerapkannya ke testnet langsung atau mainnet.

Dalam panduan ini, Anda akan:

  • Menginisiasi testnet Ethereum lokal dengan eth-network-package (opens in a new tab) menggunakan Kurtosis (opens in a new tab),
  • Menghubungkan lingkungan pengembangan dapp Hardhat Anda ke testnet lokal untuk mengompilasi, menerapkan, dan menguji dapp, dan
  • Mengonfigurasi testnet lokal, termasuk parameter seperti jumlah node dan pasangan klien EL/CL tertentu, untuk memungkinkan alur kerja pengembangan dan pengujian terhadap berbagai konfigurasi jaringan.

Apa itu Kurtosis?

Kurtosis (opens in a new tab) adalah sistem pembangunan yang dapat dikomposisikan yang dirancang untuk mengonfigurasi lingkungan pengujian multi-kontainer. Ini secara khusus memungkinkan pengembang untuk membuat lingkungan yang dapat direproduksi yang memerlukan logika penyiapan dinamis, seperti testnet blockchain.

Dalam panduan ini, eth-network-package Kurtosis memutar testnet Ethereum lokal dengan dukungan untuk klien Lapisan Eksekusi (EL) geth (opens in a new tab), serta klien Lapisan Konsensus (CL) teku (opens in a new tab), lighthouse (opens in a new tab), dan lodestar (opens in a new tab). Paket ini berfungsi sebagai alternatif yang dapat dikonfigurasi dan dikomposisikan untuk jaringan dalam kerangka kerja seperti Hardhat Network, Ganache, dan Anvil. Kurtosis menawarkan pengembang kontrol dan fleksibilitas yang lebih besar atas testnet yang mereka gunakan, yang merupakan alasan utama mengapa Ethereum Foundation menggunakan Kurtosis untuk menguji The Merge (opens in a new tab) dan terus menggunakannya untuk menguji peningkatan jaringan.

Menyiapkan Kurtosis

Sebelum Anda melanjutkan, pastikan Anda telah:

Menginisiasi testnet Ethereum lokal

Untuk memutar testnet Ethereum lokal, jalankan:

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

Catatan: Perintah ini menamai jaringan Anda: "local-eth-testnet” menggunakan bendera --enclave.

Kurtosis akan mencetak langkah-langkah yang diambilnya di balik layar saat ia bekerja untuk menafsirkan, memvalidasi, dan kemudian mengeksekusi instruksi. Pada akhirnya, Anda akan melihat keluaran yang menyerupai berikut ini:

INFO[2023-03-16T11:42:28-04:00] =========================================================
INFO[2023-03-16T11:42:28-04:00] || Created enclave: local-eth-testnet ||
INFO[2023-03-16T11:42:28-04:00] =========================================================
Name: local-eth-testnet
UUID: 12345678901234567890123456789012
Status: RUNNING
Creation Time: Thu, 16 Mar 2023 11:41:18 EDT
========================================= Files Artifacts =========================================
UUID Name
12345678901234567890123456789012 1-prelaunch-data-dir
12345678901234567890123456789012 2-geth-genesis-dir
12345678901234567890123456789012 3-genesis-generation-config-dir
12345678901234567890123456789012 4-prysm-password-dir
========================================== User Services ==========================================
UUID Name Ports Status
12345678901234567890123456789012 cl-1-lighthouse-geth http: 4000/tcp -> http://127.0.0.1:64251 RUNNING
metrics: 5054/tcp -> http://127.0.0.1:64252
tcp-discovery: 9000/tcp -> 127.0.0.1:64253
udp-discovery: 9000/udp -> 127.0.0.1:64254
12345678901234567890123456789012 el-1-geth-lighthouse engine-rpc: 8551/tcp -> 127.0.0.1:64247 RUNNING
rpc: 8545/tcp -> 127.0.0.1:64248
tcp-discovery: 30303/tcp -> 127.0.0.1:64249
udp-discovery: 30303/udp -> 127.0.0.1:64250
ws: 8546/tcp -> 127.0.0.1:64255
12345678901234567890123456789012 prelaunch-data-generator <none> RUNNING
12345678901234567890123456789012 validator-key-generation-cl-node <none> RUNNING
Tampilkan semua

Selamat! Anda menggunakan Kurtosis untuk menginisiasi testnet Ethereum lokal, dengan klien CL (lighthouse) dan EL (geth), melalui Docker.

Tinjauan

Di bagian ini, Anda mengeksekusi perintah yang mengarahkan Kurtosis untuk menggunakan eth-network-package yang di-host secara jarak jauh di GitHub (opens in a new tab) untuk memutar testnet Ethereum lokal di dalam Enclave (opens in a new tab) Kurtosis. Di dalam enclave Anda, Anda akan menemukan "artefak file" dan "layanan pengguna".

Artefak File (opens in a new tab) di enclave Anda mencakup semua data yang dihasilkan dan digunakan untuk mem-bootstrap klien EL dan CL. Data tersebut dibuat menggunakan layanan prelaunch-data-generator yang dibangun dari citra Docker (opens in a new tab) ini.

Layanan pengguna menampilkan semua layanan dalam kontainer yang beroperasi di enclave Anda. Anda akan melihat bahwa satu node, yang menampilkan klien EL dan klien CL, telah dibuat.

Hubungkan lingkungan pengembangan dapp Anda ke testnet Ethereum lokal

Siapkan lingkungan pengembangan dapp

Sekarang setelah Anda memiliki testnet lokal yang berjalan, Anda dapat menghubungkan lingkungan pengembangan dapp Anda untuk menggunakan testnet lokal Anda. Kerangka kerja Hardhat akan digunakan dalam panduan ini untuk menerapkan dapp blackjack ke testnet lokal Anda.

Untuk menyiapkan lingkungan pengembangan dapp Anda, kloning repositori yang berisi contoh dapp kami dan instal dependensinya, jalankan:

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

Folder smart-contract-example (opens in a new tab) yang digunakan di sini berisi penyiapan umum untuk pengembang dapp yang menggunakan kerangka kerja Hardhat (opens in a new tab):

Konfigurasikan Hardhat untuk menggunakan testnet lokal

Dengan lingkungan pengembangan dapp Anda yang telah disiapkan, Anda sekarang akan menghubungkan Hardhat untuk menggunakan testnet Ethereum lokal yang dihasilkan menggunakan Kurtosis. Untuk mencapai ini, ganti <$YOUR_PORT> di struct localnet dalam file konfigurasi hardhat.config.ts Anda dengan port dari keluaran rpc uri dari layanan el-client-<num> mana pun. Dalam contoh kasus ini, portnya adalah 64248. Port Anda akan berbeda.

Contoh di hardhat.config.ts:

1import { HardhatUserConfig } from "hardhat/config";
2import "@nomicfoundation/hardhat-toolbox";
3
4const config: HardhatUserConfig = {
5 solidity: "0.8.18",
6 networks: {
7 localnet: {
8 url: "http://127.0.0.1:<$YOUR_PORT>",
9 },
10 },
11};
12
13export default config;
Tampilkan semua

Setelah Anda menyimpan file Anda, lingkungan pengembangan dapp Hardhat Anda sekarang terhubung ke testnet Ethereum lokal Anda! Anda dapat memverifikasi bahwa testnet Anda berfungsi dengan menjalankan:

npx hardhat run scripts/get-balance.ts --network localnet

Keluarannya akan terlihat seperti ini:

Balance of 0x821b55d8abe79bc98f05eb675fdc50dfe796b7ab: 10000000000000000000000

Ini mengonfirmasi bahwa Hardhat menggunakan testnet lokal Anda dan mendeteksi akun yang didanai sebelumnya yang dibuat oleh eth-network-package.

Terapkan dan uji dapp Anda secara lokal

Dengan lingkungan pengembangan dapp yang sepenuhnya terhubung ke testnet Ethereum lokal, Anda sekarang dapat menjalankan alur kerja pengembangan dan pengujian terhadap dapp Anda menggunakan testnet lokal.

Untuk mengompilasi dan menerapkan kontrak pintar ChipToken.sol untuk pembuatan prototipe dan pengembangan lokal, jalankan:

npx hardhat run scripts/deploy.ts --network localnet

Keluarannya akan terlihat seperti:

Compiled 3 Solidity files successfully
ChipToken deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3

Sekarang coba jalankan pengujian simple.js terhadap dapp lokal Anda untuk mengonfirmasi bahwa setiap pemain di dapp Blackjack kami memiliki 1000 yang di-mint untuk mereka:

Keluarannya akan terlihat seperti ini:

npx hardhat test --network localnet

Keluarannya akan terlihat seperti ini:

ChipToken
✔ Should mint 1000 tokens for each player (101ms)
1 passing (103ms)

Tinjauan

Pada titik ini, Anda sekarang telah menyiapkan lingkungan pengembangan dapp, menghubungkannya ke jaringan Ethereum lokal yang dibuat oleh Kurtosis, dan telah mengompilasi, menerapkan, dan menjalankan pengujian sederhana terhadap dapp Anda.

Sekarang mari kita jelajahi bagaimana Anda dapat mengonfigurasi jaringan yang mendasarinya untuk menguji dapp kita di bawah berbagai konfigurasi jaringan.

Mengonfigurasi testnet Ethereum lokal

Mengubah konfigurasi klien dan jumlah node

Testnet Ethereum lokal Anda dapat dikonfigurasi untuk menggunakan pasangan klien EL dan CL yang berbeda, serta jumlah node yang bervariasi, tergantung pada skenario dan konfigurasi jaringan tertentu yang ingin Anda kembangkan atau uji. Ini berarti bahwa, setelah disiapkan, Anda dapat memutar testnet lokal yang disesuaikan dan menggunakannya untuk menjalankan alur kerja yang sama (penerapan, pengujian, dll.) di bawah berbagai konfigurasi jaringan untuk memastikan semuanya berfungsi seperti yang diharapkan. Untuk mempelajari lebih lanjut tentang parameter lain yang dapat Anda modifikasi, kunjungi tautan ini.

Cobalah! Anda dapat meneruskan berbagai opsi konfigurasi ke eth-network-package melalui file JSON. File JSON parameter jaringan ini menyediakan konfigurasi spesifik yang akan digunakan Kurtosis untuk menyiapkan jaringan Ethereum lokal.

Ambil file konfigurasi default dan edit untuk memutar dua node dengan pasangan EL/CL yang berbeda:

  • Node 1 dengan geth/lighthouse
  • Node 2 dengan geth/lodestar
  • Node 3 dengan geth/teku

Konfigurasi ini menciptakan jaringan heterogen dari implementasi node Ethereum untuk menguji dapp Anda. File konfigurasi Anda sekarang akan terlihat seperti:

1{
2 "participants": [
3 {
4 "el_client_type": "geth",
5 "el_client_image": "",
6 "el_client_log_level": "",
7 "cl_client_type": "lighthouse",
8 "cl_client_image": "",
9 "cl_client_log_level": "",
10 "beacon_extra_params": [],
11 "el_extra_params": [],
12 "validator_extra_params": [],
13 "builder_network_params": null
14 },
15 {
16 "el_client_type": "geth",
17 "el_client_image": "",
18 "el_client_log_level": "",
19 "cl_client_type": "lodestar",
20 "cl_client_image": "",
21 "cl_client_log_level": "",
22 "beacon_extra_params": [],
23 "el_extra_params": [],
24 "validator_extra_params": [],
25 "builder_network_params": null
26 },
27 {
28 "el_client_type": "geth",
29 "el_client_image": "",
30 "el_client_log_level": "",
31 "cl_client_type": "teku",
32 "cl_client_image": "",
33 "cl_client_log_level": "",
34 "beacon_extra_params": [],
35 "el_extra_params": [],
36 "validator_extra_params": [],
37 "builder_network_params": null
38 }
39 ],
40 "network_params": {
41 "preregistered_validator_keys_mnemonic": "giant issue aisle success illegal bike spike question tent bar rely arctic volcano radar curl auth network grid random filter aries anchor volume shape",
42 "num_validator_keys_per_node": 64,
43 "network_id": "3151908",
44 "deposit_contract_address": "0x4242424242424242424242424242424242424242",
45 "seconds_per_slot": 12,
46 "slots_per_epoch": 32,
47 "genesis_delay": 120,
48 "capella_fork_epoch": 2,
49 "deneb_fork_epoch": 500
50 },
51 "wait_for_finalization": false,
52 "global_client_log_level": "info"
53}
Tampilkan semua

Setiap struct participants memetakan ke sebuah node di jaringan, jadi 3 struct participants akan memberi tahu Kurtosis untuk memutar 3 node di jaringan Anda. Setiap struct participants akan memungkinkan Anda untuk menentukan pasangan EL dan CL yang digunakan untuk node tertentu tersebut.

Struct network_params mengonfigurasi pengaturan jaringan yang digunakan untuk membuat file genesis untuk setiap node serta pengaturan lain seperti detik per slot dari jaringan.

Simpan file parameter yang telah Anda edit di direktori mana pun yang Anda inginkan (dalam contoh di bawah, ini disimpan ke desktop) dan kemudian gunakan untuk menjalankan paket Kurtosis Anda dengan menjalankan:

kurtosis clean -a && kurtosis run github.com/kurtosis-tech/eth-network-package --args-file ~/Desktop/network_params.json

Catatan: perintah kurtosis clean -a digunakan di sini untuk menginstruksikan Kurtosis agar menghancurkan testnet lama dan isinya sebelum memulai yang baru.

Sekali lagi, Kurtosis akan bekerja sebentar dan mencetak langkah-langkah individual yang sedang berlangsung. Pada akhirnya, keluarannya akan terlihat seperti:

INFO[2023-03-16T12:00:00-04:00] =========================================================
INFO[2023-03-16T12:00:00-04:00] || Created enclave: local-eth-testnet ||
INFO[2023-03-16T12:00:00-04:00] =========================================================
Name: local-eth-testnet
UUID: 12345678901234567890123456789012
Status: RUNNING
Creation Time: Thu, 16 Mar 2023 11:55:00 EDT
========================================= Files Artifacts =========================================
UUID Name
12345678901234567890123456789012 1-prelaunch-data-dir
12345678901234567890123456789012 2-geth-genesis-dir
12345678901234567890123456789012 3-genesis-generation-config-dir
12345678901234567890123456789012 4-prysm-password-dir
========================================== User Services ==========================================
UUID Name Ports Status
12345678901234567890123456789012 cl-1-lighthouse-geth http: 4000/tcp -> http://127.0.0.1:64251 RUNNING
metrics: 5054/tcp -> http://127.0.0.1:64252
tcp-discovery: 9000/tcp -> 127.0.0.1:64253
udp-discovery: 9000/udp -> 127.0.0.1:64254
12345678901234567890123456789012 cl-2-lodestar-geth http: 4000/tcp -> http://127.0.0.1:64256 RUNNING
metrics: 5054/tcp -> http://127.0.0.1:64257
tcp-discovery: 9000/tcp -> 127.0.0.1:64258
udp-discovery: 9000/udp -> 127.0.0.1:64259
12345678901234567890123456789012 cl-3-teku-geth http: 4000/tcp -> http://127.0.0.1:64260 RUNNING
metrics: 5054/tcp -> http://127.0.0.1:64261
tcp-discovery: 9000/tcp -> 127.0.0.1:64262
udp-discovery: 9000/udp -> 127.0.0.1:64263
12345678901234567890123456789012 el-1-geth-lighthouse engine-rpc: 8551/tcp -> 127.0.0.1:64247 RUNNING
rpc: 8545/tcp -> 127.0.0.1:64248
tcp-discovery: 30303/tcp -> 127.0.0.1:64249
udp-discovery: 30303/udp -> 127.0.0.1:64250
ws: 8546/tcp -> 127.0.0.1:64255
12345678901234567890123456789012 el-2-geth-lodestar engine-rpc: 8551/tcp -> 127.0.0.1:64264 RUNNING
rpc: 8545/tcp -> 127.0.0.1:64265
tcp-discovery: 30303/tcp -> 127.0.0.1:64266
udp-discovery: 30303/udp -> 127.0.0.1:64267
ws: 8546/tcp -> 127.0.0.1:64268
12345678901234567890123456789012 el-3-geth-teku engine-rpc: 8551/tcp -> 127.0.0.1:64269 RUNNING
rpc: 8545/tcp -> 127.0.0.1:64270
tcp-discovery: 30303/tcp -> 127.0.0.1:64271
udp-discovery: 30303/udp -> 127.0.0.1:64272
ws: 8546/tcp -> 127.0.0.1:64273
12345678901234567890123456789012 prelaunch-data-generator <none> RUNNING
12345678901234567890123456789012 validator-key-generation-cl-node <none> RUNNING
Tampilkan semua

Selamat! Anda telah berhasil mengonfigurasi testnet lokal Anda untuk memiliki 3 node alih-alih 1. Untuk menjalankan alur kerja yang sama seperti yang Anda lakukan sebelumnya terhadap dapp Anda (terapkan & uji), lakukan operasi yang sama seperti yang kita lakukan sebelumnya dengan mengganti <$YOUR_PORT> di struct localnet dalam file konfigurasi hardhat.config.ts Anda dengan port dari keluaran rpc uri dari layanan el-client-<num> mana pun di testnet lokal 3-node Anda yang baru.

Kesimpulan

Dan itu saja! Untuk merangkum panduan singkat ini, Anda:

  • Membuat testnet Ethereum lokal melalui Docker menggunakan Kurtosis
  • Menghubungkan lingkungan pengembangan dapp lokal Anda ke jaringan Ethereum lokal
  • Menerapkan dapp dan menjalankan pengujian sederhana terhadapnya di jaringan Ethereum lokal
  • Mengonfigurasi jaringan Ethereum yang mendasarinya untuk memiliki 3 node

Kami ingin mendengar dari Anda tentang apa yang berjalan baik untuk Anda, apa yang dapat ditingkatkan, atau untuk menjawab pertanyaan Anda. Jangan ragu untuk menghubungi melalui GitHub (opens in a new tab) atau email kami (opens email client)!

Contoh dan panduan lainnya

Kami mendorong Anda untuk memeriksa panduan memulai cepat (opens in a new tab) kami (di mana Anda akan membangun basis data Postgres dan API di atasnya) dan contoh kami lainnya di repositori awesome-kurtosis (opens in a new tab) kami di mana Anda akan menemukan beberapa contoh hebat, termasuk paket untuk:

Pembaruan terakhir halaman: 23 September 2025

Apakah tutorial ini membantu?