在Web3生态中,ERC20(Ethereum Request for Comments 20)是最具影响力的代币标准之一,它定义了以太坊上同质化代币(如USDT、USDC、DAI等)的基本功能规范,开发者或用户若要通过Web3应用与ERC20代币交互,核心在于掌握“调用”ERC20合约的方法,本文将围绕ERC20的核心功能、调用场景及代码实践展开说明。

ERC20标准的核心接口与功能

ERC20标准通过一组预定义的接口(Interface)明确了代币的六大核心功能,这些功能是调用ERC20合约的基础:

  • 总供应量查询(totalSupply):返回代币的总发行量,单位为代币的最小精度(通常为18位小数)。
  • 账户余额查询(balanceOf):输入用户地址,返回该地址持有的代币数量。
  • 代币转账(transfer):用户通过私钥签名,向指定地址转移代币,需满足调用者账户余额充足的条件。
  • 授权转账(approve/transferFrom):核心的“第三方支付”机制:approve允许授权方(owner)授权某地址(spender)动用其一定额度的代币;transferFrom则允许spender从owner账户划转已授权的代币,常用于交易所充值、DeFi借贷等场景。
  • 授权额度查询(allowance):查询owner对spender的剩余授权额度。

Web3调用ERC20的典型场景与代码实践

在Web3开发中,调用ERC20代币通常通过 ethers.js(以太坊主流JavaScript库)或web3.py(Python库)实现,以ethers.js为例,以下是关键操作的代码示例:

连接ERC20合约

首先需获取代币的合约地址(如USDT主网地址:0xdAC17F958D2ee523a2206206994597C13D831ec7)和ABI(应用程序二进制接口,ERC20标准ABI可在以太坊官方文档中获取):

const { ethers } = require("ethers");
const USDT_ABI = [/* ERC20标准ABI数组 */]; // 包含totalSupply、balanceOf、transfer等方法定义
const USDT_ADDRESS = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
// 创建Provider(连接以太坊节点)和Signer(交易签名者)
const provider = new ethers.providers.JsonRpcProvider("https://mainnet.infura.io/v3/YOUR_INFURA_ID");
const signer = provider.getSigner(); // 默认第一个账户,需导入私钥或连接钱包
// 实例化ERC20合约
const usdtContract = new ethers.Contract(USDT_ADDRESS, USDT_ABI, signer);

常见操作调用

  • 查询余额

    const address = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; // 查询该地址的USDT余额
    const balance = await usdtContract.balanceOf(address);
    console.log(`Balance: ${ethers.utils.formatUnits(balance, 18)} USDT`); // 18为代币精度
  • 授权代币
    假设用户授权交易所地址0xExchangeAddress动用1000 USDT:

    const tx = await usdtContract.approve("0xExchangeAddress", ethers.utils.parseUnits("1000", 18));
    await tx.wait(); // 等待交易上链
    console.log("Approval successful!");
  • 随机配图