Cách phát triển và thử nghiệm một dApp trên mạng thử nghiệm đa máy khách cục bộ
Giới thiệu
Hướng dẫn này sẽ chỉ cho bạn quy trình khởi tạo mạng thử nghiệm Ethereum cục bộ có thể định cấu hình, triển khai hợp đồng thông minh trên đó và sử dụng mạng thử nghiệm để chạy thử nghiệm trên dApp của bạn. Hướng dẫn này được thiết kế dành cho các nhà phát triển dApp muốn phát triển và thử nghiệm các dApp của họ cục bộ so với các cấu hình mạng khác nhau trước khi triển khai lên mạng thử nghiệm trực tiếp hoặc mạng chính.
Trong hướng dẫn này, bạn sẽ:
- Khởi tạo một mạng thử nghiệm Ethereum cục bộ bằng
eth-network-packageopens in a new tab có sử dụng Kurtosisopens in a new tab, - Kết nối môi trường phát triển dApp Hardhat của bạn với mạng thử nghiệm cục bộ để biên dịch, triển khai và thử nghiệm một dApp, và
- Cấu hình mạng thử nghiệm cục bộ, bao gồm các tham số như số lượng nút và các cặp máy khách EL/CL cụ thể, để cho phép quy trình phát triển và thử nghiệm so với các cấu hình mạng khác nhau.
Kurtosis là gì?
Kurtosisopens in a new tab là một hệ thống xây dựng có thể kết hợp được thiết kế để định cấu hình các môi trường thử nghiệm đa vùng chứa. Nó đặc biệt cho phép các nhà phát triển tạo ra các môi trường có thể tái tạo yêu cầu logic thiết lập động, chẳng hạn như mạng thử nghiệm chuỗi khối.
Trong hướng dẫn này, gói mạng eth Kurtosis khởi động một mạng thử nghiệm Ethereum cục bộ có hỗ trợ cho ứng dụng lớp thực thi (EL) gethopens in a new tab, cũng như các ứng dụng lớp đồng thuận (CL) tekuopens in a new tab, lighthouseopens in a new tab và lodestaropens in a new tab. Gói này phục vụ như một giải pháp thay thế có thể định cấu hình và có thể kết hợp cho các mạng trong các khuôn khổ như Hardhat Network, Ganache, và Anvil. Kurtosis cung cấp cho các nhà phát triển sự kiểm soát và linh hoạt cao hơn đối với các mạng thử nghiệm mà họ sử dụng, đây là lý do chính tại sao Ethereum Foundation đã sử dụng Kurtosis để thử nghiệm The Mergeopens in a new tab và tiếp tục sử dụng nó để thử nghiệm các bản nâng cấp mạng.
Thiết lập Kurtosis
Trước khi tiếp tục, hãy đảm bảo bạn có:
- Đã cài đặt và khởi động công cụ Dockeropens in a new tab trên máy cục bộ của bạn
- Đã cài đặt Kurtosis CLIopens in a new tab (hoặc nâng cấp nó lên bản phát hành mới nhất, nếu bạn đã cài đặt CLI)
- Đã cài đặt Node.jsopens in a new tab, yarnopens in a new tab, và npxopens in a new tab (cho môi trường dApp của bạn)
Khởi tạo mạng thử nghiệm Ethereum cục bộ
Để khởi động mạng thử nghiệm Ethereum cục bộ, hãy chạy:
1kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-packageLưu ý: Lệnh này đặt tên cho mạng của bạn: "local-eth-testnet\” bằng cách sử dụng cờ --enclave.
Kurtosis sẽ in các bước mà nó đang thực hiện ngầm khi nó hoạt động để diễn giải, xác thực, và sau đó thực thi các hướng dẫn. Cuối cùng, bạn sẽ thấy một kết quả đầu ra giống như sau:
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> STOPPED35Hiện tất cảXin chúc mừng! Bạn đã sử dụng Kurtosis để khởi tạo một mạng thử nghiệm Ethereum cục bộ, với một ứng dụng CL (lighthouse) và một ứng dụng EL (geth), trên Docker.
Đánh giá lại
Trong phần này, bạn đã thực thi một lệnh hướng Kurtosis sử dụng eth-network-package được lưu trữ từ xa trên GitHubopens in a new tab để khởi động một mạng thử nghiệm Ethereum cục bộ trong một Enclaveopens in a new tab Kurtosis. Bên trong enclave của bạn, bạn sẽ tìm thấy cả "tệp tạo tác" và "dịch vụ người dùng".
Tệp tạo tácopens in a new tab trong enclave của bạn bao gồm tất cả dữ liệu được tạo và sử dụng để khởi động các ứng dụng EL và CL. Dữ liệu được tạo bằng cách sử dụng dịch vụ prelaunch-data-generator được xây dựng từ hình ảnh Dockeropens in a new tab này
Các dịch vụ người dùng hiển thị tất cả các dịch vụ được đóng gói đang hoạt động trong enclave của bạn. Bạn sẽ nhận thấy rằng một nút duy nhất, có cả ứng dụng EL và ứng dụng CL, đã được tạo.
Kết nối môi trường phát triển dApp của bạn với mạng thử nghiệm Ethereum cục bộ
Thiết lập môi trường phát triển dApp
Bây giờ bạn đã có một mạng thử nghiệm cục bộ đang chạy, bạn có thể kết nối môi trường phát triển dApp của mình để sử dụng mạng thử nghiệm cục bộ. Khuôn khổ Hardhat sẽ được sử dụng trong hướng dẫn này để triển khai một dApp blackjack tới mạng thử nghiệm cục bộ của bạn.
Để thiết lập môi trường phát triển dApp của bạn, hãy sao chép kho lưu trữ chứa dApp mẫu của chúng tôi và cài đặt các phần phụ thuộc của nó, hãy chạy:
1git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarnThư mục smart-contract-exampleopens in a new tab được sử dụng ở đây chứa thiết lập điển hình cho một nhà phát triển dApp sử dụng khuôn khổ Hardhatopens in a new tab:
contracts/opens in a new tab chứa một vài hợp đồng thông minh đơn giản cho một dApp Blackjackscripts/opens in a new tab chứa một tập lệnh để triển khai hợp đồng token cho mạng Ethereum cục bộ của bạntest/opens in a new tab chứa một bài kiểm tra .js đơn giản cho hợp đồng token của bạn để xác nhận mỗi người chơi trong dApp Blackjack của chúng tôi có 1000 được đúc cho họhardhat.config.tsopens in a new tab cấu hình thiết lập Hardhat của bạn
Cấu hình Hardhat để sử dụng mạng thử nghiệm cục bộ
Với môi trường phát triển dApp đã được thiết lập, bây giờ bạn sẽ kết nối Hardhat để sử dụng mạng thử nghiệm Ethereum cục bộ được tạo bằng Kurtosis. Để thực hiện điều này, hãy thay thế <$YOUR_PORT> trong cấu trúc localnet trong tệp cấu hình hardhat.config.ts của bạn bằng cổng của đầu ra rpc uri từ bất kỳ dịch vụ el-client-<num> nào. Trong trường hợp mẫu này, cổng sẽ là 64248. Cổng của bạn sẽ khác.
Ví dụ trong hardhat.config.ts:
1localnet: {2url: 'http://127.0.0.1:<$YOUR_PORT>',// TODO: THAY THẾ $YOUR_PORT BẰNG CỔNG CỦA MỘT URI NÚT DO GÓI MẠNG KURTOSIS ETH TẠO RA34// Đây là các khóa riêng được liên kết với các tài khoản thử nghiệm được cấp vốn trước do gói mạng eth tạo ra5// <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},Hiện tất cảSau khi bạn lưu tệp của mình, môi trường phát triển dApp Hardhat của bạn hiện đã được kết nối với mạng thử nghiệm Ethereum cục bộ của bạn! Bạn có thể xác minh rằng mạng thử nghiệm của mình đang hoạt động bằng cách chạy:
1npx hardhat balances --network localnetKết quả đầu ra sẽ trông giống như sau:
10x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 1000000000000000000000000020x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 1000000000000000000000000030xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 1000000000000000000000000040x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 1000000000000000000000000050x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 1000000000000000000000000060x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000Điều này xác nhận rằng Hardhat đang sử dụng mạng thử nghiệm cục bộ của bạn và phát hiện các tài khoản được cấp vốn trước được tạo bởi eth-network-package.
Triển khai và thử nghiệm dApp của bạn cục bộ
Với môi trường phát triển dApp được kết nối hoàn toàn với mạng thử nghiệm Ethereum cục bộ, giờ đây bạn có thể chạy quy trình phát triển và thử nghiệm trên dApp của mình bằng cách sử dụng mạng thử nghiệm cục bộ.
Để biên dịch và triển khai hợp đồng thông minh ChipToken.sol để tạo mẫu và phát triển cục bộ, hãy chạy:
1npx hardhat compile2npx hardhat run scripts/deploy.ts --network localnetĐầu ra sẽ trông giống như:
1ChipToken deployed to: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487dBây giờ, hãy thử chạy thử nghiệm simple.js trên dApp cục bộ của bạn để xác nhận mỗi người chơi trong dApp Blackjack của chúng tôi có 1000 được đúc cho họ:
Kết quả đầu ra sẽ trông giống như sau:
1npx hardhat test --network localnetKết quả đầu ra sẽ trông giống như sau:
1ChipToken2 mint3 ✔ nên đúc 1000 chip cho PLAYER ONE45 1 vượt qua (654ms)Đánh giá lại
Tại thời điểm này, bạn đã thiết lập một môi trường phát triển dApp, kết nối nó với một mạng Ethereum cục bộ được tạo bởi Kurtosis, và đã biên dịch, triển khai và chạy một thử nghiệm đơn giản trên dApp của bạn.
Bây giờ, chúng ta hãy khám phá cách bạn có thể cấu hình mạng cơ bản để thử nghiệm các dApp của chúng tôi trong các cấu hình mạng khác nhau.
Cấu hình mạng thử nghiệm Ethereum cục bộ
Thay đổi cấu hình ứng dụng khách và số lượng nút
Mạng thử nghiệm Ethereum cục bộ của bạn có thể được cấu hình để sử dụng các cặp ứng dụng EL và CL khác nhau, cũng như một số lượng nút khác nhau, tùy thuộc vào kịch bản và cấu hình mạng cụ thể mà bạn muốn phát triển hoặc thử nghiệm. Điều này có nghĩa là, sau khi thiết lập, bạn có thể khởi động một mạng thử nghiệm cục bộ tùy chỉnh và sử dụng nó để chạy các quy trình công việc tương tự (triển khai, thử nghiệm, v.v.) trong các cấu hình mạng khác nhau để đảm bảo mọi thứ hoạt động như mong đợi. Để tìm hiểu thêm về các tham số khác mà bạn có thể sửa đổi, hãy truy cập liên kết này.
Hãy thử xem! Bạn có thể chuyển các tùy chọn cấu hình khác nhau cho eth-network-package thông qua một tệp JSON. Tệp JSON tham số mạng này cung cấp các cấu hình cụ thể mà Kurtosis sẽ sử dụng để thiết lập mạng Ethereum cục bộ.
Lấy tệp cấu hình mặc định và chỉnh sửa nó để khởi động hai nút với các cặp EL/CL khác nhau:
- Nút 1 với
geth/lighthouse - Nút 2 với
geth/lodestar - Nút 3 với
geth/teku
Cấu hình này tạo ra một mạng lưới không đồng nhất gồm các triển khai nút Ethereum để thử nghiệm dApp của bạn. Tệp cấu hình của bạn bây giờ sẽ trông như sau:
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}Hiện tất cảMỗi cấu trúc participants ánh xạ tới một nút trong mạng, vì vậy 3 cấu trúc participants sẽ cho Kurtosis biết để khởi động 3 nút trong mạng của bạn. Mỗi cấu trúc participants sẽ cho phép bạn chỉ định cặp EL và CL được sử dụng cho nút cụ thể đó.
Cấu trúc network_params cấu hình các cài đặt mạng được sử dụng để tạo các tệp genesis cho mỗi nút cũng như các cài đặt khác như số giây mỗi slot của mạng.
Lưu tệp tham số đã chỉnh sửa của bạn vào bất kỳ thư mục nào bạn muốn (trong ví dụ bên dưới, nó được lưu vào màn hình nền) và sau đó sử dụng nó để chạy gói Kurtosis của bạn bằng cách chạy:
1kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)"Lưu ý: lệnh kurtosis clean -a được sử dụng ở đây để hướng dẫn Kurtosis hủy mạng thử nghiệm cũ và nội dung của nó trước khi khởi động một mạng mới.
Một lần nữa, Kurtosis sẽ hoạt động một chút và in ra các bước riêng lẻ đang diễn ra. Cuối cùng, đầu ra sẽ trông giống như:
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> STOPPEDHiện tất cảXin chúc mừng! Bạn đã cấu hình thành công mạng thử nghiệm cục bộ của mình để có 3 nút thay vì 1. Để chạy các quy trình công việc tương tự như bạn đã làm trước đây trên dApp của mình (triển khai & thử nghiệm), hãy thực hiện các thao tác tương tự như chúng tôi đã làm trước đây bằng cách thay thế <$YOUR_PORT> trong cấu trúc localnet trong tệp cấu hình hardhat.config.ts của bạn bằng cổng của đầu ra rpc uri từ bất kỳ dịch vụ el-client-<num> nào trong mạng thử nghiệm cục bộ 3 nút mới của bạn.
Kết luận
Vậy là xong! Tóm lại hướng dẫn ngắn này, bạn đã:
- Đã tạo một mạng thử nghiệm Ethereum cục bộ trên Docker bằng Kurtosis
- Đã kết nối môi trường phát triển dApp cục bộ của bạn với mạng Ethereum cục bộ
- Đã triển khai một dApp và chạy một thử nghiệm đơn giản trên nó trên mạng Ethereum cục bộ
- Đã cấu hình mạng Ethereum cơ bản để có 3 nút
Chúng tôi rất muốn nghe từ bạn về những gì đã diễn ra tốt đẹp với bạn, những gì có thể được cải thiện, hoặc để trả lời bất kỳ câu hỏi nào của bạn. Đừng ngần ngại liên hệ qua GitHubopens in a new tab hoặc gửi email cho chúng tôiopens email client!
Các ví dụ và hướng dẫn khác
Chúng tôi khuyến khích bạn xem qua bắt đầu nhanhopens in a new tab của chúng tôi (nơi bạn sẽ xây dựng một cơ sở dữ liệu Postgres và Giao diện Lập trình Ứng dụng trên đó) và các ví dụ khác của chúng tôi trong kho lưu trữ awesome-kurtosisopens in a new tab nơi bạn sẽ tìm thấy một số ví dụ tuyệt vời, bao gồm các gói cho:
- Khởi động cùng một mạng thử nghiệm Ethereum cục bộopens in a new tab, nhưng với các dịch vụ bổ sung được kết nối như trình spam giao dịch (để mô phỏng giao dịch), trình theo dõi phân nhánh và một phiên bản Grafana và Prometheus được kết nối
- Thực hiện thử nghiệm mạng conopens in a new tab trên cùng một mạng Ethereum cục bộ
Lần cập nhật trang lần cuối: 23 tháng 9, 2025