Ethers极简入门:如何识别ERC20合约

Ethers极简入门:如何识别ERC20合约

WTF-Ethers 我最近在重新学ethers.js,巩固一下细节,也写一个“WTF Ethers.js极简入门”,供小白们使用,每周更新1-3讲。Now supports English! 官网: https://wtf.academy WTF-Ethers 项目地址: https://gitcode.com/gh_mirrors/wt/WTF-Ethers

前言

在区块链开发中,ERC20是最常见的代币标准之一。本文将介绍如何使用ethers.js库来识别一个合约是否符合ERC20标准。这项技能在链上分析、代币监控和安全审计等场景中都非常实用。

ERC20标准回顾

ERC20是区块链上最广泛采用的代币标准,它定义了一套基本接口,包括:

  • 6个核心函数:

    • totalSupply() - 获取代币总供应量
    • balanceOf(address) - 查询地址余额
    • transfer(address,uint256) - 转账
    • allowance(address,address) - 查询授权额度
    • approve(address,uint256) - 授权
    • transferFrom(address,address,uint256) - 从授权账户转账
  • 2个事件:

    • Transfer - 转账事件
    • Approval - 授权事件

识别ERC20合约的原理

由于ERC20标准早于ERC165标准,我们无法使用ERC165的接口检测方法。取而代之的是通过分析合约字节码来识别:

  1. 获取合约字节码:使用provider的getCode()方法
  2. 检查关键函数选择器:在字节码中搜索特定函数的选择器

为什么选择这两个函数?

我们主要检查两个函数的选择器:

  1. transfer(address,uint256) - 选择器为a9059cbb

    • 这是ERC20独有的函数,其他代币标准如ERC721、ERC1155都没有这个函数
  2. totalSupply() - 选择器为18160ddd

    • 作为辅助检查,防止选择器碰撞(随机字节码可能包含特定4字节的选择器)

实现代码

async function erc20Checker(addr) {
    // 获取合约bytecode
    let code = await provider.getCode(addr)
    
    // 非合约地址的bytecode是0x
    if(code != "0x") {
        // 检查bytecode中是否包含transfer和totalSupply函数的选择器
        if(code.includes("a9059cbb") && code.includes("18160ddd")) {
            return true  // 是ERC20合约
        } else {
            return false // 不是ERC20合约
        }
    } else {
        return null; // 不是合约地址
    }
}

实际测试

我们使用DAI(ERC20)和BAYC(ERC721)两个知名合约进行测试:

// DAI地址(主网)
const daiAddr = "0x6b175474e89094c44da98b954eedeac495271d0f"
// BAYC地址(主网)
const baycAddr = "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d"

const main = async () => {
    // 检查DAI合约
    let isDaiERC20 = await erc20Checker(daiAddr)
    console.log(`1. DAI是ERC20合约吗: ${isDaiERC20}`)

    // 检查BAYC合约
    let isBaycERC20 = await erc20Checker(baycAddr)
    console.log(`2. BAYC是ERC20合约吗: ${isBaycERC20}`)
}

main()

测试结果应该显示DAI被正确识别为ERC20合约,而BAYC则不是。

应用场景

这种识别方法可以应用于:

  1. 代币监控:自动识别新部署的代币合约
  2. 安全审计:检测可疑合约是否伪装成ERC20
  3. 数据分析:统计链上ERC20合约的数量和分布
  4. 交易策略:在抢开盘等场景中快速识别目标合约

注意事项

  1. 这种方法只能识别标准的ERC20合约,对于非标准实现可能失效
  2. 某些合约可能同时实现多个标准(如ERC20和ERC721)
  3. 合约升级可能导致识别结果变化

总结

通过分析合约字节码中的函数选择器,我们可以有效地识别ERC20合约。这种方法简单直接,适用于大多数场景。理解这一技术将为你进行链上分析和智能合约交互提供有力工具。

WTF-Ethers 我最近在重新学ethers.js,巩固一下细节,也写一个“WTF Ethers.js极简入门”,供小白们使用,每周更新1-3讲。Now supports English! 官网: https://wtf.academy WTF-Ethers 项目地址: https://gitcode.com/gh_mirrors/wt/WTF-Ethers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宣昀芊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值