--- ## MetaMask介绍

MetaMask是一个以太坊钱包扩展,它允许用户与去中心化应用(DApp)和区块链进行交互。由于它的用户友好性和广泛支持,MetaMask成为了区块链开发者和用户的热门选择。借助MetaMask,用户可以安全地管理他们的以太坊资产,并在不同的去中心化平台上进行交易。

本文将详细介绍如何通过代码操作MetaMask,包括如何连接MetaMask、查询账户信息、发送交易以及处理区块链事件等。了解这些基本操作将有助于开发者为去中心化应用(DApp)提供更好的用户体验。

## 1. 如何连接MetaMask ### 使用JavaScript连接MetaMask

在开发DApp时,首要步骤是连接MetaMask钱包。通过JavaScript可以使用`window.ethereum` API来实现这一点。

```javascript if (typeof window.ethereum !== 'undefined') { // 请求用户连接钱包 window.ethereum.request({ method: 'eth_requestAccounts' }) .then(accounts => { console.log('用户账户:', accounts); }) .catch(error => { console.error("用户拒绝连接钱包:", error); }); } else { console.error("请安装MetaMask扩展!"); } ```

上述代码首先检查用户的浏览器中是否安装了MetaMask。如果已安装,则将请求连接到用户的钱包,并获取账户信息。如果用户同意连接,则用户的以太坊账户将被返回。

## 2. 查询账户信息 ### 获取账户余额

成功连接到MetaMask后,开发者可以通过调用Web3.js库来获取用户的账户余额。以下是获取以太坊账户余额的代码示例:

```javascript const Web3 = require('web3'); const web3 = new Web3(window.ethereum); async function getAccountBalance(account) { const balance = await web3.eth.getBalance(account); // 转换为以太币单位 const etherBalance = web3.utils.fromWei(balance, 'ether'); console.log(`账户余额:${etherBalance} ETH`); } // 使用之前连接的账户 getAccountBalance('用户账户地址'); ```

在上述代码中,Web3.js用于调用以太坊节点。`getBalance`方法用于获取账户余额,返回的结果是以Wei为单位,需要转换为以太币(ETH)单位以便于人类可读。

## 3. 发送交易 ### 如何发送以太坊交易

开发者也许需要在DApp中实现发送交易的功能。以下是发送以太坊的代码示例:

```javascript async function sendTransaction(receiverAddress, amount) { const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' }); // 发送交易 const tx = { from: account, to: receiverAddress, value: web3.utils.toHex(web3.utils.toWei(amount, 'ether')), gas: '2000000' }; try { const transactionHash = await web3.eth.sendTransaction(tx); console.log(`交易成功,交易哈希:${transactionHash}`); } catch (error) { console.error(`交易失败:${error.message}`); } } ```

在这个示例中,开发者先获取用户的以太坊账户,然后构建一个交易对象,包括发件人、收件人、发送金额和所需的Gas。最后,通过调用`sendTransaction`方法发送交易,并打印出交易哈希。

## 4. 处理区块链事件 ### 监听交易确认和状态变化

在区块链上,了解交易的状态非常重要。MetaMask和Web3.js允许开发者监听事务的变化,例如确认状态:

```javascript async function listenTransaction(transactionHash) { const receipt = await web3.eth.getTransactionReceipt(transactionHash); const interval = setInterval(async () => { const updatedReceipt = await web3.eth.getTransactionReceipt(transactionHash); if (updatedReceipt