随着去中心化应用(DApp)的蓬勃发展,以太坊作为领先的智能合约平台,其生态系统的繁荣离不开用户与 DApp 之间的桥梁——以太坊钱包,钱包不仅负责管理用户的私钥和资产,更是 DApp 获取用户授权、发起交易、读取链上数据的关键入口,而以太坊钱包 API 的对接,便是开发者将 DApp 与用户钱包连接起来的核心步骤,它直接决定了 DApp 的用户体验和功能实现。
为何需要对接以太坊钱包 API?

DApp 本身无法直接访问用户的以太坊账户或发起交易,它需要通过钱包作为中介,利用钱包提供的 API 来:
常见的钱包如 MetaMask、Trust Wallet、Coinbase Wallet 等都提供了标准或自定义的 API 接口,其中最广泛使用的是 EIP-1193 (以太坊提供者 API) 和 WalletConnect 协议。
核心概念:以太坊提供者 API (EIP-1193)
EIP-1193 是一个以太坊标准,旨在为 DApp 提供统一的接口与不同的钱包进行交互,它定义了一套事件和方法,使得开发者无需为每个钱包编写特定的适配代码。
核心方法 (Methods):

eth_requestAccounts: 请求用户授权访问其账户,这是连接 DApp 和钱包的第一步,通常会弹出钱包的授权界面。eth_accounts: 获取当前已授权的账户地址列表。eth_sendTransaction: 发送一个已签名的交易到以太坊网络。eth_sign: 对数据进行签名。eth_chainId: 获取当前连接的链 ID。核心事件 (Events):
accountsChanged: 当用户切换账户时触发。chainChanged: 当用户切换网络(如从以太坊主网切换到 Goerli 测试网)时触发。disconnect: 当钱包与 DApp 断开连接时触发。钱包 API 对接步骤(以 MetaMask 和 EIP-1193 为例)
对接以太坊钱包 API 通常遵循以下步骤:
检测用户是否安装了钱包: 检查 window.ethereum 对象是否存在。window.ethereum 是 MetaMask 等钱包注入到浏览器全局对象中的提供者实例。
if (typeof window.ethereum !== 'undefined') {
console.log('MetaMask is installed!');
const provider = window.ethereum;
} else {
console.log('MetaMask is not installed. Please consider installing it.');
// 引导用户安装钱包或提供其他连接方式
} 请求用户授权访问账户: 调用 provider.request({ method: 'eth_requestAccounts' }) 来请求用户授权,用户需要在钱包中点击确认。

async function connectWallet() {
try {
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
console.log('Connected account:', accounts[0]);
// 更新 UI,显示已连接的账户
} catch (error) {
console.error('User denied account access', error);
}
} 监听账户和网络变化: 为 accountsChanged 和 chainChanged 事件添加监听器,以便在用户状态变化时及时响应。
window.ethereum.on('accountsChanged', (accounts) => {
if (accounts.length === 0) {
// 用户断开了连接或锁定了钱包
console.log('Please connect to MetaMask.');
} else {
// 用户切换了账户
console.log('Account changed to:', accounts[0]);
// 更新 UI
}
});
window.ethereum.on('chainChanged', (chainId) => {
console.log('Chain changed to:', chainId);
// 通常建议刷新页面或重新初始化 DApp 状态
window.location.reload();
}); 获取钱包提供者实例并交互: 一旦连接成功,就可以使用 provider 对象来调用各种以太坊方法,例如获取账户余额、发送交易等。
async function getBalance() {
const accounts = await window.ethereum.request({ method: 'eth_accounts' });
const address = accounts[0];
const balance = await window.ethereum.request({
method: 'eth_getBalance',
params: [address, 'latest'] // 'latest' 表示最新区块
});
console.log('Balance:', balance);
// 将 balance (wei) 转换为 ETH
} 其他重要的钱包连接协议:WalletConnect
虽然 EIP-1193 非常适合浏览器扩展钱包,但对于移动端钱包或希望支持更广泛钱包类型的 DApp,WalletConnect 是一个更优的选择。
WalletConnect 是一个开放协议,通过二维码或深链接将 DApp 与任何兼容的钱包(移动端或浏览器端)连接起来,无需依赖浏览器注入。
web3Provider 实例,后续交互方式与 EIP-1193 类似,但底层通过 WebSocket 或 HTTP 与钱包中继通信。对接过程中的注意事项与最佳实践
chainChanged 事件,并提示用户切换到正确的网络以使用 DApp 功能。