以太坊DApp开发全解析:Web3.js、钱包与前端集成
DApp(去中心化应用)与传统Web应用最大的区别在于:后端逻辑运行在区块链上,用户通过钱包自主管理身份与资产。前端不再是简单的HTTP请求,而是要与EVM交互、请求签名、监听链上事件。本文将系统讲解DApp前端的核心技术栈——Web3.js、钱包连接与前端集成实践。

一、DApp架构概览
典型DApp由三层构成:
链上层:部署在以太坊上的智能合约,负责状态存储与业务逻辑。
交互层:Web3.js、ethers.js等库,负责编码交易、调用合约、读取链上数据。
前端层:React/Vue等框架构建UI,通过钱包与用户交互。
与传统架构的关键差异:没有中心化数据库,没有传统登录系统,用户身份由钱包地址代表,所有写操作都需要用户签名并支付Gas。
二、Web3.js核心用法
Web3.js是以太坊官方JavaScript库,提供与节点通信的完整API。安装:
bash
npm install web3
连接节点。可通过钱包注入的Provider或第三方RPC:
javascript
import Web3 from "web3";// 方式一:使用MetaMask注入的Providerconst web3 = new Web3(window.ethereum);// 方式二:使用RPC节点(只读)const web3 = new Web3("https://sepolia.infura.io/v3/YOUR_KEY");读取合约数据(view/pure函数,无需Gas):
javascript
const contract = new web3.eth.Contract(abi, contractAddress);const total = await contract.methods.totalMessages().call();
发送交易(状态变更,需签名与Gas):
javascript
const accounts = await web3.eth.getAccounts();await contract.methods.post("Hello Web3").send({
from: accounts[0],
gas: 300000,});监听事件:
javascript
contract.events.NewMessage({ fromBlock: "latest" })
.on("data", (event) => console.log(event.returnValues));单位转换是常见易错点:web3.utils.toWei("1", "ether")将1 ETH转为wei,fromWei反之。
三、钱包连接:MetaMask与EIP-1193
MetaMask通过window.ethereum注入EIP-1193标准Provider。连接流程:
javascript
async function connectWallet() {
if (!window.ethereum) {
alert("请安装MetaMask");
return;
}
const accounts = await window.ethereum.request({
method: "eth_requestAccounts",
});
return accounts[0];}监听账户与网络变化:
javascript
window.ethereum.on("accountsChanged", (accounts) => {
console.log("账户切换:", accounts[0]);});window.ethereum.on("chainChanged", (chainId) => {
// 建议直接刷新页面以避免状态不一致
window.location.reload();});切换网络:
javascript
await window.ethereum.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: "0xaa36a7" }], // Sepolia});多钱包兼容方面,WalletConnect支持移动端扫码连接,RainbowKit、ConnectKit等组件库可快速集成多种钱包,并提供统一的UI。
四、React前端集成实战
在React中,推荐使用ethers.js配合Hooks封装,或使用wagmi这类专为React设计的库。以下为简易封装:
javascript
import { useState, useEffect } from "react";import { ethers } from "ethers";export function useWallet() {
const [account, setAccount] = useState(null);
const [provider, setProvider] = useState(null);
async function connect() {
if (!window.ethereum) return;
const _provider = new ethers.BrowserProvider(window.ethereum);
const accounts = await _provider.send("eth_requestAccounts", []);
setProvider(_provider);
setAccount(accounts[0]);
}
useEffect(() => {
if (!window.ethereum) return;
window.ethereum.on("accountsChanged", (accs) => setAccount(accs[0] || null));
}, []);
return { account, provider, connect };}调用合约:
javascript
const signer = await provider.getSigner();const contract = new ethers.Contract(address, abi, signer);const tx = await contract.post("Hello");await tx.wait(); // 等待上链确认UI状态设计需覆盖:未安装钱包、未连接、已连接、交易待确认、交易成功、交易失败(如用户拒绝签名、Gas不足)。
五、关键注意事项
私钥安全:前端永远不要接触用户私钥,所有签名交由钱包完成。
网络校验:写操作前校验chainId,避免用户在错误网络上发起交易。
Gas估算:使用estimateGas预判消耗,并提供Gas价格选项。
错误处理:MetaMask用户拒绝返回code 4001,需友好提示。
事件索引:重放历史事件可使用The Graph等索引服务,避免前端遍历全部区块。
性能优化:只读数据优先通过RPC批量请求,写操作后监听receipt而非轮询。
燃链科技是区块链技术研发与应用落地的高科技企业,作为国内领先的区块链定制开发服务商,拥有超百人的专业技术团队,涵盖研发、产品、销售等岗位,成员多来自10多年以上行业背景,具备强大的系统设计、平台交付与技术整合能力,具备以下核心服务能力:元宇宙互动游戏平台、去中心化钱Dapp开发、主链开发、公链开发、IM聊天社交钱包,java交易所开发,永续合约智能合约,社交购物平台搭建,NFT艺术品交易平台,数字货币交易系统,加密钱包开发,自主公链搭建、产品追溯系统建设、专属区块链系统开发、团队成功打造过多项前沿项目,包括:区块链3.0公链系统,去中心化数字钱包多款Web3.0 DApp应用、NFT数字藏品平台解凭借强大的研发实力,遇务场景落地的一站式区块链解决方案,助力企业把握数字化转型新机遇