学习资料:
RPC服务商:ethereum.org/zh/develope…
学习内容
-
认识 Provider 类,知道它是什么?
-
通过 RPC 连接快速连接到以太坊网络
-
通过 Provider 实例读取以太坊链上的一些数据
- getBalance(读取钱包余额)
- getNetwork(读取当前连接到网络)
- getBlockNumber(读取当前的区块高度)
- getGasPrice(查询当前 Gas 的价格)
- getFeeData (查询当前建议的 Gas 价格)
- getBlock (查询指定区块信息)
- getCode (查询指定合约的源码)
什么是 Provider 类
Provider
类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。在ethers
中,Provider
不接触用户私钥,只能读取链上信息,不能写入,这一点比web3.js
要安全。
RPC 是什么?
在以太坊上开发的Dapp应用(链下)需要与区块链(链上)交互。早期,以太坊上的基础设施很少,开发者需要在本地部署以太坊节点来完成链下和链上的交互,非常麻烦,且耗时数日。
RPC在链下、链上之间搭了一座桥,让两者的交互变的简单。它为用户提供对以太坊和IPFS网络的即时、可扩展的API
访问。开发者在服务商(portal、Infura、SettleMint、等)官网注册后,就可以免费申请的以太坊API KEY
,就可以利用Infura
的节点与区块链交互。
代码
1.通过连接 RPC 创建Provider实例
const providerETH = new ethers.providers.JsonRpcProvider(mainNetWork);
2. 利用创建的 provider 实例读取链上的一些数据
- 读取某个地址的钱包余额
const balance = await providerETH.getBalance('vitalik.eth')
console.log('V神的钱包余额', ethers.utils.formatEther(balance))
- 读取当前的 provider 连接到哪个条网络
const mainNetWorkInFo = await providerETH.**getNetwork**()
const testNetWorkInFo = await providerTest.**getNetwork**()
console.log('主网信息', mainNetWorkInFo)
console.log('测试网信息', testNetWorkInFo)
- 读取当前的区块高度
const blockNumber = await providerETH.getBlockNumber()
- 查询 gas 的价格
const gasPrice = await providerETH.getGasPrice()
console.log('当前 gas 价格', gasPrice.toNumber())
- 查询区块信息
const block = await providerETH.getBlock(blockNumber)
console.log('block',block)
- 查询指定区块高度下的合约源代码,如果当前没有合约被部署, 将返回
0x
。
const contract = await providerETH.getCode('registrar.firefly.eth')
console.log('contract',contract)