3.1 Ethers.js 和 Web3.js 的主要区别是什么?
比较点 | Ethers.js | Web3.js |
---|---|---|
体积 | 更轻量,适合前端 | 较大,加载慢,适合 Node |
文档 | 文档简洁、现代化,支持 TypeScript | 文档丰富,但不够现代化 |
模块化设计 | 高度模块化(如 Provider、Wallet、Contract 分离) | 一体式架构 |
私钥管理 | 内置 Wallet 支持本地签名,适合前端或热钱包使用 | 需借助第三方或 Web3 Provider |
支持度 | 新项目推荐使用,开发活跃 | 老项目常用,兼容性好 |
常用版本 | ethers@5 和 ethers@6 |
web3@1.x ,较少更新 |
👉 总体来说:新项目推荐 Ethers.js,Web3.js 更适合老项目维护。
3.2 如何用 Ethers.js 查询钱包余额?
const { ethers } = require("ethers");
// 使用默认的以太坊主网Provider(也可传Infura、Alchemy等)
const provider = new ethers.providers.InfuraProvider("homestead", "YOUR_INFURA_API_KEY");
async function getBalance(address) {
const balance = await provider.getBalance(address);
console.log(`Balance: ${ethers.utils.formatEther(balance)} ETH`);
}
getBalance("0x742d35Cc6634C0532925a3b844Bc454e4438f44e");
3.3 如何使用私钥签名一笔交易并广播?
const { ethers } = require("ethers");
const provider = new ethers.providers.InfuraProvider("goerli", "YOUR_INFURA_API_KEY");
const privateKey = "YOUR_PRIVATE_KEY";
const wallet = new ethers.Wallet(privateKey, provider);
async function sendTransaction() {
const tx = {
to: "0xRecipientAddressHere",
value: ethers.utils.parseEther("0.01"),
gasLimit: 21000,
maxFeePerGas: ethers.utils.parseUnits("50", "gwei"),
maxPriorityFeePerGas: ethers.utils.parseUnits("2", "gwei")
};
const txResponse = await wallet.sendTransaction(tx);
console.log("Transaction Hash:", txResponse.hash);
const receipt = await txResponse.wait();
console.log("Transaction Confirmed:", receipt.blockNumber);
}
sendTransaction().catch(console.error);
3.4 如何监听一个合约事件(Event)?如何处理多个事件?
const { ethers } = require("ethers");
const provider = new ethers.providers.WebSocketProvider("wss://mainnet.infura.io/ws/v3/YOUR_INFURA_API_KEY");
const contractAddress = "0xYourContractAddress";
const abi = [
"event Transfer(address indexed from, address indexed to, uint value)",
"event Approval(address indexed owner, address indexed spender, uint value)"
];
const contract = new ethers.Contract(contractAddress, abi, provider);
// 监听 Transfer 事件
contract.on("Transfer", (from, to, value, event) => {
console.log(`Transfer from ${from} to ${to}: ${ethers.utils.formatUnits(value, 18)} tokens`);
console.log("Block:", event.blockNumber);
});
// 监听 Approval 事件
contract.on("Approval", (owner, spender, value) => {
console.log(`Approval: ${owner} approved ${spender} to spend ${value.toString()}`);
});
// 可通过 contract.removeAllListeners() 停止监听
📌 总结要点:
Ethers.js 更轻便现代,签名交易、监听事件和查询数据都非常清晰易用。
合约事件支持多个监听器并行,适合做实时处理或通知系统。