以太坊测试网络是开发者测试智能合约和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. 网络参数
javascriptconst 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. 常用水龙头
- Sepolia Faucet: https://faucet.sepolia.dev
- Goerli Faucet: https://goerlifaucet.com
- Alchemy Faucet: https://goerlifaucet.com
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: 可以,但需要重新部署。合约地址会改变,需要更新相关配置。
测试网络是以太坊开发的重要工具,充分测试可以避免主网部署时的问题。