如何发送ERC-20代币

QuickNode 发布于 2026-06-16 阅读 95

本文是一篇关于使用Viem和Quicknode在JavaScript中发送ERC-20代币的实践指南。文章首先介绍了ERC-20代币和approve函数的概念,然后详细说明了如何设置Quicknode端点、安装Viem库、编写代码实现直接转账和授权合约转账。提供了完整的代码示例和步骤说明,适合有JavaScript基础及以太坊基本知识的开发者。

概述

在本指南中,我们将深入探讨与以太坊区块链交互的实际操作,特别关注 ERC-20 代币的转移。ERC-20 代币是一种标准的以太坊代币,广泛应用于各种场景。我们将探索如何使用 Viem 和 Quicknode 端点通过 JavaScript 实现这一操作。

你将完成以下任务

  • 了解 ERC-20 代币的基础知识及其转移方法
  • 使用必要的库设置开发环境
  • 实现向以太坊地址转移 ERC-20 代币
  • 实现 ERC-20 代币授权以及代表智能合约转移代币

你需要准备

  • 以太坊的基础知识智能合约的理解。
  • 熟悉 JavaScript
  • 文本编辑器或 IDE(例如 VS Code)
  • 访问以太坊节点或使用像 Quicknode 这样的服务来连接以太坊网络(或另外 24 条区块链,数量还在增加!在此处免费注册)
  • 一个 EVM 钱包(可以获取你的私钥,例如 MetaMask 或临时钱包)
依赖 版本
node.js 18.13.0
viem ^2.0.0

ERC-20 代币

ERC-20 代币是建立在以太坊区块链上的数字资产,遵循一套特定的标准,这些标准允许它们被共享、交换或转移到任何以太坊地址。这些代币代表各种资产,例如投票权、金融份额、资源使用权,或仅仅是价值存储。

授权

在处理 ERC-20 代币转账时,理解 approve 函数至关重要。该函数允许智能合约代表你转移指定数量的代币。这是一项安全措施,确保只有在你明确同意的情况下才能移动代币。

何时使用授权

  • 与去中心化交易所(DEX)交互:例如,在 Uniswap 等平台上交换代币之前,你需要授权 DEX 访问你想要交易的代币数量。
  • 参与 DeFi 平台:当你向 DeFi 协议存入代币时,需要授权才能使协议的智能合约处理你的代币,无论是用于借贷、质押还是流动性挖矿。

何时不需要授权

  • 直接转账:如果你只是简单地将代币直接转移到另一个地址,则不需要使用 approve 函数。这类似于将代币从你的钱包发送到其他人的钱包或智能合约。
  • 已授权的合约:如果你已经授权了一个合约使用你的代币,并且该授权额度足以覆盖当前交易,则无需再次授权。

approve 函数是以太坊生态系统中 ERC-20 代币交互的一个基本方面,它为你控制智能合约如何使用你的代币提供了控制权和安全性。

现在,在深入探讨发送 ERC-20 代币的技术细节之前,我们先设置一个免费的 Quicknode 端点并为我们的钱包充值。

项目前提:创建 Quicknode 端点

欢迎你使用公共节点或自行部署和管理基础设施;但是,如果你希望获得 8 倍的响应速度,你可以将繁重的工作交给我们。在此处注册一个账户。

登录后,点击 Create an endpoint 按钮,然后选择要部署的区块链和网络。在本指南中,我们将选择 Ethereum Sepolia 链。

创建端点后,请保留该页面,因为我们在本指南的技术编码部分会用到它。

Sepolia Quicknode 端点

提示

请注意,尽管我们在本指南中使用 Ethereum Sepolia 进行演示,但你也可以使用其他兼容 EVM 的链,例如 Base、Polygon、Arbitrum 等,与智能合约和 ERC-20 代币进行交互。

基础设施创建完成后,现在让我们进入技术部分。

项目前提:为钱包充值

如果你需要 Sepolia 测试网上的 ETH,多链 Quicknode Faucet 可以让你轻松获取测试 ETH!

导航到多链 Quicknode Faucet,连接你的钱包(例如 MetaMask、Coinbase Wallet)或粘贴你的钱包地址来获取测试 ETH。请注意,使用 EVM 水龙头需要在以太坊主网上有 0.001 ETH 的主网余额要求。你也可以通过推文或登录 Quicknode 账户来获得奖励!

多链 Quicknode Faucet

在本指南的剩余部分,我们将过渡到编码部分,演示如何将 ERC-20 代币发送到以太坊地址以及转移到智能合约。

使用 Viem 和 Quicknode 发送 ERC-20 代币

Viem 是一个用于以太坊的 TypeScript 接口,可以通过你的 Quicknode 端点读取和写入合约。在本指南中,你将创建一个公共客户端来模拟合约调用,以及一个钱包客户端来签名和发送交易。

注意,如果你需要 ERC-20 代币来完成本指南的剩余部分,请查看 Quicknode 指南:如何创建和部署 ERC20 代币

第 1 步:安装 Viem 并设置项目

要安装 Viem,我们将使用 npm 包 viem。确保你的 Node.js 版本为 18 或更高。

创建一个项目文件夹,进入该文件夹,然后在终端中运行以下命令来初始化一个默认的 npm 项目:

npm init --y

然后,通过 npm 安装 viem

npm install viem

或者,通过 yarn 初始化项目。运行命令:

yarn init --y

然后,通过 yarn 安装:

yarn add viem

注意:完成上述任一操作后,将 "type": "module" 插入到刚刚创建的 package.json 文件中。这将启用 ES 模块语法。

查看 Viem 文档以获取更多信息。

第 2 步:创建并配置文件

接下来,让我们创建一个文件并输入代码。在你的项目目录中,创建一个名为 index.js 的文件:

echo > index.js

然后,在代码编辑器中打开该文件并输入以下代码:

import { sepolia } from 'viem/chains'; // 根据需要更改网络
import { createPublicClient, createWalletClient, http  } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import abi from './abi.json' assert { type: 'json' };

// 定义你的私钥
const privateKey = '0x' + 'YOUR_PRIVATE_KEY';

// 将私钥转换为账号对象
const account = privateKeyToAccount(privateKey);

const endpoint = "YOUR_QUICKNODE_ENDPOINT";

// 初始化客户端
const publicClient = createPublicClient({
    chain: sepolia,
    transport: http(endpoint),
});

const walletClient = createWalletClient({ account, chain: sepolia, transport: http(endpoint) });

// 合约和交易详情
const contractAddress = 'ERC20_CONTRACT_ADDRESS';
const toAddress = 'TO_ADDRESS';
const decimals = 18; // 根据你的 ERC20 小数位数更改
const tokenAmount = 10n ** BigInt(decimals); // 1 个代币,根据需要调整

async function send() {
    try {
        const { request } = await publicClient.simulateContract({
            address: contractAddress,
            abi: abi,
            functionName: 'transfer',
            args: [toAddress, tokenAmount],
            account
        });

        const response = await walletClient.writeContract(request);
        console.log('交易已发送。交易哈希:', response);

    } catch (error) {
        console.error('发送交易时出错:', error);
    }
}

send().catch(error => console.error('send 函数出错:', error));

花几分钟回顾一下代码和注释。然后,将所有占位符字符串 YOUR_QUICKNODE_ENDPOINTYOUR_PRIVATE_KEYERC20_CONTRACT_ADDRESSTO_ADDRESS 替换为实际值。

注意:你会注意到在导入中,我们创建了一个 abi 变量,它引用了我们的 abi.json 文件。你需要在同一目录中创建类似的文件,或者将你的 ABI 内联代码(但这可能会占用空间)。例如,你可以通过转到 Etherscan 上的 Contract 选项卡(示例)并向下滚动到 Contract ABI 部分来引用/复制 ABI。但请注意,此方法仅适用于已在 Etherscan 上验证的合约。

第 3 步:执行并发送 ERC-20 代币

通过调用以下命令来执行脚本。请记住,已将上面代码中的所有占位符替换为实际值。

node index.js

如果你使用 yarn,则运行:

yarn run index.js

输出将类似于:

Transaction sent. Transaction hash: 0x35f50018c2a83ca13685a7a0ad8e52598ef8ae48a0fa15dc537737f7fe6077a8

通过 Etherscan 或你喜欢的区块浏览器查找该交易以进行确认。

授予智能合约 ERC-20 代币访问权限

正如前面 授权 部分所述,将 ERC-20 代币转账到智能合约不需要使用 approve 函数;但是,如果你希望智能合约代表你访问部分或全部 ERC-20 代币,则需要先调用 approve 函数。

让我们演示如何做到这一点。我们不会深入讲解如何设置你的文件(因为过程与上面相同),所以只需跟着步骤理解,无需编写代码。

Viem

async function approve() {
    try {
        const { request } = await publicClient.simulateContract({
            address: contractAddress,
            abi: abi,
            functionName: 'approve',
            args: [spender, tokenAmount],
            account
        });

        const response = await walletClient.writeContract(request);
        console.log('交易哈希:', response);
    } catch (error) {
        console.error('发送交易时出错:', error);
    }
}

注意,唯一的变化是 functionNameargument 字段。我们将函数更新为 approve,因为这是我们要调用的函数,并将参数值更新为 spender,该值应引用你想要授权代币的合约地址。

最后的话

恭喜你完成本指南!你现在已经掌握了使用 Viem 和 Quicknode 端点自信地发送 ERC-20 代币的知识。这项技能是与以太坊区块链交互的基础部分,也是你 Web3 工具箱中的宝贵资产。

如果你想查看本指南的 Python 版本(使用 Web3.py),请查看 Quicknode 指南:如何使用 Web3.py 发送 ERC-20 代币

下一步做什么?

  • 实验和探索:尝试在不同账户之间发送代币,或将这些方法集成到你自己的项目中。
  • 深化知识:深入研究智能合约开发,并探索其他代币标准,如 ERC-721 或 ERC-1155。
  • 加入社区:与其他开发者交流,分享你的经验,并在项目上进行协作。

请记住,区块链开发是一个不断发展的领域,保持更新是 🔑。订阅我们的新闻通讯以获取更多关于 Web3 和区块链的文章和指南。如果你有任何问题或需要进一步帮助,请随时加入我们的 Discord 服务器,或使用下面的表格提供反馈。通过关注我们的 Twitter (@Quicknode) 和 Telegram 公告频道 保持信息畅通和联系。

我们 ❤️ 反馈!

告诉我们 你是否有任何反馈或对新主题的请求。我们期待听到你的声音。

  • 原文链接: quicknode.com/guides/eth...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论