📌  相关文章
📜  如何将 ReactJS 与 MetaMask 连接起来?

📅  最后修改于: 2022-05-13 01:56:15.077000             🧑  作者: Mango

如何将 ReactJS 与 MetaMask 连接起来?

区块链是加密货币和 Web 3.0 的支柱。由于不同交易的透明度,世界正在接受区块链技术并接受去中心化应用程序。 NFT 正在流行,大多数 NFT DAPP 在以太坊区块链上运行。在本文中,我们将看看如何将他们的 react js 应用程序连接到 Meta mask 钱包,这是用于发送和接收签名交易的最常用的浏览器工具。

MetaMaks: MetaMask 是一个加密钱包和区块链 DAPP 的网关。它用于将我们的应用程序连接到 web3。它只是一个 chrome 扩展,用于访问以太坊区块链并与之交互。其功能支持以太坊生态系统上的代币和数字资产。它还用作将余额存储在以太坊中的主钱包。

对于连接,我们使用ethers.js来连接以太坊钱包。

创建反应应用程序:

第 1 步:使用 CLI 创建一个 React 项目

npx create-react-app eth_app
or
yarn create react-app eth_app

项目结构:如下所示。

第 2 步:连接 Metamask 以响应应用程序。为了实现元掩码钱包地址,我们需要将 MetaMaks 连接到我们的 react 应用程序。检查是否连接了元掩码。

if(window.ethereum){
      // Do something 
    }else{
      alert("install metamask extension!!")
    }

现在,如果安装了元掩码,我们需要请求该帐户。

window.ethereum.request({method:'eth_requestAccounts'})
.then(res=>{
        // Return the address of the wallet
        console.log(res) 
})

为了获得余额,我们需要请求 balance 方法

window.ethereum.request({
    method:'eth_getBalance', 
    params: [address, 'latest']
}).then(balance => {
    // Return string value to convert it into int balance
    console.log(balance) 
      
    // Yarn add ethers for using ethers utils or
    // npm install ethers
    console.log(ethers.utils.formatEther(balance))
    // Format the string into main latest balance
})

第 3 步:提取信息以做出反应。为了将信息获取到反应页面,我们将使用 useState 从 javascript 方法中设置值并使用到 jsx

const [data, setdata] = useState({
    address:'',    // Stores address
    Balance: null  // Stores balance
  })
App.js
// Importing modules
import React, { useState } from "react";
import { ethers } from "ethers";
import "./App.css";
import { Button, Card } from "react-bootstrap";
import "bootstrap/dist/css/bootstrap.min.css";
  
function App() {
  
  // usetstate for storing and retrieving wallet details
  const [data, setdata] = useState({
    address: "",
    Balance: null,
  });
  
  // Button handler button for handling a
  // request event for metamask
  const btnhandler = () => {
  
    // Asking if metamask is already present or not
    if (window.ethereum) {
  
      // res[0] for fetching a first wallet
      window.ethereum
        .request({ method: "eth_requestAccounts" })
        .then((res) => accountChangeHandler(res[0]));
    } else {
      alert("install metamask extension!!");
    }
  };
  
  // getbalance function for getting a balance in
  // a right format with help of ethers
  const getbalance = (address) => {
  
    // Requesting balance method
    window.ethereum
      .request({ 
        method: "eth_getBalance", 
        params: [address, "latest"] 
      })
      .then((balance) => {
        // Setting balance
        setdata({
          Balance: ethers.utils.formatEther(balance),
        });
      });
  };
  
  // Function for getting handling all events
  const accountChangeHandler = (account) => {
    // Setting an address data
    setdata({
      address: account,
    });
  
    // Setting a balance
    getbalance(account);
  };
  
  return (
    
      {/* Calling all values which we         have stored in usestate */}                              Address:           {data.address}                                          Balance:             {data.Balance}                                           
  ); }    export default App;


输出: