测试代币是在测试网络上发行的免费、无价值资产,让开发者能够在不冒真实资金风险的情况下测试智能合约、钱包和 dApp。本指南解释了测试代币背后的思维模型,如何从水龙头获取它们或铸造自己的 ERC-20,以及如何运行可复现的验证流程。它还涵盖了验证、故障排除,以及依赖公共测试网与私有或专用环境的权衡。
什么是测试代币以及本指南涵盖的内容
测试代币是仅存在于测试网上的区块链资产——测试网是一个与主网行为平行但使用无价值货币的网络。它们让你能够部署合约、模拟转账和测试钱包流程,而无需花费真实资金。与生产代币不同,测试代币没有市场价值,绝不应被视为投资。
本指南涵盖完整生命周期:从水龙头获取测试代币、铸造自己的测试 ERC-20、在脚本中使用它们、验证预期结果以及排查常见故障。本指南假设你拥有一个基本钱包、可访问测试网 RPC 端点,并熟悉以太坊风格的交易。关于端点选择,请参阅 RPC 端点指南。
- 测试代币是免费且特定于网络的;它们不会转移到主网。
- 水龙头通常按地址和网络限制请求频率。
- 如果你需要自定义供应量或行为,可以铸造自己的测试代币。
先决条件与假设
在开始之前,请确保你拥有一个由你控制私钥的钱包(切勿使用主网密钥)、一个测试网 RPC URL 以及少量原生测试网 gas 代币(例如测试网 ETH)。如果你计划运行 JavaScript 示例,还需要 Node.js 和 npm;对于 Python 示例,则需要 Python 3 和 web3.py。
所有代码示例都使用诸如 RPC_URL 和 PRIVATE_KEY 之类的占位符。请将它们替换为你自己的值。切勿将私钥提交到版本控制中。
测试代币的工作原理:水龙头、铸造与网络隔离
测试代币有两个主要来源:水龙头和自铸造。水龙头是向钱包地址分发少量原生或 ERC-20 测试代币的服务,通常有速率限制。它们对于测试网 USDC 或包装 ETH 等标准代币很方便。自铸造涉及在测试网上部署自己的 ERC-20 合约并调用其 mint 函数;这让你完全控制供应量和代币行为。
测试网与主网隔离:Sepolia 上的交易不会影响以太坊主网,测试代币也无法跨链到主网。这种隔离正是它们可以安全用于实验的原因。然而,测试网状态可能会被网络运营商重置,因此不要依赖测试代币进行长期持久化。
- 水龙头最适合原生 gas 代币和常见稳定币。
- 自铸造代币最适合自定义逻辑、访问控制或大供应量。
- 在发送交易之前,务必验证测试网链 ID。
从水龙头获取测试代币
水龙头的工作流程各不相同,但大多数要求你连接钱包或粘贴地址、选择网络并请求代币。一些水龙头需要身份验证或最低钱包余额以防止滥用。请求后,等待交易确认并检查你的余额。
以下 curl 示例查询一个通用水龙头 API(将 FAUCET_URL 和 ADDRESS 替换为实际值)。这仅是示例;并非所有水龙头都公开 API。
curl -X POST "FAUCET_URL/request" \
-H "Content-Type: application/json" \
-d '{"address":"ADDRESS","network":"sepolia"}'铸造自己的测试 ERC-20:合约与部署
如果你需要自定义测试代币,请在测试网上部署一个最小的 ERC-20 合约。以下是一个带有开放 mint 函数用于测试的 Solidity 合约。请勿在生产环境中使用。
使用 Hardhat 或 Remix 编译并部署。部署后,使用你的地址和所需数量调用 mint。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract TestToken is ERC20 {
constructor() ERC20("TestToken", "TEST") {}
function mint(address to, uint256 amount) external {
_mint(to, amount);
}
}在 JavaScript 脚本中使用测试代币
一旦你拥有测试代币,就可以使用 ethers.js 与它们交互。下面的脚本连接到测试网 RPC,检查测试 ERC-20 的余额,并将代币转移到另一个地址。将 TOKEN_ADDRESS、RECIPIENT 和 PRIVATE_KEY 替换为你的值。
使用 node script.js 运行。确保钱包有足够的原生 gas 代币用于转账。
const { ethers } = require("ethers");
const provider = new ethers.JsonRpcProvider("RPC_URL");
const wallet = new ethers.Wallet("PRIVATE_KEY", provider);
const tokenAddress = "TOKEN_ADDRESS";
const abi = ["function balanceOf(address) view returns (uint256)", "function transfer(address,uint256) returns (bool)"];
const token = new ethers.Contract(tokenAddress, abi, wallet);
async function main() {
const balance = await token.balanceOf(wallet.address);
console.log("Balance:", ethers.formatUnits(balance, 18));
const tx = await token.transfer("RECIPIENT", ethers.parseUnits("1", 18));
await tx.wait();
console.log("Transfer confirmed");
}
main().catch(console.error);使用结果表验证预期结果
运行测试后,将结果记录在结果表中,以比较预期行为与实际行为。以下是一个模板;填写你自己的测量值。不要编造数字——运行流程并记录实际值。
| 测试用例 | 预期结果 | 实际结果 | 通过/失败 |
|---|---|---|---|
| 水龙头请求 | 2 分钟内收到代币 | ||
| 代币余额 | 余额等于铸造数量 | ||
| 转账 | 接收者余额增加相应数量 | ||
| Gas 估算 | 交易在足够 gas 下成功 |
使用此表记录每次运行并识别回归。
排查常见的测试代币问题
常见问题包括水龙头速率限制、gas 不足、网络错误和合约未验证。如果水龙头返回错误,请检查速率限制并稍后重试。如果交易失败,请确保钱包有原生测试网 gas 且代币合约地址正确。
对于 RPC 相关错误,请验证端点是否响应并指向正确的链 ID。你可以使用简单的 curl 请求 RPC URL 来测试连通性。
- 水龙头限制超出:等待冷却期。
- 交易回滚:检查代币余额和 gas。
- 网络错误:确认钱包和 RPC 中的链 ID。
- 合约未找到:验证地址和测试网。
公共测试网的局限性与权衡
公共测试网免费但有代价:速率限制、不可靠的水龙头和偶尔的网络重置。它们可能无法反映主网的 gas 成本或拥堵情况。对于重度测试,考虑私有测试网或专用节点环境。OnFinality 提供 专用节点 服务,可提供隔离的测试环境。
测试代币没有货币价值,绝不应在生产中使用。在主网部署前务必审计合约。
后续步骤:从测试代币到生产就绪
使用测试代币验证后,转向一个紧密镜像主网的暂存环境。为测试网和主网使用可靠的 RPC 提供商。探索 OnFinality 的 API 服务 和 RPC 定价 以获取可扩展的基础设施。关于特定网络的指南,请参阅 支持的网路。
关于端点建议,请查阅 RPC Assistant 文章,例如 最佳以太坊 RPC API 和 Solana devnet 指南。