【收藏向】一文弄懂什么是ERC20

2023-11-15

【本文只做技术探讨,谨防数字加密货币炒作风险。】

Token

Token,即通证,是以数字形式存在的权益凭证,它代表的是一种权利,一种固有和内在的价值。货币、积分、股票等权益证明,都可以由通证来代表。它代表着数字资产。下图就是在 opensea 上售卖的一些数字资产,这些资产也是通证。

image-20211116220121379

试想,如果这样的一些通证没有标准化,就只能在自己的体系内流通。通证的标准协议是数字资产上链的关键,它定义了不同的通证资产接口,从而可以对不同类型的资产进行交易和交换。

什么是 ERC20?

ERC20 就是以太坊生态中的通证(token) 标准,允许任何实现该标准的且通过智能合约实现的通证从钱包到去中心化的交易所能够被复用。

举个例子,在以前,公司发行的积分,往往只能够在内部使用,仅代表公司生态内部的权益。而有了通证就不一样了。公司发行通证,对于公司来说,可以分配通证来进行融资,上交易所(类似于上市),激励用户使用公司产品等;对于持有人来说,根据通证持有占比分红,持有的通证可以任意交换,低买高卖赚取差价等。ERC20 为通证的发行、流通提供了统一的标准,以相同的方法发行、交易、交换通证,而不用关心这个通证的发行方将它用来做什么(这取决于发行方)以及怎么实现通证。

任何智能合约只要符合 ERC20 标准,就可以通过 ERC20 标准接口进行操作。这也意味着符合 ERC20 标准的合约 A,名字为 Token A,符号为 A,合约地址为 0x000..0a,合约 B,名字为 Token B,符号为 B,合约地址为 0x000..0b;A、B 都是 ERC20 通证,转移通证 A 与转移通证 B 在操作上对于用户来说没有任何区别,与下图的操作类似。

image-20211117002826777

值得注意的是,任何人都可以发行一个与合约 A,名字、符号相同的符合 ERC20 标准的合约 C,来冒充合约 A,但合约 C 与合约 A 相比,合约地址是不同的,因此建议在交易时通过合约地址来区分 A、B,而不是简单的通过名字、符号区分。

下图是某交易所中的交易页面,其中所有的通证都是 ERC20 通证,符合 ERC20 标准,但都有各自的合约地址,并且可以类似股票一样交易。

image-20211116222745925

类似的信息也可以在 etherscan 中查看

image-20211116223750926

EIPs 中的定义

EIPs(Ethereum Improvement Proposals),以太坊改进提案,ERC20 便是 EIPs 中的一个标准。

ERC20 标准允许在智能合约中实现通证的标准API。该标准提供了转移通证的基本功能,并允许通证被批准,以便其他链上第三方可以使用它们。

下面是智能合约的接口定义。

pragma solidity ^0.8.0;

/**
 * @dev EIP中定义的ERC20标准接口.
 */
interface IERC20 {
    /**
     * @dev 返回存在的通证数量
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev 返回`account`拥有的通证数量
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev  从调用者的账户向`recipient`转移`amount`数量的通证
     *
     * 返回布尔值来指出操作是否成功
     *
     * 发出一个 {Transfer} 事件.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev 返回' spender '将被允许通过{transferFrom}代表' owner '
     * 消费的通证的剩余数量。默认为零。
     *
     * 当 {approve} 或者 {transferFrom} 被调用的时候,这个值会随之改变
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev 允许`spender`花费`amount`数量的调用者的通证
     *
     * 返回布尔值来指出操作是否成功
     * 发出一个 {Approval} 事件
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev 使用批准机制,从 `sender` 账户中转移 `amount` 数量的通证到 `recipient` 账户
     * 并从调用者被批准花费的数额中扣除 `amount` 数量
     *
     * 返回布尔值来指出操作是否成功
     *
     * 发出一个 {Transfer} 事件
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev 当通证从一个账户 `from` 转移至另一个账户 `to` 时,发出该事件。
     *
     * 注意 `value` 可能是 0
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev 当通过 {approve},新的批准花费的值被设置的时候,发出该事件。
     * `value` 是新批准花费的值。
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev 返回通证的名字
     */
    function name() external view returns (string memory);

    /**
     * @dev 返回通证的符号
     */
    function symbol() external view returns (string memory);

    /**
     * @dev 返回通证的小数位
     */
    function decimals() external view returns (uint8);
}

注意,IERC20Metadata 中定义的接口是可选的,但在实践中往往都会实现。以 UNI 为例,它的名字是 Uniswap,符号是 UNI,小数位为 18。

一般而言,有两个 Transfer 事件比较特殊,需要注意一下。一个是在铸币(mint)时触发,由于是凭空产生,所以 from 被指定为 0x0000000000000000000000000000000000000000 地址;一个是在销毁时触发,to 被指定为 0x0000000000000000000000000000000000000000 地址,而销毁时的 to 地址采用 0x00...0 地址是为了便于统计销毁数据的约定做法,如果 to 地址是一个任何人都没有对应私钥的地址,仍然属于销毁,但这很难统计。

在 etherscan 中的 ERC20

以 BNB 为例,我们在 etherscan 中找到 BNB,并打开。

image-20211116230240090

看一下它的概览页,其中 Max Total Supply 来自于接口 totalSupply,Decimals 来自于接口 decimals

image-20211116230336021

也可以点开 Transfers 查看转账记录,它就是通过 Transfer 事件查询得到的,假如你将你的 BNB 转移给某个人,你也能够通过交易哈希在这上面找到。

image-20211116231924840

更可以方便的通过 contract 页面调用智能合约。

image-20211116232225555

可以通过这个功能查看通证供应量,只需要轻轻点击 totalSupply 。

image-20211116232304820

我们可以通过在右上角搜索框填入 0x0000000000000000000000000000000000000000 地址来作为过滤条件,过滤 Transfer 事件,以此来查看历史上的铸币/销毁事件。以 USDT 为例:

image-20211116233512477

钱包中的 ERC20

以在 MetaMask 中使用 BNB 为例,上面的 etherscan 的 BNB 页面中可以获取到 BNB 合约的地址 0xB8c77482e45F1F44dE1745F52C74426C631bDD52,确认自己的 MetaMask 连接向 Ethereum Mainnet。

image-20211117003927055

点击下方的 import tokens,将 BNB 合约地址粘贴进去,会自动获取 BNB 的相关信息,此时可以再次确认,确保没有倒入错误,点击 Add Custom Token 即可添加 BNB 到 MetaMask 中。

image-20211117004057574

添加后,将出现在你的资产列表中。

image-20211117004249967

点击资产列表中的 BNB,你就可以选择发送一些 BNB 给其他人了!

image-20211117004347938

引用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【收藏向】一文弄懂什么是ERC20 的相关文章

  • Xss练习(level11/12/13/16/17/18)

    本文为学习笔记 仅限学习交流 不得利用 从事危害国家或人民安全 荣誉和利益等活动 level11 查看源代码 尝试 利用BP抓包 改包 构造语句 注意闭合 level12 尝试BP抓包 改包 type test nclick alert 1
  • vue中style设置scoped后部分样式不生效

    因为用了elementUI的组件库 一个页面用到了el dialog 需要改一下样式 但
  • UDP用户数据报协议分析

    简介 UDP User Datagram Protocol 即用户数据报协议 在网络中它与TCP协议一样用于处理数据包 是一种无连接的协议 在OSI模型中 在第四层 传输层 处于IP协议的上一层 UDP用来支持那些需要在计算机之间传输数据的

随机推荐

  • vue通过uniapp打包运行页面空白(Failed to load resource)

    vue调试时候 真机打开url和mac电脑打开都正常 然后npm run build 在移植到uniapp项目里打包apk ipa传到手机运行页面空白 打开safari浏览器 查看ipa文件包的页面 发现报了Failed to load r
  • 【重磅整理】180篇NIPS-2020顶会《强化学习领域》Accept论文大全

    深度强化学习实验室 作者 DeepRL Lab AMiner cn 联合发布 来源 https neurips cc Conferences 2020 编辑 DeepRL 图片来自新智元 NeurIPS终于放榜 提交数再次创新高 与去年相比
  • Linux-C基础之输入输出函数

    一 输出 一 数据输出 C语言无I O语句 I O操作由函数实现 include
  • 搭建个人的第一个服务器以及域名申请和绑定--阿里云服务器

    在大学阶段 购买并搭建了自己的第一个服务器 心情激动无比 写下本片博文记录购买并搭建服务器的全过程 方便自己以后在服务器方面进行更加深入的学习 阿里云和腾讯的服务器都有学生价 价格都是一折左右 真心实惠 本人因为学习的Java 所以偏向于阿
  • 12.荔枝派 zero(全志V3S)-使用新版本的buildroot

    上面是我的微信和QQ群 欢迎新朋友的加入 1 下载新版buildroot 我下载了19年2月份发布的buildroot 2 文件系统配置 make menuconfig 设置target option 设置编译链 其中Toolchain p
  • nginx实现动静分离

    nginx实现动静分离 1 什么是动静分离 2 nginx反向代理与负载均衡 3 nginx实现负载均衡 4 nginx实现动静分离 1 什么是动静分离 动静分离主要是通过nginx PHP FPM来实现 其中nginx处理图片 html等
  • 89C51七段数码管显示“12345678”

    1 延时模块 void Delay ms unsigned int xms 11 0592MHz延时模块 unsigned char i j while xms nop i 2 j 199 do while j while i 2 显示模块
  • linux + gitee配置教程

    用gitee管理小红迟早50迈的项目 上手教程 1 git安装 sudo apt get update sudo apt get install git 检查一下git版本 看看是否安装成功 git version 2 git配置 下面两行
  • 该用什么软件分割音频?这些软件可以帮助你分割音频

    大家都知道想要制作一个好的视频是需要进行后期各种剪辑的 不仅视频需要后期剪辑 其实音频也是需要剪辑的 比如合并音频 裁剪音频片段 调整音频的速度 分割音频等等 那么这个时候挑选一款合适的音频剪辑软件就很重要了 今天我整理了一些简单好用的音频
  • Strapi之Entity Service API

    Query Engine API 和 Entity Service API 都是 Strapi 平台提供的 API 但是它们的功能和用途有所不同 Entity Service API 主要用于管理实体对象的创建 读取 更新和删除操作 它是对
  • Vue.js学习记录-4-Vue基础:条件渲染 +列表渲染

    4 条件渲染 根据条件进行元素展示 v if v if v else if 2 1 0新增 v else三大指令必须紧贴使用 否则指令将不被识别 指令举例 div This is A div div This is B div div Th
  • P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib【普及】

    USACO1 5 特殊的质数肋骨 Superprime Rib 题目描述 农民约翰的母牛总是产生最好的肋骨 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们 农民约翰确定他卖给买方的是真正的质数肋骨 是因为从右边开始切下肋骨 每次
  • sklearn机器学习:高斯朴素贝叶斯GaussianNB

    认识高斯朴素贝叶斯 class sklearn naive bayes GaussianNB priors None var smoothing 1e 09 如果Xi是连续值 通常Xi的先验概率为高斯分布 也就是正态分布 即在样本类别Ck中
  • 让生活充满快乐

    文章目录 一 效果图以及素材 二 制作步骤 一 效果图以及素材 效果图 素材 二 制作步骤 打开素材 拷贝一份 找到滤镜 camera Raw滤镜 拷贝一份 ctrl t 自由变换 逆时间90度 确定 不透明度调50方便查看效果 多边形工具
  • 处理大并发之四 libevent demo详细分析(对比epoll)

    处理大并发之四 libevent demo详细分析 对比epoll libevent默认情况下是单线程 每个线程有且仅有一个event base 对应一个struct event base结构体 以及赋予其上的事件管理器 用来安排托管给它的
  • html获得url参数

    得到url搜索串 function getURLSearch isParent var strSearch if isParent strSearch window parent location search else strSearch
  • 工厂模式+策略模式的使用

    项目中会有这样的情形 通过某个参数进入不同的if分支 但是if分支太多就会导致项目难以维护 可读性也会降低 如下情形 public class Test public static void main String args String
  • git push提交报错文件过大,且去掉大文件也报同样的错误(转)

    错误原因 大文件存在没有被提交的commit记录里面 解决方案 删除有大文件的commit记录即可移除大文件的正确姿势 git rm cached giant file 文件名 Stage our giant file for remova
  • 三种常见的卷积概述(线性卷积周期卷积圆周卷积)

    note 2020 07 26搬运 下面的内容来自我的公众号 yhm同学 upd 2020 10 18 推荐学习辅助用书 江志红的 深入浅出数字信号处理 有别于学院派的教材 这本书讲得比较易懂清楚 upd 2020 10 18 数字信号处理
  • 【收藏向】一文弄懂什么是ERC20

    本文只做技术探讨 谨防数字加密货币炒作风险 Token Token 即通证 是以数字形式存在的权益凭证 它代表的是一种权利 一种固有和内在的价值 货币 积分 股票等权益证明 都可以由通证来代表 它代表着数字资产 下图就是在 opensea