当前位置:   article > 正文

ethers.js常用的操作方法

ethers.js
安装:npm install --save@5.7.2 ethers

--ethers比web3来说使用方式相对简洁很多,主要就操作三个大对象

        1. Provider,(提供者)是一个用于连接以太坊网络的抽象类,提供了只读形式来访问区块链网络和获取链上状态;

        2. Signer,(签名器)通常是以某种方式直接或间接访问私钥,可以签名消息和在已授权网络中管理你账户中的以太币来进行交易。

        3. Contract(合约)是一个运行在以太坊网络上表示现实中特定合约的抽象,应用可以像使用JavaScript对象一样使用它。

1.创建一个Provider

  1. import { ethers } from "ethers";
  2. let provider = new ethers.providers.Web3Provider(window.ethereum)

1.1 判断用户的浏览器是否安装了metamask钱包

  1. const isWallet = () => {
  2. if (window.ethereum) {
  3. console.log('安装了钱包')
  4. } else {
  5. console.log('未安装钱包')
  6. }
  7. }
  8. isWallet()

1.2 监听用户切换了当前连接的钱包账户

  1. // 监听账户切换事件
  2. window.ethereum.on("accountsChanged", function (accounts) {
  3. if (accounts.length > 0) {
  4. // 执行账户切换后的逻辑
  5. console.log('当前链接的账户地址是:'+accounts[0])
  6. //accounts里的是钱包链接的所有账户地址
  7. } else {
  8. // 处理没有连接账户的情况
  9. console.log('没有账户链接')
  10. }
  11. })

 1.3 根据交易hash获取交易信息

  1. // 获取交易收据
  2. const receipt = await provider.getTransactionReceipt(txHash);
  3. // 获取交易信息
  4. const tranction = await provider.getTransaction(txHash)

2.创建一个Signer,在此之前要确保先链接用户钱包,获取地址

  1. //参数有两个,第一个固定字符串,第二个数组,该方法会启动metask插件,并链接账户,返回结果是账户地址
  2. const go = async () => {
  3. //地址,account是钱包里所有的账户地址
  4. let account = await provider.send("eth_requestAccounts", []);
  5. console,log(account)
  6. //signer
  7. let signer = provider.getSigner(account[0]);
  8. console,log(signer)
  9. };
  10. go();

2.1获取余额

  1. let balance = await signer.getBalance()
  2. console.log(balance)

2. 2格式化余额

  1. //格式化后以eth为单位
  2. let balance = ethers.utils.formatEther(balance)
  3. console.log(balance)

3. 创建Contract(智能合约)

  1. // 有三个参数
  2. const proxyContract = new ethers.Contract(
  3. address,//合约地址
  4. abi,//合约abi
  5. signer
  6. );
  7. // 下面解释三个参数的含义

        --参数有三个,第一个是合约地址,第二个是合约abi,第三个是签名者,合约abi是solidity语言编写代码之后,编译成的json文件,需要文件里的abi字段作为第二个参数,json文件结构大概长这样:

92cb668b4f74475f91ab604687dee777.png

        --几万行的json文件,只需要其中的 abi 和 bytecode 生成地址作为第一个参数,其他的我们不care~

  1. import { ContractFactory } from "ethers";//用于生成地址
  2. import abi from "./UsufructNFT.json"; //引入json文件
  3. // 参数有三个,1.abi 2. bytecode 3. signer;如果有合约文件的话都可以获取到
  4. let factory = new ContractFactory(abi.abi, abi.bytecode, signer);
  5. let factoryRes = await factory.deploy();
  6. console.log("合约地址: " + factoryRes.address);

        --参数都获取到就可以创建合约并调用合约上的属性及方法啦

  1. const proxyContract = new ethers.Contract(
  2. factoryRes.address,//合约地址
  3. abi.abi,//合约abi
  4. signer
  5. );
  6. console.log(proxyContract)

        --proxyContract 就是实例化的合约,可以使用proxyContract. 点合约上的方法

4. 监听区块变化的事件,可以捕获到交易、发布合约等动作

  1. //监听区块变化触发
  2. provider.on("block", async (blockNumber) => {
  3. console.log('当前变化的区块号码是:'+blockNumber);
  4. // 根据区块号获取交易信息获取
  5. const block = await provider.getBlock(blockNumber);
  6. // 获取区块中的交易列表
  7. const transactions = block.transactions;
  8. // 获取每笔交易的详细信息
  9. const transactionPromises = transactions.map((txHash) =>
  10. provider.getTransaction(txHash)
  11. );
  12. const transactionDetails = await Promise.all(transactionPromises);
  13. // 打印交易信息
  14. transactionDetails.forEach((tx) => {
  15. console.log(tx);
  16. console.log("Transaction Hash:", tx.hash);
  17. console.log("From:", tx.from);
  18. console.log("To:", tx.to);
  19. console.log("Value:", ethers.utils.formatEther(tx.value));
  20. console.log("--------------------------");
  21. });
  22. });

        ethers官网:https://learnblockchain.cn/ethers_v5/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/861562?site
推荐阅读
相关标签
  

闽ICP备14008679号