【Web3项目案例】Ethers.js极简入门+实战案例:实现ERC20协议代币查询、交易

devtools/2024/12/21 22:48:01/

 

 963034f17590412b808770f619144970.png

 苏泽

大家好 这里是苏泽 一个钟爱区块链技术的后端开发者

本篇专栏 ←持续记录本人自学智能合约学习笔记和经验总结 如果喜欢拜托三连支持~


目录

 

简介

前景科普-ERC20

  Ethers极简入门教程:HelloVitalik(非小白可跳)

 

教程概览

开发工具

VScode(推荐)

 

HelloVitalik程序

导入ethers库

连接以太坊网络

编写异步函数

获取Vitalik的ETH余额

输出结果

Async/Await

为什么以太坊交互需要异步编程?

以太坊开发入门:使用Ethers.js与ERC20代币交互

 

环境准备

设置环境变量

步骤1:引入依赖并配置环境变量

步骤2:设置以太坊提供者和钱包

步骤3:加载ERC20合约

步骤4:查询代币余额

步骤5:转账代币

步骤6:执行主函数并处理错误

一些方法的详细解释:


 

简介

在以太坊生态系统中,ERC20 代币是最常见的一种代币标准。ERC20 代币基于智能合约构建,可以在以太坊网络上进行转账和查询余额。

在本文中,我们将使用 ethers.js 库实现与 ERC20 合约进行交互的功能,包括转账代币和查询余额等操作。

前景科普-ERC20

ERC20代币是符合以太坊请求评论20(Ethereum Request for Comments 20,简称ERC20)标准的代币。ERC20是一种协议标准,定义了代币在以太坊区块链上必须实现的一系列规则和功能,以确保不同代币之间的兼容性和互操作性

  Ethers极简入门教程:HelloVitalik(非小白可跳)

 

教程概览

  • 工具与环境:我们将使用VScode作为开发工具,并通过npm安装ethers库。
  • 在线编辑器:介绍使用playcode在线编译JavaScript代码。
  • 程序示例:编写HelloVitalik程序,查询Vitalik的ETH余额。

开发工具

VScode(推荐)

使用本地VScode进行开发,安装Node.js后,通过npm安装ethers库:

npm install ethers --save

 

HelloVitalik程序

导入ethers

import { ethers } from "ethers";

连接以太坊网络

使用Provider类连接以太坊网络:

const provider = ethers.getDefaultProvider();

编写异步函数

使用async/await语法编写异步函数,与区块链进行交互:

const main = async () => {// ...
};
main();

获取Vitalik的ETH余额

利用Provider类的getBalance()函数查询Vitalik的ETH余额:

const balance = await provider.getBalance("vitalik.eth");

输出结果

将获取到的余额从wei转换为ETH,并在控制台输出:

console.log(`ETH Balance of vitalik: ${ethers.formatEther(balance)} ETH`);

不难发现 我们的代码中用到Async和Await,这是为什么呢?

Async/Await

除了Promises和回调函数,ethers.js还支持使用async/await关键字来处理异步性。

async/await是ES7引入的语法糖,它可以让我们像编写同步代码一样编写异步代码。使用async关键字修饰一个函数,就可以在函数体内使用await关键字来等待一个异步操作完成。await关键字可以在Promise对象或返回Promise对象的函数前使用,它会暂停函数的执行,直到Promise对象状态变为resolved并返回结果。

 

为什么以太坊交互需要异步编程?

以太坊是一个分布式网络,涉及到网络通信和共识机制等复杂因素。在与以太坊进行交互时,我们需要等待交易被确认、智能合约的执行结果等。这些操作都需要耗费时间,并且可能会受到网络延迟等因素的影响。如果使用同步编程模型,主线程会被阻塞,无法处理其他任务,从而造成用户体验的下降。

异步编程模型通过将长时间运行的任务委托给后台处理,让主线程能够继续执行其他任务,提高了程序的响应能力和效率。ethers.js利用了Promises和回调函数等机制来处理以太坊交互的异步性。

 

以太坊开发实践:使用Ethers.js与ERC20代币交互

 

环境准备

首先,确保你已经安装了Node.js环境,并准备好了以下依赖:

  • ethers:以太坊JavaScript库,用于与以太坊网络交互。
  • dotenv:用于加载环境变量的库。
  • chalk:用于在控制台输出中添加颜色。

安装依赖:

npm install ethers dotenv chalk

设置环境变量

在与以太坊网络进行交互时,我们需要使用一些环境变量来连接到以太坊节点。为了安全起见,我们将这些敏感信息保存在 .env 文件中,并通过 dotenv 库加载到环境变量中。

在项目目录中创建一个新的文件 .env,并填入以下内容:

INFURA_API_KEY=<YOUR_INFURA_API_KEY>
PRIVATE_KEY=<YOUR_PRIVATE_KEY>
TOKEN_ADDRESS=<TOKEN_ADDRESS>

步骤1:引入依赖并配置环境变量

const { ethers } = require("ethers");
const dotenv = require("dotenv");
const chalk = require("chalk");dotenv.config();

这里我们引入了所需的模块,并使用dotenv库加载了存储在.env文件中的环境变量。

步骤2:设置以太坊提供者和钱包

const main = async () => {const provider = new ethers.providers.InfuraProvider("mainnet",process.env.INFURA_API_KEY);const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);console.log(chalk.bold("Connected to Ethereum network!!!"));

我们使用Infura作为我们的以太坊节点提供者,并使用环境变量中的私钥创建了一个钱包实例。

步骤3:加载ERC20合约

const tokenAddress = process.env.TOKEN_ADDRESS;
const tokenAbi = []; // 这里应该是ERC20代币的ABI数组const tokenContract = new ethers.Contract(tokenAddress, tokenAbi, wallet);
console.log(chalk.bold(`Loaded ERC20 contract at address ${tokenContract.address}`));

创建一个合约实例,用于与特定的ERC20代币合约交互。

步骤4:查询代币余额

const getAddressBalance = async (address) => {const balance = await tokenContract.balanceOf(address);const decimals = await tokenContract.decimals();return balance.div(ethers.BigNumber.from(10).pow(decimals)).toString();
};const address = "<ADDRESS_TO_QUERY>"; // 要查询余额的以太坊地址
const balance = await getAddressBalance(address);
console.log(chalk.green.bold(`Current token balance: ${balance}`));

定义一个异步函数getAddressBalance来查询指定地址的代币余额,并将其转换为人类可读的格式。

步骤5:转账代币

const transferToken = async (toAddress, amount) => {const tx = await tokenContract.transfer(toAddress, amount);console.log(chalk.green.bold(`Transfer of ${amount} tokens to ${toAddress} successful! Transaction hash: ${tx.hash}`));
};const toAddress = "<ADDRESS_TO_TRANSFER>"; // 要转账代币的以太坊地址
const amount = ethers.utils.parseUnits("<AMOUNT>", "<DECIMALS>"); // 要转账的代币数量
await transferToken(toAddress, amount);

定义一个异步函数transferToken来执行代币转账,并输出交易成功的信息。

步骤6:执行主函数并处理错误

main().catch((error) => console.error(chalk.foregroundColorNames.bold("Error: "), error));

执行main函数,并捕获任何可能发生的错误。

一些方法的详细解释:

  1. Provider:Provider是ethers.js中的一个核心概念,它负责与以太坊节点通信。Provider可以是WebSocket连接、HTTP连接,或者是任何实现了所需API的自定义实现。

  2. getSigner():这个方法从Provider对象中获取一个Signer实例。Signer实例代表了一个拥有私钥的以太坊账户,它能够签署交易和消息,从而允许你代表该账户发送交易。

  3. contractAddress:这是智能合约在以太坊网络上的地址。

  4. abi:ABI代表应用二进制接口(Application Binary Interface),它是智能合约的接口描述,定义了合约的方法和事件。

  5. new ethers.Contract():这是创建一个表示智能合约的实例的方法。你需要提供合约地址、ABI和Signer对象,这样你就可以调用合约的方法并与之交互。

 

 

 


http://www.ppmy.cn/devtools/57019.html

相关文章

spring之HelloWord版

目录 基础结构说明 涉及到的功能 执行流程 spring包 引导类 bean定义 注解 回调接口拓展 测试入口 service包 回调接口拓展实现 实体类 自定义注解 基础结构说明 spring子包内&#xff0c;放置spring源码相关类&#xff0c;如注解定义&#xff0c;引导类执行逻辑等…

2-17 基于matlab的改进的遗传算法(IGA)对城市交通信号优化分析

基于matlab的改进的遗传算法&#xff08;IGA&#xff09;对城市交通信号优化分析。根据交通流量以及饱和流量&#xff0c;对城市道路交叉口交通信号灯实施合理优化控制&#xff0c;考虑到交通状况的动态变化&#xff0c;及每个交叉口的唯一性。通过实时监测交通流量&#xff0c…

【Kali-linux for WSL】图形化界面安装

文章目录 前言图形化界面安装 前言 之前在WSL中安装了Kali 启动之后发现什么都没有&#xff01;&#xff01;&#xff01; 那我还怎么学习渗透技术&#xff1f;&#xff1f;&#xff1f; 看来&#xff0c;得改进下我的kali-linux for wsl&#xff0c;安装个图形化界面 图形化…

[图解]SysML和EA建模住宅安全系统-08-安全企业用例图

1 00:00:02,570 --> 00:00:04,400 接下来&#xff0c;我们就来画一下 2 00:00:06,770 --> 00:00:11,490 安全企业组织的用例图&#xff0c;画在哪里 3 00:00:11,760 --> 00:00:15,320 它是在3-用例这个包下面 4 00:00:15,690 --> 00:00:17,080 这是包的名字 5 …

layui-页面布局

1.布局容器 分为固定和完整宽度 class layui-container 是固定宽度 layui-fluid是完整宽度

二叉树的层序遍历/后序遍历(leetcode104二叉树的最大深度、111二叉树的最小深度)(华为OD悄悄话、数组二叉树)

104二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 本题可以使用前序&#xff08;中左右&#xff09;&#xff0c;也可以使用后序遍历&#xff08;左右中&#xff09;&#xff0c;…

第三方软件测试公司分享:软件渗透测试的测试内容和注意事项

软件渗透测试是一种通过模拟攻击的方式来评估软件系统的安全性和漏洞&#xff0c;以发现并修复系统中的安全弱点。保护用户的数据和信息不被恶意攻击者利用&#xff0c;也是软件产品开发流程中重要的环节&#xff0c;可以帮助开发团队完善产品质量&#xff0c;提高用户满意度。…

【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期&#xff1a;2024年6月26日。 项目源码&#xff1a;第五章发布&#xff08;正式开始游戏逻辑的章节&#xff09; 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色&#xff08;刷角色&#xff09;3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色 简介…