ethers.js1:ethers的安装和使用

ethers官方文档:Documentation

1、ethers简介:

ethers.js是一个完整而紧凑的开源库,用于与以太坊区块链及其生态系统进行交互。如果你要写Dapp的前端,你就需要用到ethers.js

与更早出现的web3.js相比,它有以下优点:

  1. 代码更加紧凑:ethers.js大小为116.5 kB,而web3.js为590.6 kB。
  2. 更加安全:Web3.js认为用户会在本地部署以太坊节点,私钥和网络连接状态由这个节点管理(实际并不是这样);ethers.js中,Provider提供器类管理网络连接状态,Wallet钱包类管理密钥,安全且灵活。
  3. 原生支持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");
相关推荐
Broken Arrows16 小时前
解决Jenkins在构建前端任务时报错error minimatch@10.0.3:……的记录
运维·前端·jenkins
明月与玄武16 小时前
JS 自定义事件:从 CustomEvent 到 dispatchEvent!
前端·javascript·vue.js
Zhencode16 小时前
vue之异步更新队列
前端·javascript·vue.js
九年义务漏网鲨鱼16 小时前
从零学习 Agentic RL(四)—— 超越 ReAct 的线性束缚:深入解析 Tree-of-Thoughts (ToT)
前端·学习·react.js
Jay丶16 小时前
Next.js 与 SEO:让搜索引擎爱上你的网站 💘
前端·javascript·react.js
狗头大军之江苏分军16 小时前
请不要在感情里丢掉你的“我”
前端·后端
路光.17 小时前
一.React相关面试真题
前端·react.js·前端框架
玉宇夕落17 小时前
🌌用CSS3打造“星球大战”片头:前端是代码界的导演,让文字在星空中翻滚
前端·javascript
gustt17 小时前
CSS3 动画实战:打造星球大战开场动画
前端·css
colorFocus17 小时前
Promise与async/await的接口串联和并联
前端·javascript