最近在学习web3所以根据自己的学习内容每天写一篇笔记出来,算是练习也算是巩固! 希望自己早日可以找到web3的工作。
在我看来ethers就是传统开发中的axios,他使得我们可以非常快速简单的访问区块链上的信息。那么ethers究竟为我们提供了哪些功能呢?让我们来一起学习一下吧!
Provider类
Provider类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。
ethers中最常用的是jsonRpcProvider,可以让用户连接到特定节点服务商的节点。
jsonRpcProvider
创建节点服务商的API Key
首先,你需要去节点服务商的网站注册并创建API Key。在这里我使用Alchemy公司API Key创建。
注册账号然后创建一个app后,你可以看到一个像我截图的这样的界面,这样你就获得了一个API Key
我们可以在本地创建一个My Web3文件文件夹用来存放我们学习ethers的代码:
在文件夹中执行命令npm init初始化,并修改type为module。
然后使用npm install ethers命令安装ethers。
在文件夹中创建我的第一个测试学习文件夹01_HelloVitalik
再在此文件夹中创建一个名为HelloVitalik.js的文件。
// 导入ethers包
import { ethers } from "ethers";
// 连接到以太坊网络
const ALCHEMY_MAINNET_URL = '你的API Key';
const provider = new ethers.JsonRpcProvider(ALCHEMY_MAINNET_URL)
const main = async () => {
// 查询vitalik的ETH余额
const balance = await provider.getBalance(`vitalik.eth`);
// 将余额输出在console
console.log(`ETH Balance of vitalik: ${ethers.formatEther(balance)} ETH`);
}
main()
在控制台中执行node 01_HelloVitalik/HelloVitalik.js
这样你就能看到Vitalik的ETH余额
这样我们就是连接到以太坊的网络了,我们可以通过创建的provider去访问以太坊网络上的很多信息,这只是我们的第一步啦!那Provider究竟为我们提供了哪些方法呢?接下来一起学习。
利用Provider读取链上数据
Provider类封装了一些方法,可以便捷的读取链上数据:
1. getBalance()函数用来读取某个地址的ETH余额
2. getNetwork()查询provider连接到了哪条链
3. getBlockNumber()查询当前区块高度
4. getTransactionCount()查询某个钱包的历史交易次数
5. getFeeData()查询当前建议的gas设置,返回的数据格式为bigint
6. getBlock()查询区块信息,参数为要查询的区块高度
7. getCode()查询某个地址的合约bytecode,参数为合约地址
在My Web3文件夹中创建第二个文件夹02_Provider,再在02_Provider中创建Provider.js来写一下具体的代码实现。然后执行node 02_Provider/Provider.js命令。
具体实现方式如下代码:
// 导入ethers包
import { ethers } from "ethers";
// 连接到以太坊网络
const ALCHEMY_MAINNET_URL = '你的API Key';
const provider = new ethers.JsonRpcProvider(ALCHEMY_MAINNET_URL)
const main = async () => {
// 利用provider读取链上信息
// 1. 查询vitalik在主网ETH余额
console.log("1. 查询vitalik的ETH余额");
const balance = await provider.getBalance(`vitalik.eth`);
// 将余额输出在console
console.log(`ETH Balance of vitalik: ${ethers.formatEther(balance)} ETH`);
// 2. 查询provider连接到了哪条链
console.log("\n2. 查询provider连接到了哪条链")
const network = await provider.getNetwork();
console.log(network.toJSON());
// 3. 查询区块高度
console.log("\n3. 查询区块高度")
const blockNumber = await provider.getBlockNumber();
console.log(blockNumber);
// 4. 查询 vitalik 钱包历史交易次数
console.log("\n4. 查询 vitalik 钱包历史交易次数")
const txCount = await provider.getTransactionCount("vitalik.eth");
console.log(txCount);
// 5. 查询当前建议的gas设置
console.log("\n5. 查询当前建议的gas设置")
const feeData = await provider.getFeeData();
console.log(feeData);
// 6. 查询区块信息
console.log("\n6. 查询区块信息")
const block = await provider.getBlock(0);
console.log(block);
// 7. 给定合约地址查询合约bytecode,例子用的WETH地址
console.log("\n7. 给定合约地址查询合约bytecode,例子用的WETH地址")
const code = await provider.getCode("0xc778417e063141139fce010982780140aa0cd5ab");
console.log(code);
}
main()
输出结果如下: