ethers.js2:provider提供商

1、Provider

Provider类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。在ethers中,Provider不接触用户私钥,只能读取链上信息,不能写入,这一点比web3.js要安全。

除了之前介绍的默认提供者defaultProvider以外,ethers中最常用的是jsonRpcProvider,可以让用户连接到特定节点服务商的节点。

jsonRpcProvider

2、创建节点服务商的API Key

首先,需要去节点服务商的网站注册并创建API Key,有Infura和Alchemy两家公司API Key的创建方法。

Infura API Key

Infura API Key

3、连接Infura节点 

我们用Infura节点作为例子。在创建好Infura API Key之后,就可以利用ethers.provider.JsonRpcProvider()方法来创建Provider变量。JsonRpcProvider()以节点服务的url作为参数。

 在下面这个例子中,我们分别创建连接到ETH主网和Goerli测试网的provider

// 利用Infura的rpc节点连接以太坊网络
// 填入Infura API Key, 教程:https://github.com/AmazingAng/WTFSolidity/blob/main/Topics/Tools/TOOL02_Infura/readme.md
const INFURA_ID = ''
// 连接以太坊主网
const providerETH = new ethers.providers.JsonRpcProvider(`https://mainnet.infura.io/v3/${INFURA_ID}`)
// 连接Goerli测试网
const providerGoerli = new ethers.providers.JsonRpcProvider(`https://goerli.infura.io/v3/${INFURA_ID}`)

4、利用Provider读取链上数据

Provider类封装了一些方法,可以便捷的读取链上数据:

1. 利用getBalance()函数读取主网和测试网V神的ETH余额:

    // 1. 查询vitalik在主网和Goerli测试网的ETH余额console.log("1. 查询vitalik在主网和Goerli测试网的ETH余额");const balance = await providerETH.getBalance(`vitalik.eth`);const balanceGoerli = await providerGoerli.getBalance(`vitalik.eth`);// 将余额输出在console(主网)console.log(`ETH Balance of vitalik: ${ethers.utils.formatEther(balance)} ETH`);// 输出Goerli测试网ETH余额console.log(`Goerli ETH Balance of vitalik: ${ethers.utils.formatEther(balanceGoerli)} ETH`);

V神余额

 2. 利用getNetwork()查询provider连接到了哪条链,homestead代表ETH主网:

  // 2. 查询provider连接到了哪条链console.log("\n2. 查询provider连接到了哪条链")const network = await providerETH.getNetwork();console.log(network);

getNetwork

 3. 利用getBlockNumber()查询当前区块高度:

    // 3. 查询区块高度console.log("\n3. 查询区块高度")const blockNumber = await providerETH.getBlockNumber();console.log(blockNumber);

getBlockNumber

 4. 利用getGasPrice()查询当前gas price,返回的数据格式为BigNumber,可以用BigNumber类的toNumber()toString()方法转换成数字和字符串。

    // 4. 查询当前gas priceconsole.log("\n4. 查询当前gas price")const gasPrice = await providerETH.getGasPrice();console.log(gasPrice);

getGasPrice

5. 利用getFeeData()查询当前建议的gas设置,返回的数据格式为BigNumber

    // 5. 查询当前建议的gas设置console.log("\n5. 查询当前建议的gas设置")const feeData = await providerETH.getFeeData();console.log(feeData);

getFeeData

6. 利用getBlock()查询区块信息,参数为要查询的区块高度:

    // 6. 查询区块信息console.log("\n6. 查询区块信息")const block = await providerETH.getBlock(0);console.log(block);

getBlock

 7. 利用getCode()查询某个地址的合约bytecode,参数为合约地址,下面例子中用的主网WETH的合约地址:

    // 7. 给定合约地址查询合约bytecode,例子用的WETH地址console.log("\n7. 给定合约地址查询合约bytecode,例子用的WETH地址")const code = await providerETH.getCode("0xc778417e063141139fce010982780140aa0cd5ab");console.log(code);

getCode

完整代码:

{/* <script src="https://cdn.ethers.io/lib/ethers-5.6.9.min.js"></script> */}
const ethers = require("ethers");
// import { ethers } from "ethers";
// import { ethers } from "https://cdn-cors.ethers.io/lib/ethers-5.6.9.esm.min.js";const INFURA_ID = '012dac20ba9f43c0ad4fd8be46ae2c37';const providerETH = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/012dac20ba9f43c0ad4fd8be46ae2c37');
const providerGeorli = new ethers.providers.JsonRpcProvider('https://goerli.infura.io/v3/012dac20ba9f43c0ad4fd8be46ae2c37');const main = async () => {//查询vitalik在主网和georli上的eth余额console.log('1、查询vitalik的ETH余额');const balanceETH = await providerETH.getBalance('vitalik.eth');const balanceGeorliETH = await providerGeorli.getBalance('vitalik.eth');console.log('ETH balance of vitalik:' + ethers.utils.formatEther(balanceETH) +'ETH' );console.log('GeorliETH balance of vitalik:' + ethers.utils.formatEther(balanceGeorliETH) + 'ETH');console.log('\n 2、查询现在是哪条链');const network = await providerETH.getNetwork();console.log(network);console.log('\n 3、查询当前区块高度');const blockNum = await providerETH.getBlockNumber();console.log(blockNum);console.log('\n 4、查询当前gasPrice');const gasPrice = (await providerETH.getGasPrice()).toString();console.log(gasPrice);console.log('\n5、查询当前区块信息');const blockInfo = await providerETH.getBlock(17969422);console.log(blockInfo);console.log('\n6、查询某个合约地址的代码字节码');const bytecode = await providerETH.getCode('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984');console.log(bytecode);};main()

总结

ethers.js的Provider类,并用Infura的节点API Key创建了jsonRpcProvider,读取了ETH主网和Goerli测试网的链上信息。 

踩坑记录:

运行后仍然跟上一次一样报错:

import { ethers } from "https://cdn-cors.ethers.io/lib/ethers-5.6.9.esm.min.js";
^^^^^^SyntaxError: Cannot use import statement outside a moduleat internalCompileFunction (node:internal/vm:74:18)at wrapSafe (node:internal/modules/cjs/loader:1141:20)at Module._compile (node:internal/modules/cjs/loader:1182:27)at Module._extensions..js (node:internal/modules/cjs/loader:1272:10)at Module.load (node:internal/modules/cjs/loader:1081:32)at Module._load (node:internal/modules/cjs/loader:922:12)at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)at node:internal/main/run_main_module:23:47Node.js v18.13.0

原因是,在一个非模块化的环境中使用了ES6的 import 语句,导致了错误。代码运行在普通的JavaScript环境中,而不是模块化环境,您可以将 import 语句替换为传统的脚本引入方式。将以下代码:

import { ethers } from "ethers";

替换为:

const ethers = require("ethers");

另外再修改原来代码中的一些错误写法,比如少一个括号,把$去掉等。

就可以正常运行并得到结果:

ETH balance of vitalik:3933.795127185004997518ETH

2、报错:

const network = await ethers.providerETH.getNetwork(); ^ TypeError: Cannot read properties of undefined (reading 'getNetwork') 

 在const network = await ethers.providersETH.getNetwork();中语法错误,改为:

const network = await providersETH.getNetwork();
即可解决。

3、报错:

console.log('\n 4、查询当前gasPrice');const gasPrice = (await providerETH.getGasPrice()).toString;console.log(gasPrice);};


运行结果是:

[Function (anonymous)]

因为在代码中,toString我少写了一个括号,应该是:

    const gasPrice = (await providerETH.getGasPrice()).toString;

另外,有一次我的代码是:

console.log('\n 4、查询当前gasPrice');const gasPrice = await providerETH.getGasPrice().toString();console.log(gasPrice);};

运行得到的结果是:

undefined
原因是,const gasPrcie = await providerETH.getGasPrice().toString().要改为:
 

const gasPrcie = (await providers.getGasPrice()).toString();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/87152.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kaniko在containerd中无特权快速构建并推送容器镜像

目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑&#xff0c;我们选择了kaniko作为镜像打包工具&#xff0c;它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…

单例模式的相关知识

饿汉模式 package Thread; class Singleton{private static Singleton instance new Singleton();public static Singleton getInstance(){return instance;}private Singleton(){} }public class demo1 {public static void main(String[] args) {Singleton S1 Singleton.ge…

华为数通方向HCIP-DataCom H12-821题库(单选题:61-80)

第61题 关于 BGP 的Keepalive报文消息的描述,错误的是 A、Keepalive周期性的在两个BGP邻居之间发送 B、Keepalive报文主要用于对等路由器间的运行状态和链路的可用性确认 C、Keepalive 报文只包含一个BGP数据报头 D、缺省情况下,Keepalive 的时间间隔是180s 答案&#xff…

csdn冷知识:如何在csdn里输入公式或矩阵

目录 1 输入公式 2 输入矩阵 3 如何输入复杂公式 4 如何修改&#xff0c;已经生成的公式 1 输入公式 进入编辑模式点击右边的菜单&#xff1a;公式然后进入公式编辑器&#xff0c;选择右边的 ... 可以选择大括号等&#xff0c;右边还有矩阵符号选择后你需要创建几行几列的…

《JVM修仙之路》初入JVM世界

《JVM修仙之路》初入JVM世界 博主目前正在学习JVM的相关知识&#xff0c;想以一种不同的方式记录下&#xff0c;娱乐一下 清晨&#xff0c;你睁开双眼&#xff0c;看到刺眼的阳光&#xff0c;你第一反应就是完了完了&#xff0c;又要迟到了。刚准备起床穿衣的你突然意识到不对&…

数字化、智能化的酒店固定资产管理系统

酒店固定资产管理系统是一种专门为酒店行业定制的管理软件&#xff0c;可以帮助酒店管理者全面、准确地管理固定资产。该系统具有以下实际功能和特点&#xff1a;  资产库存功能&#xff1a;通过扫描二维码或手动输入条形码&#xff0c;完成酒店固定资产的有效总结&#xff0…

嵌入式系统存储体系

一、存储系统概述 主要分为三种&#xff1a;高速缓存&#xff08;cache&#xff09;、主存和外存。 二、高速缓存Cache 高速缓冲存储器中存放的是当前使用得最多得程序代码和数据&#xff0c;即主存中部分内容的副本&#xff0c;其本身无自己的地址空间。在嵌入式系统中Cac…

刘强东的低价武器再上膛

电商的光辉正撒向中国的每一个角落。 河北南部的一个村子&#xff0c;74岁的陈奶奶站在大门口&#xff0c;正等待着小哥送货上门&#xff0c;孤身在家的她平时吃的油盐酱醋&#xff0c;喝的奶粉豆浆&#xff0c;都由女儿崔丽丽在网上买。由于京东是村子里唯二可以上门的快递&a…

在腾讯云服务器OpenCLoudOS系统中安装Jenkins(有图详解)

Jenkins介绍 Jenkins是一个开源软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 将项目代码的svn地址配置在Jenkins&#xff0c;就可以直接在Je…

RISC-V 中国峰会 | OpenMPL引人注目,RISC-V Summit China 2023圆满落幕

RISC-V中国峰会圆满落幕 2023年8月25日&#xff0c;为期三天的RISC-V中国峰会&#xff08;RISC-V Summit China 2023&#xff09;圆满落幕。本届峰会以“RISC-V生态共建”为主题&#xff0c;结合当下全球新形势&#xff0c;把握全球新时机&#xff0c;呈现RISC-V全球新观点、新…

Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案

在启动oracle的服务OracleOraDb11g_home1TNSListener时&#xff0c;提示服务启动后又停止了。 解决方法&#xff1a; 修改oracle安装目录下的两个配置文件&#xff1a; 以上两个文件&#xff0c;对应的HOST的值&#xff0c;都改为127.0.0.1 然后再启动服务&#xff0c;启动成…

RISC-V公测平台发布 · 在SG2042上配置Jupiter+Octave科学计算环境

简介 JupyterHub是一个开源的共享计算平台&#xff0c;它为每个用户管理一个单独的 Jupyter 环境&#xff0c; 可以用于学生班级、企业数据科学小组或科学研究小组。它是一个多用户中心&#xff0c;可以生成、管理和代理多个单用户Jupyter笔记本服务器的实例。 GNU Octave是一…