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

 

 苏泽

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

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


目录

简介

前景科普-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对象,这样你就可以调用合约的方法并与之交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/758915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机配置与windows之间文件夹共享samba服务:

虚拟机配置与windows之间文件夹共享samba服务: #输入安装命令&#xff1a; 第一步: 下载samba cd /etc/ sudo apt-get install samba第二步: 配置用户 sudo smbpasswd -a 虚拟机用户名第三步: 进入配置文件配置共享文件 sudo vim /etc/samba/smb.conf末尾输入以下内容: [s…

全球最大智能立体书库|北京:3万货位,715万册,自动出库、分拣、搬运

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 北京城市图书馆的立体书库采用了先进的WMS&#xff08;仓库管理系统&#xff09;和WCS&#xff08;仓库控制系统&#xff09;&#xff0c;与图书…

代码随想录-二叉搜索树(1)

目录 二叉搜索树的定义 700. 二叉搜索树中的搜索 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 98. 验证二叉搜索树 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 530. 二叉搜索树的最小绝对差 题目描述&#x…

error: Sandbox: rsync.samba in Xcode project

在Targets 的 Build Settings 搜索&#xff1a;User script sandboxing 设置为NO

基于机器学习的制冷系统过充电和欠充电故障诊断(采用红外热图像数据,MATLAB)

到目前为止&#xff0c;制冷系统故障诊断方法已经产生很多种&#xff0c;概括起来主要有三大类&#xff1a;基于分析的方法&#xff0c;基于知识的方法和基于数据驱动的方法。基于分析的方法主要获得制冷系统的数学模型&#xff0c;通过残差来检测和诊断故障。如果存在残差且很…

SonicSense:声学振动丰富机器人的物体感知能力

在通过声学振动进行物体感知方面&#xff0c;尽管以往的研究已经取得了一些有希望的结果&#xff0c;但目前的解决方案仍然受限于几个方面。首先&#xff0c;大多数现有研究集中在只有少数&#xff08;N < 5&#xff09;基本物体的受限设置上。这些物体通常具有均质材料组成…

电路笔记(电源模块): 基于FT2232HL实现的jtag下载器硬件+jtag的通信引脚说明

JTAG接口说明 JTAG 接口根据需求可以选择20针或14针的配置&#xff0c;具体选择取决于应用场景和需要连接的功能。比如之前的可编程逻辑器件XC9572XL使用JTAG引脚&#xff08;TCK、TDI、TDO、TMS、VREF、GND&#xff09;用于与器件进行调试和编程通信。更详细的内容可以阅读11…

KAIROS复现记录

KAIROS:使用全系统起源的实用入侵检测和调查 Github&#xff1a;https://github.com/ProvenanceAnalytics/kairos KAIROS: Practical Intrusion Detection and Investigation using Whole-system Provenance 1. 论文实验 实验部分使用SCISKIT-LEARN来实现分层特征散列&#xf…

硬核!大佬通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM。

这是一篇记录如何通过Intel CPU的JTAG接口,DUMP微软原始Xbox的加密BootROM的文章,内容也记录了老哥如何设计实现JTAG调试器的过程,非常硬核! 原文:JTAG ‘Hacking’ the Original Xbox in 2023 Using Intel CPU JTAG to dump the secret bootrom in Microsoft’s original…

Java代码基础算法练习-求成绩单中最高和第二高的成绩-2024.06.30

任务描述&#xff1a; 输入n(0<n<20)个整数代表成绩&#xff0c;求n个成绩中最高的和第二高成绩 解决思路&#xff1a; 输入的数字 n 为 for 循环的次数&#xff0c;在每次循环中进行值的输入和判断 如果当前输入的分数大于最大值&#xff0c;则更新最大值和次大值 如…

Golang-channel理解

channel golang-channel语雀笔记整理 channelgolang channel的设计动机&#xff1f;chanel的数据结构/设计思考 golang channel的设计动机&#xff1f; channel是一种不同协程之间实现异步通信的数据结构。golang中有一种很经典的说法是要基于通信实现共享内存&#xff0c;而不…

grpc教程——proto文件转go

【1】编写一个proto文件 syntax "proto3"; package myproto;service NC{rpc SayStatus (NCRequest) returns (NCResponse){} }message NCRequest{ string name 1; } message NCResponse{string status 1; } 【2】转换&#xff1a;protoc --go_out. myservice.pro…

重生奇迹MU 正确获取金币的方式

在游戏中&#xff0c;需要消耗大量的金币来购买红药等物品。因此&#xff0c;如何快速赚取金币也成为玩家关注的问题。您知道有哪些方法可以快速地获得金币吗&#xff1f; 一、哪个地图上是最适合打金币的很关键 在选择打钱的地方时&#xff0c;不能盲目行动&#xff0c;需要…

安装maven与nexus

安装maven与nexus Maven官网下载地址&#xff1a;http://maven.apache.org cd /data/software/wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.8-bin.tar.gz# 解压 tar xf apache-maven-3.8.1-bin.tar.gz -C /opt/[rooth…

木各力“GERRI”被“GREE”格力无效宣告成功

近日“GERRI”被“GREE”格力无效宣告成功&#xff0c;“GERRI”和“GREE”近似不&#xff0c;如果很近似当初就不会通过初审和下商标注册证&#xff0c;但是如果涉及知名商标和驰名商标&#xff0c;人家就可以异议和无效。 “GERRI”在被无效宣告时&#xff0c;引用了6个相关的…

【启明智显分享】乐鑫ESP32-S3R8方案2.8寸串口屏:高性能低功耗,WIFI/蓝牙无线通信

近年来HMI已经成为大量应用聚焦的主题&#xff0c;在消费类产品通过创新的HMI设计带来增强的连接性和更加身临其境的用户体验之际&#xff0c;工业产品却仍旧在采用物理接口。这些物理接口通常依赖小型显示器或是简单的LED&#xff0c;通过简单的机电开关或按钮来实现HMI交互。…

竞赛 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

2.2 Python数据类型详解

第二节&#xff1a;Python数据类型详解 Python作为一种动态类型语言&#xff0c;支持多种数据类型&#xff0c;每种数据类型都有其特定的特点和用途。本章将详细介绍Python中常见的数据类型及其特性&#xff0c;以及如何使用这些数据类型进行编程。 2.2.1 整数 (int) 整数是…

黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁

文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁 1.缓存穿透 解决办法 写入NULL值到Redis缓存&#xff0c;以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题&#xff01; 代码 2.缓存雪崩 这个概念很好理解&#xff0c;雪崩就是无数的小雪花结构突然因…

pandas数据分析(1)

pandas&#xff0c;即Python数据分析库&#xff08;Python data analysis library&#xff09; DataFrame和Series DataFrame&#xff08;数据帧&#xff09;和Series&#xff08;序列&#xff09;是pandas的核心数据结构。DataFrame的主要组件包含索引、列、数据。DataFrame和…