随着区块链技术的飞速发展,Web3 正逐渐从一个概念走向现实,为我们带来了一个去中心化、用户拥有数据主权的新互联网时代,而在 Web3 的生态系统中,MetaMask 无疑是最具影响力的浏览器钱包之一,它就像是我们进入这个去中心化世界的“通行证”,本文将详细介绍如何调用 MetaMask,让你的 Web3 应用(dApp)能够与区块链进行交互。
什么是 MetaMask
MetaMask 最初是一个浏览器扩展程序,后来也推出了移动端应用,它不仅能让用户安全地存储、管理和交易以太坊及以太坊兼容链(如 BSC、Polygon、Arbitrum 等)的加密货币(ETH 和各种 ERC-20 代币),更重要的是,它充当了用户与去中心化应用(dApps)之间的桥梁,通过 MetaMask,用户可以在不直接暴露私钥的情况下,与区块链网络进行交互,例如发送交易、调用智能合约、参与 DeFi 协议、玩 NFT 游戏等。
准备工作:在 dApp 中调用 MetaMask 的前提
在开始编写代码调用 MetaMask 之前,你需要确保以下几点:
- 安装 MetaMask:在浏览器(如 Chrome、Firefox、Brave 等)中安装 MetaMask 扩展,并按照提示创建钱包,妥善备份助记词。
- 了解 Web3.js 或 Ethers.js:这是两个最流行的 JavaScript 库,用于与以太坊区块链进行交互,你可以选择其中一个来集成到你的 dApp 中,本文将以 Ethers.js 为例进行讲解,因为它更现代、更易用。
- 一个简单的 Web 项目:准备好你的 HTML、CSS 和 JavaScript 文件。
调用 MetaMask 的核心步骤
调用 MetaMask 主要涉及与用户钱包的连接、获取账户信息、发送交易以及调用智能合约等方法,其核心在于利用 window.ethereum 对象,这是 MetaMask 向网页暴露的 API 入口。
连接 MetaMask 钱包
这是用户与你的 dApp 交互的第一步,你需要请求用户授权连接他们的 MetaMask 钱包。
// 检查浏览器是否安装了 MetaMask
if (typeof window.ethereum !== 'undefined') {
console.log('MetaMask is installed!');
} else {
console.log('MetaMask is not installed. Please install it to use this dApp.');
// 可以引导用户去安装 MetaMask
}
// 连接钱包按钮的点击事件处理
async function connectWallet() {
try {
// 请求连接账户
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
// accounts 是一个数组,包含用户授权的地址
const account = accounts[0];
console.log('Connected account:', account);
// 更新 UI,显示已连接的地址
document.getElementById('accountAddress').innerText = account;
} catch (error) {
console.error('Error connecting to MetaMask:', error);
// 用户可能拒绝了连接请求
}
}
// 在 HTML 中添加一个按钮
// <button onclick="connectWallet()">Connect MetaMask</button>
// <div id="accountAddress">Not Connected</div>
获取链 ID 和网络信息
了解当前连接的网络(主网、测试网或其他侧链)对于 dApp 至关重要。
async function getNetworkInfo() {
try {
const chainId = await window.ethereum.request({ method: 'eth_chainId' });
console.log('Current Chain ID:', chainId); // '0x1' 代表以太坊主网,'0x5' 代表 Goerli 测试网
const networkVersion = await window.ethereum.request({ method: 'net_version' });
console.log('Network Version:', networkVersion);
} catch (error) {
console.error('Error getting network info:', error);
}
}
监听账户和链变化
用户的账户切换或网络切换会影响 dApp 的状态,因此需要监听这些事件。
// 监听账户变化
window.ethereum.on('accountsChanged', (accounts) => {
if (accounts.length === 0) {
// 用户断开了钱包连接
console.log('Please connect to MetaMask.');
document.getElementById('accountAddress').innerText = 'Not Connected';
} else {
// 用户切换了账户
console.log('Changed account:', accounts[0]);
document.getElementById('accountAddress').innerText = accounts[0];
// 可能需要重新加载 dApp 数据或执行其他操作
}
});
// 监听链变化
window.ethereum.on('chainChanged', (chainId) => {
console.log('Changed chain to:', chainId);
// 当链改变时,建议重新加载页面以完全更新 dApp 状态
window.location.reload();
});
发送交易(使用 Ethers.js)
虽然可以直接通过 window.ethereum.request 发送交易,但使用 Ethers.js 会更加方便和直观,首先需要安装 Ethers.js:npm install ethers。









