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

 

 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.rhkb.cn/news/367765.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3开发过程中遇到的一些问题记录

问题&#xff1a; vue3在使用 defineProps、defineEmits、defineExpose 时不需要import&#xff0c;但是 eslint会报错error defineProps is not defined no-undef 解决方法&#xff1a; 安装 vue-eslint-parser 插件&#xff0c;在 .eslintrc.js 文件中添加配置 parser: vue-e…

开发者聊科学作息时间表

非常有幸对科学作息时间表app的开发者做一次采访。 问&#xff1a;你对科学作息时间表app满意么&#xff1f; 答&#xff1a;非常不满意&#xff0c;我们的设想是让他更智能&#xff0c;更多的提醒方式&#xff0c;更好的交互体验。如果作为一个闹钟他是非常不合格的&#xff0…

DataX数据迁移

DataX数据迁移 访问DataX Web管理页面&#xff1a; http://ip:9527/index.html 用户名&#xff1a;admin&#xff0c;密码&#xff1a;123456 本文中示例将SqlServer数据增量同步到MySql中。 增量同步同步时&#xff0c;MySql中的新字段设置默认值 1. 查看执行器是否注册成…

平衡二叉查找树和多路查找树

平衡二叉查找树 普通平衡二叉查找树 平衡二叉树定义是按照有序排列成树状&#xff0c;左子树数据大于右子树&#xff0c;任意节点的左右子树高度不能大于1 优点&#xff1a;可以保证绝对的平衡 缺点&#xff1a;当进行删除节点和新增节点&#xff0c;树进行自平衡的时候&…

jenkins 发布服务到linux服务器

1.环境准备 1.1 需要一台已经部署了jenkins的服务器&#xff0c;上面已经集成好了&#xff0c;jdk、maven、nodejs、git等基础的服务。 1.2 需要安装插件 pusblish over ssh 1.3 准备一台额外的linux服务器&#xff0c;安装好jdk 2.流程描述 2.1 配置jenkins&#xff0c;包括p…

[leetcode hot 150]第四百五十二题,用最少数量的箭引爆气球

题目&#xff1a; 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

《昇思25天学习打卡营第6天 | 函数式自动微分》

《昇思25天学习打卡营第6天 | 函数式自动微分》 目录 《昇思25天学习打卡营第6天 | 函数式自动微分》函数式自动微分简单的单层线性变换模型函数与计算图微分函数与梯度计算Stop Gradient 函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff0…

JAVA每日作业day7.1-7.3小总结

ok了家人们前几天学了一些知识&#xff0c;接下来一起看看吧 一.API Java 的 API &#xff08; API: Application( 应用 ) Programming( 程序 ) Interface(接口 ) &#xff09; Java API 就是 JDK 中提供给我们使用的类&#xff0c;这些类将底层 的代码实现封装了起来&#x…

Linux多进程和多线程(四)进程间通讯-定时器信号和子进程退出信号

多进程(四) 定时器信号alarm()函数示例alarm()函数的限制定时器信号的实现原理setitimer()函数setitimer()和alarm()函数的区别 setitimer() old_value参数的示例 对比alarm()区别总结&#xff1a; 子进程退出信号 示例: 多进程(四) 定时器信号 SIGALRM 信号是用来通知进程…

新声创新20年:无线技术给助听器插上“娱乐”的翅膀

听力损失并非现代人的专利&#xff0c;古代人也会有听力损失。助听器距今发展已经有二百多年了&#xff0c;从当初单纯的声音放大器到如今的全数字时代助听器&#xff0c;助听器发生了翻天覆地的变化&#xff0c;现代助听器除了助听功能&#xff0c;还具有看电视&#xff0c;听…

微信小程序 调色板

注意&#xff1a;是在uniapp中直接使用的一个color-picker插件&#xff0c;改一下格式即可在微信小程序的原生代码中使用 https://github.com/KirisakiAria/we-color-picker 这是插件的地址&#xff0c;使用的话先把这个插件下载下来&#xff0c;找到src&#xff0c;在项目创…

FreeRTOS和UCOS操作系统使用笔记

FreeRTOS使用示例 UCOS使用示例 信号量使用 信号量访问共享资源区/ OS_SEMMY_SEM; //定义一个信号量&#xff0c;用于访问共享资源OSSemCreate ((OS_SEM* )&MY_SEM, //创建信号量&#xff0c;指向信号量(CPU_CHAR* )"MY_SEM", //信号量名字(OS_SEM_CTR )1, …

imx6ull/linux应用编程学习(8)PWM应用编程(基于正点)

1.应用层如何操控PWM&#xff1a; 与 LED 设备一样&#xff0c; PWM 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/pwm 目录下 这里列举出了 8 个以 pwmchipX&#xff08;X 表示数字 0~7&#xff09;命名的文件夹&#xff0c;这八个文件夹其实就对应了…

守护矿山安全生产:AI视频分析技术在煤矿领域的应用

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在煤矿行业的应用也日益广泛。AI视频智能分析技术作为其中的重要分支&#xff0c;为煤矿的安全生产、过程监测、效率提升和监管决策等提供了有力支持。 一、煤矿AI视频智能分析技术的概述 视频智慧煤矿AI…

数据库测试数据准备厂商 Snaplet 宣布停止运营

上周刚获知「数据库调优厂商 OtterTune 宣布停止运营」。而今天下班前&#xff0c;同事又突然刷到另一家海外数据库工具商 Snaplet 也停止运营了。Snaplet 主要帮助开发团队在数据库中生成仿真度高且合规的测试数据。我们在年初还撰文介绍过它「告别手搓&#xff01;Postgres 一…

Continual Test-Time Domain Adaptation--论文笔记

论文笔记 资料 1.代码地址 https://github.com/qinenergy/cotta 2.论文地址 https://arxiv.org/abs/2203.13591 3.数据集地址 论文摘要的翻译 TTA的目的是在不使用任何源数据的情况下&#xff0c;将源预先训练的模型适应到目标域。现有的工作主要考虑目标域是静态的情况…

Vue项目打包上线

Nginx 是一个高性能的开源HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它在设计上旨在处理高并发的请求&#xff0c;是一个轻量级、高效能的Web服务器和反向代理服务器&#xff0c;广泛用于提供静态资源、负载均衡、反向代理等功能。 1、下载nginx 2、…

探讨命令模式及其应用

目录 命令模式命令模式结构命令模式适用场景命令模式优缺点练手题目题目描述输入描述输出描述题解 命令模式 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其…

【高级篇】第9章 Elasticsearch 监控与故障排查

9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…

Rough.js在Vue3中生成随机蒙德里安风格的抽象艺术

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Mondrian风格艺术生成器&#xff1a;用Vue和RoughJS创造抽象艺术 应用场景 Mondrian风格艺术以其大胆的色彩块和简单的几何形状而闻名。这种风格可以应用于各种设计项目&#xff0c;包括海报、插图和网页设计…