Come sviluppare e testare una dApp su una rete di test locale multi-client
Introduzione
Questa guida ti accompagna nel processo di istanziazione di una rete di test locale e configurabile di Ethereum, di distribuzione di un contratto intelligente su di essa e di utilizzo della rete di test per eseguire test sulla tua dApp. Questa guida è progettata per gli sviluppatori di dApp che desiderano sviluppare e testare le proprie dApp localmente su diverse configurazioni di rete prima di distribuirle su una rete di test attiva o sulla rete principale.
In questa guida, potrai:
- Istanziare una rete di test locale di Ethereum con l'
eth-network-package(opens in a new tab) utilizzando Kurtosis (opens in a new tab), - Connettere il tuo ambiente di sviluppo di dApp Hardhat alla rete di test locale per compilare, distribuire e testare una dApp, e
- Configurare la rete di test locale, inclusi parametri come il numero di nodi e specifici abbinamenti di client EL/CL, per abilitare flussi di lavoro di sviluppo e test su varie configurazioni di rete.
Cos'è Kurtosis?
Kurtosis (opens in a new tab) è un sistema di compilazione componibile progettato per configurare ambienti di test multi-container. Consente specificamente agli sviluppatori di creare ambienti riproducibili che richiedono logiche di configurazione dinamiche, come le reti di test blockchain.
In questa guida, l'eth-network-package di Kurtosis avvia una rete di test locale di Ethereum con supporto per il client del livello di esecuzione (EL) geth (opens in a new tab), oltre ai client del livello di consenso (CL) teku (opens in a new tab), lighthouse (opens in a new tab) e lodestar (opens in a new tab). Questo pacchetto funge da alternativa configurabile e componibile alle reti in framework come Hardhat Network, Ganache e Anvil. Kurtosis offre agli sviluppatori un maggiore controllo e flessibilità sulle reti di test che utilizzano, che è uno dei motivi principali per cui la Fondazione Ethereum ha utilizzato Kurtosis per testare il Merge (opens in a new tab) e continua a utilizzarlo per testare gli aggiornamenti della rete.
Configurare Kurtosis
Prima di procedere, assicurati di aver:
- Installato e avviato il motore Docker (opens in a new tab) sulla tua macchina locale
- Installato la CLI di Kurtosis (opens in a new tab) (o aggiornata all'ultima versione, se hai già installato la CLI)
- Installato Node.js (opens in a new tab), yarn (opens in a new tab) e npx (opens in a new tab) (per il tuo ambiente dApp)
Istanziare una rete di test locale di Ethereum
Per avviare una rete di test locale di Ethereum, esegui:
1kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-packageNota: questo comando nomina la tua rete: "local-eth-testnet" utilizzando il flag --enclave.
Kurtosis stamperà i passaggi che sta eseguendo in background mentre lavora per interpretare, convalidare e quindi eseguire le istruzioni. Alla fine, dovresti vedere un output simile al seguente:
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> STOPPED35Mostra tuttoCongratulazioni! Hai utilizzato Kurtosis per istanziare una rete di test locale di Ethereum, con un client CL (lighthouse) ed EL (geth), su Docker.
Revisione
In questa sezione, hai eseguito un comando che ha indicato a Kurtosis di utilizzare l'eth-network-package ospitato in remoto su GitHub (opens in a new tab) per avviare una rete di test locale di Ethereum all'interno di un'Enclave (opens in a new tab) di Kurtosis. All'interno della tua enclave, troverai sia "artefatti di file" che "servizi utente".
Gli Artefatti di File (opens in a new tab) nella tua enclave includono tutti i dati generati e utilizzati per avviare i client EL e CL. I dati sono stati creati utilizzando il servizio prelaunch-data-generator creato da questa immagine Docker (opens in a new tab)
I servizi utente mostrano tutti i servizi containerizzati operativi nella tua enclave. Noterai che è stato creato un singolo nodo, che presenta sia un client EL che un client CL.
Connettere il tuo ambiente di sviluppo di dApp alla rete di test locale di Ethereum
Configurare l'ambiente di sviluppo della dApp
Ora che hai una rete di test locale in esecuzione, puoi connettere il tuo ambiente di sviluppo di dApp per utilizzare la tua rete di test locale. Il framework Hardhat verrà utilizzato in questa guida per distribuire una dApp di blackjack sulla tua rete di test locale.
Per configurare il tuo ambiente di sviluppo di dApp, clona il repository che contiene la nostra dApp di esempio e installa le sue dipendenze, esegui:
1git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarnLa cartella smart-contract-example (opens in a new tab) utilizzata qui contiene la configurazione tipica per uno sviluppatore di dApp che utilizza il framework Hardhat (opens in a new tab):
contracts/(opens in a new tab) contiene alcuni semplici contratti intelligenti per una dApp di Blackjackscripts/(opens in a new tab) contiene uno script per distribuire un contratto di token sulla tua rete locale di Ethereumtest/(opens in a new tab) contiene un semplice test .js per il tuo contratto di token per confermare che ogni giocatore nella nostra dApp di Blackjack abbia 1000 token coniati per lorohardhat.config.ts(opens in a new tab) configura la tua installazione di Hardhat
Configurare Hardhat per utilizzare la rete di test locale
Con il tuo ambiente di sviluppo di dApp configurato, ora connetterai Hardhat per utilizzare la rete di test locale di Ethereum generata utilizzando Kurtosis. Per farlo, sostituisci <$YOUR_PORT> nella struttura localnet nel tuo file di configurazione hardhat.config.ts con la porta dell'URI RPC in output da qualsiasi servizio el-client-<num>. In questo caso di esempio, la porta sarebbe 64248. La tua porta sarà diversa.
Esempio in hardhat.config.ts:
1localnet: {2url: 'http://127.0.0.1:<$YOUR_PORT>', // TODO: SOSTITUISCI $YOUR_PORT CON LA PORTA DI UN URI DEL NODO PRODOTTO DAL PACCHETTO ETH NETWORK KURTOSIS34// Queste sono chiavi private associate ad account di test prefinanziati creati dall'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},Mostra tuttoUna volta salvato il file, il tuo ambiente di sviluppo di dApp Hardhat è ora connesso alla tua rete di test locale di Ethereum! Puoi verificare che la tua rete di test funzioni eseguendo:
1npx hardhat balances --network localnetL'output dovrebbe essere simile a questo:
10x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 1000000000000000000000000020x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 1000000000000000000000000030xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 1000000000000000000000000040x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 1000000000000000000000000050x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 1000000000000000000000000060x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000Questo conferma che Hardhat sta utilizzando la tua rete di test locale e rileva gli account prefinanziati creati dall'eth-network-package.
Distribuire e testare la tua dApp localmente
Con l'ambiente di sviluppo della dApp completamente connesso alla rete di test locale di Ethereum, ora puoi eseguire flussi di lavoro di sviluppo e test sulla tua dApp utilizzando la rete di test locale.
Per compilare e distribuire il contratto intelligente ChipToken.sol per la prototipazione e lo sviluppo locale, esegui:
1npx hardhat compile2npx hardhat run scripts/deploy.ts --network localnetL'output dovrebbe essere simile a:
1ChipToken deployed to: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487dOra prova a eseguire il test simple.js sulla tua dApp locale per confermare che ogni giocatore nella nostra dApp di Blackjack abbia 1000 token coniati per loro:
L'output dovrebbe essere simile a questo:
1npx hardhat test --network localnetL'output dovrebbe essere simile a questo:
1ChipToken2 mint3 ✔ should mint 1000 chips for PLAYER ONE45 1 passing (654ms)Revisione
A questo punto, hai configurato un ambiente di sviluppo di dApp, lo hai connesso a una rete locale di Ethereum creata da Kurtosis e hai compilato, distribuito ed eseguito un semplice test sulla tua dApp.
Ora esploriamo come puoi configurare la rete sottostante per testare le nostre dApp in diverse configurazioni di rete.
Configurare la rete di test locale di Ethereum
Modificare le configurazioni dei client e il numero di nodi
La tua rete di test locale di Ethereum può essere configurata per utilizzare diverse coppie di client EL e CL, oltre a un numero variabile di nodi, a seconda dello scenario e della specifica configurazione di rete che desideri sviluppare o testare. Ciò significa che, una volta configurata, puoi avviare una rete di test locale personalizzata e utilizzarla per eseguire gli stessi flussi di lavoro (distribuzione, test, ecc.) in varie configurazioni di rete per assicurarti che tutto funzioni come previsto. Per saperne di più sugli altri parametri che puoi modificare, visita questo link.
Fai una prova! Puoi passare varie opzioni di configurazione all'eth-network-package tramite un file JSON. Questo file JSON dei parametri di rete fornisce le configurazioni specifiche che Kurtosis utilizzerà per configurare la rete locale di Ethereum.
Prendi il file di configurazione predefinito e modificalo per avviare due nodi con diverse coppie EL/CL:
- Nodo 1 con
geth/lighthouse - Nodo 2 con
geth/lodestar - Nodo 3 con
geth/teku
Questa configurazione crea una rete eterogenea di implementazioni di nodi Ethereum per testare la tua dApp. Il tuo file di configurazione dovrebbe ora apparire così:
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}Mostra tuttoOgni struttura participants è mappata a un nodo nella rete, quindi 3 strutture participants diranno a Kurtosis di avviare 3 nodi nella tua rete. Ogni struttura participants ti consentirà di specificare la coppia EL e CL utilizzata per quel nodo specifico.
La struttura network_params configura le impostazioni di rete che vengono utilizzate per creare i file di genesi per ogni nodo, oltre ad altre impostazioni come i secondi per slot della rete.
Salva il tuo file dei parametri modificato in qualsiasi directory desideri (nell'esempio seguente, è salvato sul desktop) e quindi utilizzalo per eseguire il tuo pacchetto Kurtosis eseguendo:
1kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)"Nota: il comando kurtosis clean -a viene utilizzato qui per istruire Kurtosis a distruggere la vecchia rete di test e i suoi contenuti prima di avviarne una nuova.
Ancora una volta, Kurtosis lavorerà per un po' e stamperà i singoli passaggi che stanno avendo luogo. Alla fine, l'output dovrebbe essere simile a:
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> STOPPEDMostra tuttoCongratulazioni! Hai configurato con successo la tua rete di test locale per avere 3 nodi invece di 1. Per eseguire gli stessi flussi di lavoro che hai fatto prima sulla tua dApp (distribuzione e test), esegui le stesse operazioni che abbiamo fatto prima sostituendo <$YOUR_PORT> nella struttura localnet nel tuo file di configurazione hardhat.config.ts con la porta dell'URI RPC in output da qualsiasi servizio el-client-<num> nella tua nuova rete di test locale a 3 nodi.
Conclusione
E questo è tutto! Per riassumere questa breve guida, hai:
- Creato una rete di test locale di Ethereum su Docker utilizzando Kurtosis
- Connesso il tuo ambiente di sviluppo di dApp locale alla rete locale di Ethereum
- Distribuito una dApp ed eseguito un semplice test su di essa sulla rete locale di Ethereum
- Configurato la rete Ethereum sottostante per avere 3 nodi
Ci piacerebbe sapere da te cosa è andato bene, cosa potrebbe essere migliorato o rispondere a qualsiasi tua domanda. Non esitare a contattarci tramite GitHub (opens in a new tab) o inviaci un'e-mail (opens email client)!
Altri esempi e guide
Ti invitiamo a dare un'occhiata alla nostra guida rapida (opens in a new tab) (dove costruirai un database Postgres e un'API su di esso) e ai nostri altri esempi nel nostro repository awesome-kurtosis (opens in a new tab) dove troverai alcuni ottimi esempi, inclusi pacchetti per:
- Avviare la stessa rete di test locale di Ethereum (opens in a new tab), ma con servizi aggiuntivi connessi come uno spammer di transazioni (per simulare transazioni), un monitor di biforcazione e un'istanza Grafana e Prometheus connessa
- Eseguire un test di sotto-rete (opens in a new tab) sulla stessa rete locale di Ethereum
Ultimo aggiornamento della pagina: 23 settembre 2025