2.提供器Provider


文档摘要

title: 2. 提供器 Provider tags: ethers javascript provider frontend web Ethers极简入门: 2. Provider 提供器 我最近在重新学 ,巩固一下细节,也写一个 ,供小白们使用。 推特:@0xAAScience WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请 所有代码和教程开源在github: github.com/WTFAcademy/WTF-Ethers 这一讲,我们将介绍ethers.js的 类,然后利用它连接上Infura节点,读取链上的信息。 类 类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。

title: 2. 提供器 Provider tags: - ethers - javascript - provider - frontend - web

Ethers极简入门: 2. Provider 提供器

我最近在重新学ethers.js,巩固一下细节,也写一个WTF Ethers极简入门,供小白们使用。

推特@0xAA_Science

WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请

所有代码和教程开源在github: github.com/WTFAcademy/WTF-Ethers

这一讲,我们将介绍ethers.js的Provider类,然后利用它连接上Infura节点,读取链上的信息。

Provider

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

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

jsonRpcProvider

创建节点服务商的API Key

首先,你需要去节点服务商的网站注册并创建API Key。在WTF Solidity极简教程的工具篇,我们介绍了InfuraAlchemy两家公司API Key的创建方法,大家可以参考。

Infura API Key

你还可以在 Chainlist 网站找到各个链的公开节点。

连接公开节点

这里,我们用Chainlist上的公开节点作为例子。在找到合适的rpc之后,可以利用ethers.JsonRpcProvider()方法来创建Provider变量,该方法以节点服务的url链接作为参数。

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

// 利用公共rpc节点连接以太坊网络 // 可以在 https://chainlist.org 上找到 const ALCHEMY_MAINNET_URL = 'https://rpc.ankr.com/eth'; const ALCHEMY_SEPOLIA_URL = 'https://rpc.sepolia.org'; // 连接以太坊主网 const providerETH = new ethers.JsonRpcProvider(ALCHEMY_MAINNET_URL) // 连接Sepolia测试网 const providerSepolia = new ethers.JsonRpcProvider(ALCHEMY_SEPOLIA_URL)

利用Provider读取链上数据

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

1. 利用getBalance()函数读取主网和测试网Vitalik的ETH余额(测试网目前不支持ENS域名,只能用钱包地址查询):

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

Vitalik余额

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

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

ethers v6版本, 以上代码中network不能直接console.log(), 具体原因参考: discussion-3977

getNetwork

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

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

getBlockNumber

4. 利用getTransactionCount()查询某个钱包的历史交易次数。

// 4. 查询 vitalik 钱包历史交易次数 console.log("\n4. 查询 vitalik 钱包历史交易次数") const txCount = await providerETH.getTransactionCount("vitalik.eth"); console.log(txCount);

getGasPrice

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

// 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

总结

这一讲,我们介绍了ethers.js的Provider类,并用Infura的节点API Key创建了jsonRpcProvider,读取了ETH主网和Sepolia测试网的链上信息。


作者与出处
原作者: WTFAcademy
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: WTFAcademy 转发
评论区 (0)
U