以太坊作為全球領先的智能合約平臺,其生態中錢包是用戶與區塊鏈交互的核心工具,相較于需要同步全量數據、占用大量存儲空間的全節點錢包,輕錢包(Light Wallet) 通過與遠程節點(如 Infura, Alchemy 或自建節點)通信,僅同步用戶自身相關的數據,極大地降低了使用門檻,成為移動端和 Web 端錢包的主流選擇,本文將帶你一步步了解并開發一個基礎的以太坊輕錢包。
什么是以太坊輕錢包?

輕錢包的核心思想是“輕量級”和“遠程驗證”,它不存儲完整的區塊鏈數據,而是依賴遠程節點來獲取信息、廣播交易,用戶只需保管好自己的私鑰或助記詞,即可完成賬戶管理、余額查詢、轉賬交易等操作。
- 優點:
- 存儲空間小:無需下載 GB 級別的區塊鏈數據。
- 啟動速度快:連接節點即可使用,無需等待同步。
- 跨平臺友好:尤其適合移動端和瀏覽器環境。
- 缺點:
- 依賴第三方節點:節點的可用性、速度和安全性直接影響錢包體驗,需選擇信譽良好的節點服務提供商。
- 潛在的中心化風險:雖然用戶私鑰本地存儲,但數據獲取依賴外部節點。
開發前準備:技術棧與工具
在開始開發之前,你需要準備以下技術和工具:
- 編程語言:JavaScript/TypeScript 是以太坊生態開發的主流語言。
- 開發框架:
- 前端框架:React, Vue.js, Angular (本文以 React 為例進行概念性演示)。
- 以太坊交互庫:
ethers.js或web3.js(推薦ethers.js,其 API 設計更現代、易用)。
- 節點服務:
- Infura:提供可靠的節點服務,需注冊獲取 Project ID。
- Alchemy:另一主流節點服務,性能和功能強大。
- 本地節點:如 Geth, Nethermind (用于本地開發測試)。
- 開發環境:Node.js, npm/yarn, 代碼編輯器 (如 VS Code)。
- 測試網絡:Ropsten, Goerli, Sepolia 等,用于測試,避免消耗主網 ETH。
核心功能模塊與實現步驟
一個基礎的以太坊輕錢包通常包含以下核心功能:
- 創建/導入錢包
- 查看賬戶余額
- 發送 ETH/ERC20 代幣
- 交易歷史查詢
下面我們以 ethers.js 為例,概述這些功能的實現。
步驟 1:項目初始化與依賴安裝

npx create-react-app ethereum-light-wallet cd ethereum-light-wallet npm install ethers
步驟 2:連接到以太坊網絡
使用 ethers.js 的 JsonRpcProvider 連接到遠程節點。
// src/utils/provider.js
import { ethers } from "ethers";
// 替換為你的 Infura 或 Alchemy 的 RPC URL
const RPC_URL = "https://goerli.infura.io/v3/YOUR_PROJECT_ID";
const provider = new ethers.providers.JsonRpcProvider(RPC_URL);
export default provider;
步驟 3:創建/導入錢包
- 創建新錢包:
import { ethers } from "ethers";
// 生成一個新的隨機錢包
const newWallet = ethers.Wallet.createRandom();
console.log("新錢包地址:", newWallet.address);
console.log("助記詞:", newWallet.mnemonic.phrase); // 務必安全保存助記詞!
- 通過助記詞導入錢包:
import { ethers } from "ethers";
const mnemonic = "your 12 or 24 word mnemonic phrase here";
const walletFromMnemonic = ethers.Wallet.fromMnemonic(mnemonic);
console.log("通過助記詞導入的錢包地址:", walletFromMnemonic.address);
- 通過私鑰導入錢包:
import { ethers } from "ethers";
const privateKey = "your private key here";
const walletFromPrivateKey = new ethers.Wallet(privateKey, provider); // 可選擇關聯 provider
console.log("通過私鑰導入的錢包地址:", walletFromPrivateKey.address);
重要:私鑰和助記詞是錢包的核心,絕對不能泄露給任何人!
步驟 4:查看賬戶余額
使用 provider 獲取指定地址的 ETH 余額。
import provider from './utils/provider';
const address = "0x..."; // 要查詢的地址
async function getBalance() {
try {
const balance = await provider.getBalance(address);
// ethers.utils.formatEther 將 wei 轉換為 ETH
console.log(`地址 ${address} 的余額: ${ethers.utils.formatEther(balance)} ETH`);
} catch (error) {
console.error("查詢余額失敗:", error);
}
}
getBalance();
步驟 5:發送 ETH

發送交易需要簽名,因此需要使用 Wallet 實例(包含私鑰)來發送交易。
import { ethers } from "ethers";
import provider from './utils/provider';
const senderPrivateKey = "your sender private key";
const senderWallet = new ethers.Wallet(senderPrivateKey, provider);
const recipientAddress = "0x..."; // 接收方地址
const amountToSend = ethers.utils.parseEther("0.01"); // 0.01 ETH
async function sendEth() {
try {
// 構建交易
const tx = {
to: recipientAddress,
value: amountToSend,
// gasLimit 可根據實際情況調整,或由 provider 估算
gasLimit: ethers.utils.hexlify(21000),
// gasPrice 可根據當前網絡狀況調整
gasPrice: await provider.getGasPrice(),
};
// 發送交易并等待確認
const txResponse = await senderWallet.sendTransaction(tx);
console.log("交易發送成功,哈希:", txResponse.hash);
// 等待交易被打包
const txReceipt = await txResponse.wait();
console.log("交易確認,區塊號:", txReceipt.blockNumber);
} catch (error) {
console.error("發送 ETH 失敗:", error);
}
}
sendEth();
步驟 6:ERC20 代幣轉賬
ERC20 代幣轉賬與 ETH 轉賬類似,但需要調用代幣合約的 transfer 函數。
- 獲取代幣合約實例:你需要知道代幣的合約地址和 ABI (Application Binary Interface)。
import { ethers } from "ethers";
import provider from './utils/provider';
const tokenAddress = "0x..."; // ERC20 代幣合約地址
const tokenAbi = [ /* ERC20 標準 ABI 的 transfer 函數等 */ ]; // ["function transfer(address to, uint256 amount) returns (bool)"]
const senderPrivateKey = "your sender private key";
const senderWallet = new ethers.Wallet(senderPrivateKey, provider);
const recipientAddress = "0x..."; // 接收方地址
const tokenAmount = ethers.utils.parseUnits("100", 18); // 假設代幣精度為 18
async function sendErc20Token() {
try {
const tokenContract = new ethers.Contract(tokenAddress, tokenAbi, senderWallet);
const tx = await tokenContract.transfer(recipientAddress, tokenAmount);
console.log("代幣轉賬交易發送成功,哈希:", tx.hash);
const txReceipt = await tx.wait();
console.log("代幣轉賬交易確認,區塊號:", txReceipt.blockNumber);
} catch (error) {
console.error("發送 ERC20 代幣失敗:", error);
}
}
sendErc20Token();
步驟 7:交易歷史查詢
可以通過 provider 的 getHistory 方法查詢指定地址的交易記錄。
import provider from './utils/provider';
const address = "0x..."; // 要查詢的地址
async function getTransactionHistory() {
try {
const history = await provider.getHistory(address);
history.forEach(tx => {
console.log("交易哈希:", tx.hash);
console.log("區塊號:", tx.blockNumber);
console.log("發送方:", tx.from);
console.log("接收方:", tx.to);
console.log("金額:", ethers.utils.formatEther(tx.value), "ETH");
console.log(" gas 使用量:", tx.gasUsed.toString());
});
} catch (error) {
console.error("查詢交易歷史失敗:", error);
}
}
getTransactionHistory();
安全注意事項
開發錢包時,安全性至關重要:
- 私鑰/助記詞安全:永遠不要在代碼中硬編碼私鑰或助記詞,優先使用助記詞,并安全存儲(如硬件錢包
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。



