核心关键词:以太坊开发、JavaScript、Web3.js、Ethers.js、智能合约、JSON-RPC、钱包、Gwei、Gas
无论你想做 DeFi、NFT 还是链游,第一件事都是让前端「连上」以太坊。与其手写冗长的 JSON-RPC 请求,不如用功能成熟的 JavaScript 库 快速完成节点通信、钱包管理与合约交互。下文用通俗场景+代码示例,一次性带你入门 以太坊开发 的常用工具与写法。
为什么需要 JavaScript 库
直接调用 JSON-RPC 的缺点显而易见:
- 请求体与响应字段都要手动拼装、解析。
- 十六进制、WEI 等单位转换容易写错。
- 调用失败时错误处理高度依赖经验。
Ethers.js、Web3.js 等库将上述工作量压缩成一行代码,开发者只需关注业务逻辑:
- 链读/写、交易签名自动封装。
- ETH 与 Gwei、WEI 无缝换算。
- Promise / async-await 友好,更适合现代前端。
运行节点或远程接入
本地开发通常用 Geth 或 Nethermind 作为执行客户端,搭配 Lighthouse 或 Teku 作为共识客户端。节点运行后,默认暴露 http://localhost:8545 和 ws://localhost:8546。
如果节点托管在 AWS、GCP 或 Infura 等平台,只需把 IP 或域名替换到连接字符串即可。
常用库全景速览
| 库名 | 特点 | 适用场景 |
|---|---|---|
| Web3.js | 最老牌、API 全面、社区庞大 | 兼容老项目、批量脚本 |
| Ethers.js | 更小、更现代、TypeScript 原生支持 | React/Next 项目 |
| Web3-wrapper | 微软 & 0x 出品,原生 TypeScript | 高频量化、网关服务 |
| Alchemyweb3 | 带自动重试、实时订阅增强版 | NFT 后台轮询 |
| light.js | 轻量级响应式流,可跑在硬件钱包内部 | dApp-on-mobile |
👉 一文看懂 2025 年最火的五款以太坊 JavaScript 库对比与实战演练
步骤一:连接到以太坊节点
1. Ethers.js 写法(推荐)
import { ethers } from "ethers";
// 浏览器环境 MetaMask 注入
const provider = new ethers.BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
console.log(await provider.getBlockNumber()); // 最新区块号2. Web3.js 写法(经典)
const Web3 = require('web3');
// HTTP
const web3 = new Web3('https://mainnet.infura.io/v3/<PROJECT-ID>');
// 或 WebSocket
web3.setProvider('wss://mainnet.infura.io/ws/v3/<PROJECT-ID>');冷知识:在 Node.js 里可以用 Unix 域套接字连接本地 Geth:
const net = require('net');
const web3 = new Web3('/Users/you/.ethereum/geth.ipc', net);步骤二:钱包管理与交易签名
1. 助记词 → 钱包
import { Wallet } from "ethers";
const mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol";
const wallet = Wallet.fromPhrase(mnemonic);
console.log(`地址: ${wallet.address}`);
console.log(`私钥: ${wallet.privateKey}`);注意:从私钥创建的钱包没有 mnemonic.phrase,千万不要搞丢助记词!2. 发送一笔简单的转账
const tx = {
to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
value: ethers.parseEther("0.5"), // ETH → WEI
};
const txResponse = await wallet.sendTransaction(tx);
await txResponse.wait();
console.log("已上链,Hash:", txResponse.hash);步骤三:调用与部署智能合约
合约 ABI 与地址
想要在 JavaScript 中与已部署的合约交互,需要:
- 地址
0x... - ABI 即合约函数签名的 JSON 列表,通常由
solc或 Hardhat 自动生成。
读取数据(不消耗 Gas)
const erc20ABI = ["function balanceOf(address) view returns (uint256)"];
const contract = new ethers.Contract("0xTokenAddress", erc20ABI, provider);
const myBal = await contract.balanceOf(wallet.address);
console.log("USDC 余额:", ethers.formatUnits(myBal, 6));写入数据(需签名,消耗 Gas)
const signerContract = contract.connect(signer);
const tx = await signerContract.transfer("0xRecipient", ethers.parseUnits("100", 6));
await tx.wait();步骤四:常见实用功能(WEI ↔ Gwei)
| 操作 | Web3.js | Ethers.js |
|---|---|---|
| WEI → ETH | web3.utils.fromWei(wei,'ether') | ethers.formatEther(wei) |
| ETH → WEI | web3.utils.toWei('1','ether') | ethers.parseEther('1') |
| Gwei → WEI | web3.utils.toWei('10','gwei') | ethers.parseUnits('10',9) |
实战场景:10 行代码给地址空投 NFT
- 用 Alchemy NFT API 查询该地址当前拥有哪些 NFT。
- 调用官方 Claim 合约 的
claimTo()方法,传入用户地址与 NFT ID。 - 使用 Ethers.js 构造交易、估算 Gas、补签名。
- 监听
Transfer事件确认 NFT 到账。
const nft = new ethers.Contract(nftAddress, nftABI, signer);
const tx = await nft.claimTo(userAddress, 1001, {
gasLimit: 70_000,
maxFeePerGas: ethers.parseUnits("10", "gwei")
});
await tx.wait();
console.log("空投完成,NFT 已成功发送");FAQ:开发路上最常见的 6 个问题
Q1:必须用本地节点吗?
A:不需要。Infura、Alchemy 提供的 远程节点 就够 90% 的开发需求,节省时间也更稳定。
Q2:MetaMask 提示“交易未发送”,却查不到回执?
A:大概率是 Gas Price 过低导致 pending,调高后再替换(speed up)即可。
Q3:怎样把前端页面语言(中文、日文、英文)与链上交互解耦?
A:使用 i18n 包管理文案,链层只存 URI(如 IPFS ipfs://<CID>),不要直接写死字符串。
Q4:在 Vercel 部署时 CORS 报错?
A:前端调用 Infura/Alchemy 需在 Request Headers 加 mode: 'cors',或者自建反向代理网关。
Q5:助记词和私钥可以同时保存吗?
A:没有必要。助记词已可推导私钥,保存助记词即可;如刻意同时保存,极易造成二次泄露。
Q6:为什么读取区块链数据也会延迟?
A:节点通常 1–5 秒同步最新区块,不是实时。对时效要求高的场景,可订阅 newHeads 或 WebSocket 推送事件。
下一步:扩展阅读与实验
- 从 Hardhat 或 Foundry 本地测试网切入,边改合约边改前端。
- 订阅
pendingTransactions获取 抢先 Gas 战争 实时体验。 - 将钱包逻辑拆成自定义 React Hook,方便团队复用组件。
掌握 Web3.js 与 Ethers.js 这两大杀器,你就跨过了 Web3 开发最关键的一道门槛——「让前端与链真正对话」。祝编码顺利,链上世界见!