无论你是一名 Web3 初学者,还是想为 DApp 补充一个小巧的钱包模块,本文都将手把手演示如何用 JavaScript、QuickNode RPC 与常用开源库,在 30 分钟内打造出一款可生成地址、查余额并签名的轻量级以太坊钱包。
01 准备阶段
- 以太坊基础:理解账户、地址、Gas 等基本概念即可。
- JavaScript 入门:能看懂 ES6。
- Node.js 环境:本机已安装 v18 以上版本。
核心关键词:以太坊钱包、QuickNode RPC、Web3.js、ethereumjs-wallet、地址生成、私钥签名。
02 3 分钟了解以太坊
以太坊网络由遍布全球的节点共同维护,遵循同一套 以太坊协议(Ethereum Protocol)。它的最大魅力在于去中心化:开发者无需向中介申请牌照,就能发行资产、部署合约、开发应用。一位用户随时都能用 以太坊钱包 创建账户,掌控自己的资金与身份。
03 JavaScript 能为钱包做什么?
- 浏览器端:配合前端框架,可快速实现 UI 交互。
- Node 端:借助 Node.js 运行,既可离线生成密钥,也能直连节点调用 RPC。
- 签名与广播:Web3.js + ethereumjs-wallet 可完成签名计算,再把交易丢给 QuickNode RPC 广播上链。
04 项目结构与依赖安装
新建文件夹并初始化
mkdir my-eth-wallet cd my-eth-wallet npm init -y安装核心库
npm install ethereumjs-wallet web3仅需两个依赖:
- ethereumjs-wallet:负责
私钥 -> 地址的本地运算。 - web3:用于同 QuickNode RPC 通信。
05 核心代码:wallet.js 详解
文件:wallet.js
const Wallet = require('ethereumjs-wallet').default;
const Web3 = require('web3');
// 替换为你在 QuickNode 中获取的 HTTP URL
const web3 = new Web3('https://YOUR_RPC_ENDPOINT_HERE');
/* 1. 生成地址 + 私钥 */
function generateWallet() {
const wallet = Wallet.generate();
return {
address: wallet.getAddressString(),
privateKey: wallet.getPrivateKeyString()
};
}
/* 2. 查询余额(单位:ETH) */
async function checkBalance(address) {
try {
const wei = await web3.eth.getBalance(address);
return web3.utils.fromWei(wei, 'ether');
} catch (e) {
console.error(e);
return 'Error';
}
}
/* 3. 离线签名 */
async function signTransaction(privateKey, txData) {
try {
const wallet = Wallet.fromPrivateKey(Buffer.from(privateKey.slice(2), 'hex'));
const signed = wallet.signTransaction(txData); // VRS 拼接
return signed.serialize().toString('hex');
} catch (e) {
console.error(e);
return null;
}
}
module.exports = { generateWallet, checkBalance, signTransaction };关键关键词:web3、私钥、地址生成、余额查询、签名交易 贯穿始终,SEO 友好且方便读者快速定位。
06 用户交互:极简界面
目录结构:
my-eth-wallet/
├─ wallet.js
├─ index.html
├─ app.js6.1 index.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>轻量级以太坊钱包</title>
</head>
<body>
<h1>My Mini Wallet</h1>
<button id="generateWallet">生成新地址</button>
<p id="walletInfo"></p>
<button id="checkBalance">查询余额</button>
<p id="balanceInfo"></p>
<button id="signTx">签名测试交易</button>
<p id="txInfo"></p>
<script src="app.js"></script>
</body>
</html>6.2 app.js
const { generateWallet, checkBalance, signTransaction } = require('./wallet.js');
document.getElementById('generateWallet').onclick = () => {
const { address, privateKey } = generateWallet();
document.getElementById('walletInfo').innerHTML =
`<strong>地址</strong>: ${address}<br><strong>私钥</strong>: ${privateKey}`;
};
document.getElementById('checkBalance').onclick = async () => {
const address = prompt('输入要查询的地址');
if (!address) return;
const balance = await checkBalance(address);
document.getElementById('balanceInfo').textContent = `余额:${balance} ETH`;
};
document.getElementById('signTx').onclick = async () => {
const key = prompt('输入私钥');
if (!key) return;
const tx = {
to: '0x742d35Cc6f41C00A35b33C2F5885a9C5CF2f3Fc5', // 测试收款地址
value: web3.utils.toWei('0.001', 'ether'), // 0.001 ETH
gas: 21000,
gasPrice: 20000000000,
nonce: await web3.eth.getTransactionCount('YOUR_ADDRESS')
};
const raw = await signTransaction(key, tx);
document.getElementById('txInfo').textContent =
raw ? `已签名交易:${raw}` : '签名失败';
};07 4 步亲手验证钱包
- 本地 HTTP 服务
使用npx serve .或 VS Code 的Live Server均可。 - 打开浏览器访问 index.html。
- 先用 Goerli 测试网 faucet 领币,别怕花钱。
- 先在测试网跑通生成、查询与签名,再考虑主网。
08 FAQ:新手 5 大高频疑问
Q1:我的浏览器为什么报 require not defined?
A:浏览器原生不支持 require。请在 webpack、Vite 或 Rollup 环境中打包,或改用 ES Module 版本。
Q2:私钥到底该放在哪里最安全?
A:浏览器示例仅供体验。生产环境请使用 硬件钱包 或 加密本地存储。切忌明文放在前端源码。
Q3:怎样把已签名的交易广播到链上?
A:调用 web3.eth.sendSignedTransaction(rawTx) 即可。QuickNode RPC 会把交易推送到全网节点。
Q4:Gas Price 调多少合适?
A:可在 Etherscan 实时 Gas 追踪 查看平均值,再乘以 1.1 作为安全冗余。
Q5:能否一次创建多地址,做 HD 钱包?
A:可替换为 ethereumjs-wallet/hdkey 配合 BIP-39 助记词,一行代码即可批量派生。
09 止于此,行不止于此
至此,你已拥有一套能在本地运行、连接 QuickNode RPC 并支持 地址生成 - 余额查询 - 签名交易 的最小可用钱包原型。接下来,你可以:
- 加入 WalletConnect 协议扩展移动端支持;
- 用浏览器插件注入 window.ethereum;
- 搭建 Node API,为用户提供远程签名接口。
祝你开发顺利,资产管理因你更自由。