我最近在重新学ethers.js
,巩固一下细节,也写一个WTF Ethers极简入门
,供小白们使用。
WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请
所有代码和教程开源在github: github.com/WTFAcademy/WTFEthers
这一讲,我们将介绍ethers.js的Provider
类,然后利用它连接上Infura节点,读取链上的信息。
Provider
类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。在ethers
中,Provider
不接触用户私钥,只能读取链上信息,不能写入,这一点比web3js
要安全。
除了之前介绍的默认提供者defaultProvider
以外,ethers
中最常用的是jsonRpcProvider
,可以让用户连接到特定节点服务商的节点。
首先,你需要去节点服务商的网站注册并创建API Key
。在WTF Solidity极简教程
的工具篇,我们介绍了Infura和Alchemy两家公司API Key
的创建方法,大家可以参考。
这里,我们用Infura节点作为例子。在创建好Infura API Key之后,就可以利用ethers.provider.JsonRpcProvider()
方法来创建Provider
变量。JsonRpcProvider()
以节点服务的url
作为参数。
在下面这个例子中,我们分别创建连接到ETH
主网和Rinkeby
测试网的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}`)
// 连接Rinkeby测试网
const providerRinkeby = new ethers.providers.JsonRpcProvider(`https://rinkeby.infura.io/v3/${INFURA_ID}`)
Provider
类封装了一些方法,可以便捷的读取链上数据:
1. 利用getBalance()
函数读取主网和测试网V神的ETH
余额:
// 1. 查询vitalik在主网和Rinkeby测试网的ETH余额
console.log("1. 查询vitalik在主网和Rinkeby测试网的ETH余额");
const balance = await providerETH.getBalance(`vitalik.eth`);
const balanceRinkeby = await providerRinkeby.getBalance(`vitalik.eth`);
// 将余额输出在console(主网)
console.log(`ETH Balance of vitalik: ${ethers.utils.formatEther(balance)} ETH`);
// 输出Rinkeby测试网ETH余额
console.log(`Rinkeby ETH Balance of vitalik: ${ethers.utils.formatEther(balanceRinkeby)} ETH`);
2. 利用getNetwork()
查询provider
连接到了哪条链,homestead
代表ETH
主网:
// 2. 查询provider连接到了哪条链
console.log("\n2. 查询provider连接到了哪条链")
const network = await providerETH.getNetwork();
console.log(network);
3. 利用getBlockNumber()
查询当前区块高度:
// 3. 查询区块高度
console.log("\n3. 查询区块高度")
const blockNumber = await providerETH.getBlockNumber();
console.log(blockNumber);
4. 利用getGasPrice()
查询当前gas price
,返回的数据格式为BigNumber
,可以用BigNumber
类的toNumber()
或toString()
方法转换成数字和字符串。
// 4. 查询当前gas price
console.log("\n4. 查询当前gas price")
const gasPrice = await providerETH.getGasPrice();
console.log(gasPrice);
5. 利用getFeeData()
查询当前建议的gas
设置,返回的数据格式为BigNumber
。
// 5. 查询当前建议的gas设置
console.log("\n5. 查询当前建议的gas设置")
const feeData = await providerETH.getFeeData();
console.log(feeData);
6. 利用getBlock()
查询区块信息,参数为要查询的区块高度:
// 6. 查询区块信息
console.log("\n6. 查询区块信息")
const block = await providerETH.getBlock(0);
console.log(block);
7. 利用getCode()
查询某个地址的合约bytecode
,参数为合约地址,下面例子中用的主网WETH
的合约地址:
// 7. 给定合约地址查询合约bytecode,例子用的WETH地址
console.log("\n7. 给定合约地址查询合约bytecode,例子用的WETH地址")
const code = await providerETH.getCode("0xc778417e063141139fce010982780140aa0cd5ab");
console.log(code);
这一讲,我们将介绍ethers.js的Provider
类,并用Infura的节点API Key创建了jsonRpcProvider
,读取了ETH
主网和Rinkeby
测试网的链上信息。