ethers官方文档:Documentation
1、ethers简介:
ethers.js
是一个完整而紧凑的开源库,用于与以太坊区块链及其生态系统进行交互。如果你要写Dapp的前端,你就需要用到ethers.js
。
与更早出现的web3.js
相比,它有以下优点:
- 代码更加紧凑:
ethers.js
大小为116.5 kB,而web3.js
为590.6 kB。 - 更加安全:
Web3.js
认为用户会在本地部署以太坊节点,私钥和网络连接状态由这个节点管理(实际并不是这样);ethers.js
中,Provider
提供器类管理网络连接状态,Wallet
钱包类管理密钥,安全且灵活。 - 原生支持
ENS
。
2、开发工具
我选择使用本地vscode
进行开发。
3、安装和使用ethers
需要安装Node.js,然后利用包管理工具npm
安装ethers
库:
npm install --save ethers
//我选择安装指定版本
npm install ethers@5.6.9
示例代码:
import { ethers } from "ethers";
const provider = ethers.getDefaultProvider();
const main = async () => {
const balance = await provider.getBalance(`vitalik.eth`);
console.log(`ETH Balance of vitalik: ${ethers.utils.formatEther(balance)} ETH`);
}
main()
逐行分析这个程序:
1. 导入ethers
import { ethers } from "ethers";
2. 连接以太坊
在ethers
中,Provider
类是一个为以太坊网络连接提供抽象的类,它提供对区块链及其状态的只读访问。我们声明一个provider
用于连接以太坊网络。ethers
内置了一些公用rpc
,方便用户连接以太坊:
const provider = ethers.getDefaultProvider();
注意:ethers
内置的rpc
访问速度有限制,仅测试用,生产环境还是要申请个人rpc
。
3. 声明async
函数
由于和区块链交互不是实时的我们需要用到js的async/await
语法糖。每次和链交互的调用需要用到await
,再把这些这些用async
函数包裹起来,最后再调用这个函数。
const main = async () => {
//...
}
main()
4. 获取v神地址的ETH
余额
我们可以利用Provider
类的getBalance()
函数来查询某个地址的ETH
余额。由于ethers
原生支持ENS
域名,我们不需要知道具体地址,用ENS
域名vitalik.eth
就可以查询到以太坊创始人豚林-vitalik的余额。
const balance = await provider.getBalance(`vitalik.eth`);
5. 转换单位后在console
中输出
我们从链上获取的以太坊余额以wei
为单位,而1 ETH = 10^18 wei
。我们打印在console
之前,需要进行单位转换。ethers
提供了功能函数formatEther
,我们可以利用它将wei
转换为ETH
。
console.log(`ETH Balance of vitalik: ${ethers.utils.formatEther(balance)} ETH`);
6、在vscode控制台输出
node 01_HelloVitalik/HelloVitalik.js
这样,就能在控制台中看到v神的ETH
余额了:1951 ETH
。
踩坑记录:
运行后报错
Error: Cannot find module 'D:\voting\ethers-learn\ethers-learn\hello.js'
at Module._resolveFilename (node:internal/modules/cjs/loader:1039:15)
at Module._load (node:internal/modules/cjs/loader:885:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
Node.js v18.13.0
把import { ethers } from "ethers"替换为:
const ethers = require("ethers");