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

news2025/2/24 6:26:44

 

 苏泽

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

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


目录

简介

前景科普-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.coloradmin.cn/o/1881230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode-刷题记录-二分法合集(本篇blog会持续更新哦~)

一、二分查找概述 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;适用于有序数组或列表。&#xff08;但其实只要满足二段性&#xff0c;就可以使用二分法&#xff0c;本篇博客后面博主会持续更新一些题&#xff0c;来破除一下人们对“只有有…

44 - 50题高级字符串函数 / 正则表达式 / 子句 - 高频 SQL 50 题基础版

目录 1. 相关知识点2.例子2.44 - 修复表中的名字2.45 - 患某种疾病的患者2.46 - 删除重复的电子邮箱2.47 - 第二高的薪水2.48 - 按日期分组销售产品2.49 - 列出指定时间段内所有的下单产品2.50 - 查找拥有有效邮箱的用户 1. 相关知识点 相关函数 函数含义concat()字符串拼接upp…

[AIGC] Shell脚本在工作中的常用用法

Shell脚本是一种为 shell 编写的脚本程序。商业上的 Unix Shell 一般都配备图形界面&#xff0c;主要包括&#xff1a;Bourne Shell&#xff08;/usr/bin/sh或/bin/sh&#xff09;、Bourne Again Shell&#xff08;/bin/bash&#xff09;、C Shell&#xff08;/usr/bin/csh&…

专题三:Spring源码中新建module

前面我们构建好了Spring源码&#xff0c;接下来肯定迫不及待来调试啦&#xff0c;来一起看看大名鼎鼎ApplicationContext 新建模块 1、基础步骤 1.1 自定义模块名称如&#xff1a;spring-self 1.2 选择构建工具因为spring使用的是gradle&#xff0c;所以这边需要我们切换默认…

KV260视觉AI套件--PYNQ-DPU

目录 1. 简介 2. DPU 原理介绍 2.1 基本原理 2.2 增强型用法 3. DPU 开发流程 3.1 添加 DPU IP 3.2 在 BD 中调用 3.3 配置 DPU 参数 3.4 DPU 与 Zynq MPSoC互联 3.5 分配地址 3.6 生成 Bitstream 3.7 生成 BOOT.BIN 4. 总结 1. 简介 在《Vitis AI 环境搭建 &…

爬虫中如何创建Beautiful Soup 类的对象

在使用 lxml 库解析网页数据时&#xff0c;每次都需要编写和测试 XPath 的路径表达式&#xff0c;显得非常 烦琐。为了解决这个问题&#xff0c; Python 还提供了 Beautiful Soup 库提取 HTML 文档或 XML 文档的 节点。 Beautiful Soup 使用起来很便捷&#xff0c;…

数据结构-期末复习题

数据结构-期末复习题 一、选择题 1、在数据结构中&#xff0c;与所使用的计算机无关的是数据的&#xff08; ) 结构。 A. 存储B. 物理C. 逻辑D. 物理和存储 【答案】C 【解析】暂无解析2、算法分析的两个主要方面是 ( )。 A. 正确性和简单性B. 可读性和文档性C. 空间复杂度…

拼多多滑块逆向

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …

onInterceptTouchEvent() 与 onTouch() 事件分析

前言 本文主要分析 onTouch() 与 onTouchEvent() 事件的差异 正文 先看布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <com.longzhiye.intercepttouch.MyFrameLayout xmlns:android"http://schemas.android.com/apk/res…

Big Data Tools插件

一些介绍 在Jetbrains的产品中&#xff0c;均可以安装插件&#xff0c;其中&#xff1a;Big Data Tools插件可以帮助我们方便的操作HDFS&#xff0c;比如 IntelliJ IDEA&#xff08;Java IDE&#xff09; PyCharm&#xff08;Python IDE&#xff09; DataGrip&#xff08;SQL …

ctfshow-web入门-命令执行(web71-web74)

目录 1、web71 2、web72 3、web73 4、web74 1、web71 像上一题那样扫描但是输出全是问号 查看提示&#xff1a;我们可以结合 exit() 函数执行php代码让后面的匹配缓冲区不执行直接退出。 payload&#xff1a; cvar_export(scandir(/));exit(); 同理读取 flag.txt cinclud…

mybatis实现动态sql

第一章、动态SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验&#xff0c;你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特…

网安小贴士(2)OSI七层模型

一、前言 OSI七层模型是一种网络协议参考模型&#xff0c;用于描述计算机网络体系结构中的不同层次和功能。它由国际标准化组织 (ISO) 在1984年开发并发布。 二、定义 OSI七层模型&#xff0c;全称为开放式系统互联通信参考模型&#xff08;Open Systems Interconnection Refe…

微型导轨:手术机器人的高精度“骨骼”

微型导轨精度高&#xff0c;摩擦系数小&#xff0c;自重轻&#xff0c;结构紧凑&#xff0c;被广泛应用在医疗器械中&#xff0c;尤其是在手术机器人中的应用&#xff0c;通过手术机器人&#xff0c;外科医生可以远离手术台操纵机器人进行手术。可以说&#xff0c;是当之无愧的…

6-linux操作文件与数据上传

目录 通配符学习 创建和上传下载文件 系统盘与数据盘 创建和查找文件夹 文件上传与移动 Windows上传文件到服务器方法1 Windows上传文件到服务器方法2&#xff1a;网盘等 删除文件 rm 复制文件cp 移动文件 常用的命令 cp:复制文件和目录。 mv:移动或重命名文件和目…

「漏洞复现」时空智友ERP系统updater.uploadStudioFile 任意文件上传漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

九浅一深Jemalloc5.3.0 -- ①浅*编译调试

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。5.3.0的特性请见Releases jemalloc/jemalloc GitHub 另…

Chrome备份数据

Chrome备份数据 1、 导出谷歌浏览器里的历史记录 参考&#xff1a;https://blog.csdn.net/qq_32824605/article/details/127504219 在资源管理器中找到History文件&#xff0c;文件路径&#xff1a; C:\Users\你的电脑用户名\AppData\Local\Google\Chrome\User Data\Default …

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 15 题,每题 2 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

前端工程化09-webpack静态的模块化打包工具(未完结)

9.1、开发模式的进化历史 webpacks是一个非常非常的强大的一个工具&#xff0c;相应的这个东西的学习也是有一定的难度的&#xff0c;里边的东西非常的多&#xff0c;里面涉及到的 概念的话也是非常非常的多的。 这个东西既然非常重要&#xff0c;那么在我们前端到底处于怎样…