乐闻世界logo
搜索文章和话题

什么是以太坊测试网络?请解释Sepolia、Goerli等测试网的使用方法

2月21日 14:18

以太坊测试网络是开发者测试智能合约和DApp的重要环境,提供与主网相似的功能但使用测试币。以下是测试网络的全面解析:

测试网络的基本概念

以太坊测试网络(Testnet)是与主网(Mainnet)功能相同的独立网络,用于开发和测试。测试网络使用测试币,没有实际价值,可以免费获取。

主要测试网络

1. Sepolia

当前推荐的测试网络。

特点:

  • PoS共识
  • 稳定的网络
  • 支持EIP-1559

获取测试币:

javascript
// 使用水龙头获取测试币 async function getSepoliaETH(address) { const response = await fetch('https://faucet.sepolia.dev', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ address }) }); const data = await response.json(); console.log("Transaction hash:", data.txHash); }

2. Goerli

已弃用的测试网络,但仍有一些项目在使用。

3. Holesky

信标链测试网络,用于PoS测试。

本地测试网络

1. Hardhat Network

Hardhat内置的本地测试网络。

配置:

javascript
// hardhat.config.js module.exports = { networks: { hardhat: { chainId: 31337, accounts: { count: 20, accountsBalance: "10000000000000000000000" // 10000 ETH } } }, solidity: "0.8.19" };

使用:

javascript
// 在Hardhat网络中测试 const { expect } = require("chai"); describe("MyContract", function () { it("Should work on Hardhat network", async function () { const [owner, addr1] = await ethers.getSigners(); const MyContract = await ethers.getContractFactory("MyContract"); const contract = await MyContract.deploy(); await contract.connect(addr1).someFunction(); expect(await contract.balanceOf(addr1.address)).to.equal(1); }); });

2. Ganache

本地区块链模拟器。

启动:

bash
# 启动Ganache ganache-cli --deterministic --accounts 10 --defaultBalanceEther 1000

连接:

javascript
// 连接到Ganache const provider = new ethers.providers.JsonRpcProvider("http://127.0.0.1:8545"); const wallet = new ethers.Wallet(privateKey, provider);

3. Anvil

Foundry的本地测试网络。

启动:

bash
# 启动Anvil anvil --fork-url https://eth-mainnet.alchemyapi.io/v2/YOUR_API_KEY

测试网络配置

1. 网络参数

javascript
const networks = { sepolia: { chainId: 11155111, name: 'Sepolia', rpcUrl: 'https://sepolia.infura.io/v3/YOUR_PROJECT_ID', blockExplorer: 'https://sepolia.etherscan.io', faucet: 'https://faucet.sepolia.dev' }, goerli: { chainId: 5, name: 'Goerli', rpcUrl: 'https://goerli.infura.io/v3/YOUR_PROJECT_ID', blockExplorer: 'https://goerli.etherscan.io', faucet: 'https://goerlifaucet.com' } };

2. 切换网络

javascript
// MetaMask切换网络 async function switchNetwork(chainId) { try { await window.ethereum.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: `0x${chainId.toString(16)}` }] }); } catch (switchError) { if (switchError.code === 4902) { await window.ethereum.request({ method: 'wallet_addEthereumChain', params: [{ chainId: `0x${chainId.toString(16)}`, chainName: 'Sepolia', nativeCurrency: { name: 'Sepolia ETH', symbol: 'ETH', decimals: 18 }, rpcUrls: ['https://sepolia.infura.io/v3/YOUR_PROJECT_ID'], blockExplorerUrls: ['https://sepolia.etherscan.io'] }] }); } } }

部署到测试网络

1. 使用Hardhat部署

javascript
// scripts/deploy.js async function main() { const [deployer] = await ethers.getSigners(); console.log("Deploying contracts with account:", deployer.address); const MyContract = await ethers.getContractFactory("MyContract"); const contract = await MyContract.deploy(); await contract.deployed(); console.log("MyContract deployed to:", contract.address); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });

运行部署:

bash
# 部署到Sepolia npx hardhat run scripts/deploy.js --network sepolia

2. 使用Foundry部署

solidity
// script/Deploy.s.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "forge-std/Script.sol"; import "../src/MyContract.sol"; contract DeployScript is Script { function run() external { uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); MyContract contract = new MyContract(); console.log("Contract deployed to:", address(contract)); vm.stopBroadcast(); } }

运行部署:

bash
# 部署到Sepolia forge script script/Deploy.s.sol --rpc-url $SEPOLIA_RPC_URL --private-key $PRIVATE_KEY --broadcast

测试网络水龙头

1. 常用水龙头

2. 水龙头使用

javascript
// 自动获取测试币 async function requestTestETH(address) { const faucets = [ 'https://faucet.sepolia.dev', 'https://goerlifaucet.com' ]; for (const faucet of faucets) { try { const response = await fetch(faucet, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ address }) }); if (response.ok) { console.log(`Successfully requested ETH from ${faucet}`); break; } } catch (error) { console.log(`Failed to request from ${faucet}:`, error.message); } } }

测试网络最佳实践

1. 开发流程

bash
# 1. 在本地网络开发 npx hardhat test # 2. 部署到测试网络 npx hardhat run scripts/deploy.js --network sepolia # 3. 验证合约 npx hardhat verify --network sepolia CONTRACT_ADDRESS # 4. 与合约交互 npx hardhat console --network sepolia

2. 环境变量管理

bash
# .env文件 SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/YOUR_PROJECT_ID PRIVATE_KEY=your_private_key ETHERSCAN_API_KEY=your_etherscan_api_key
javascript
// 使用环境变量 require('dotenv').config(); const config = { sepolia: { url: process.env.SEPOLIA_RPC_URL, accounts: [process.env.PRIVATE_KEY] } };

测试网络与主网的区别

1. 主要区别

特性测试网络主网
ETH价值无实际价值有实际价值
Gas费用
网络稳定性可能不稳定高稳定性
数据持久性可能重置永久保存
社区支持开发者社区全体用户

2. 主网部署检查清单

  • 在测试网络充分测试
  • 通过安全审计
  • 准备足够的ETH支付Gas费用
  • 验证合约代码
  • 准备应急方案
  • 设置监控和告警
  • 准备文档和用户指南

常见问题

Q: 测试网络会重置吗?

A: 某些测试网络会定期重置,但Sepolia相对稳定。重要数据应备份。

Q: 如何获取更多测试币?

A: 使用水龙头,但通常有时间限制。可以尝试不同的水龙头或等待冷却时间。

Q: 测试网络合约可以迁移到主网吗?

A: 可以,但需要重新部署。合约地址会改变,需要更新相关配置。

测试网络是以太坊开发的重要工具,充分测试可以避免主网部署时的问题。

标签:以太坊