走进web3的世界从Ethers开始(一)

709 阅读2分钟

最近在学习web3所以根据自己的学习内容每天写一篇笔记出来,算是练习也算是巩固! 希望自己早日可以找到web3的工作。 image.png

在我看来ethers就是传统开发中的axios,他使得我们可以非常快速简单的访问区块链上的信息。那么ethers究竟为我们提供了哪些功能呢?让我们来一起学习一下吧!

Provider

Provider类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。

ethers中最常用的是jsonRpcProvider,可以让用户连接到特定节点服务商的节点。

jsonRpcProvider

创建节点服务商的API Key

首先,你需要去节点服务商的网站注册并创建API Key。在这里我使用Alchemy公司API Key创建。

image.png

注册账号然后创建一个app后,你可以看到一个像我截图的这样的界面,这样你就获得了一个API Key

我们可以在本地创建一个My Web3文件文件夹用来存放我们学习ethers的代码:

在文件夹中执行命令npm init初始化,并修改type为module。

image.png

然后使用npm install ethers命令安装ethers。 在文件夹中创建我的第一个测试学习文件夹01_HelloVitalik 再在此文件夹中创建一个名为HelloVitalik.js的文件。

image.png

// 导入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余额

image.png

这样我们就是连接到以太坊的网络了,我们可以通过创建的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命令。

image.png 具体实现方式如下代码:

// 导入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()

输出结果如下:

image.png