tokenpocket下载app|链名称是什么erc20

作者: tokenpocket下载app
2024-03-16 05:15:59

ERC20 钱包 - 保护您的 ERC20 (ERC20) 资产 | Ledger

ERC20 钱包 - 保护您的 ERC20 (ERC20) 资产 | Ledger

抓住比特币的涨势。 即刻入手比特币版 Ledger 硬件钱包

在此购买

Our Website now exists in . Do you want to change languages?

Yes, please

No, I'm good

You can revert to English at any time by clicking on the language menu on the top right corner of the page.

产品

Ledger Stax

Ledger Nano X

Ledger Nano S Plus

比较我们的设备

套装

配件

品牌合作

查看所有产品

下载 Ledger Live

已支持的币种

应用程序和服务

Ledger Live

Ledger Recover

CL 卡

支持的服务

加密货币价格

学习

Ledger 学院

学而赚取

课堂

博客

什么是加密钱包

如何购买

如何互换

如何质押

企业

Ledger 企业解决方案

Ledger 合作伙伴

Ledger 联名合作

Ledger 开发

支持

简体中文

العربية

Français

Deutsch

Русский

Español

日本語

한국어

Türkçe

Português

ERC20 钱包

保护您的 ERC20 资产

使用最受信任的硬件钱包来保护您的 ERC20 资产。 冷存储钱包通常是加密设备,可离线存储用户的 ERC20 资产,提供一层安全保护,以抵御因连接至互联网而出现的不断演变的威胁。

一流的 安全性

简单

多币种

探索我们的钱包

了解如何使用 Ledger Live 管理 ERC20

保护您的 ERC20 (ERC20)

使用 Ledger 硬件钱包保护多种资产,包括 ERC20。认证安全芯片安全存储着访问您加密资产的私钥。

Ledger Nano S

使用市场上首款也是唯一一款经独立认证的硬件钱包来保护您的 ERC20 资产。

了解更多

Ledger Nano X

Ledger Nano X 是一款支持蓝牙、安全且荣获 CES 大奖的设备保护您的 ERC20 资产

了解更多

如何管理您的 ERC20 (ERC20)

Ledger Live

通过我们自己的桌面和手机应用程序 Ledger Live 直接管理您的 ERC20 代币。 直接通过 Ledger Live 实时查看余额以及收发 ERC20 代币等 5500 余种资产。

了解如何使用 Ledger Live 管理 ERC20

深受社区赞赏

Maria R.

我认为 Ledger 钱包是安全保护加密货币的最佳解决方案。

Dennis G.

安心是质量的标准。

Walter F.

买了 3 台 nano-s。一切都好。产品好,送货快。感谢!

Antonio B.

很棒的设备,我 100% 推荐,做你自己的银行!!!!!!

查看更多

什么是 ERC20 (ERC20)

ERC20 是一个协议标准,它定义了在以太坊网络上发行代币的具体规则和标准。 在以太坊区块链上发行的大多数代币都符合 ERC-20。 它允许将一种代币与另一种代币进行交易。

ERC20 (ERC20) 功能

ERC-20(以太坊意见征求)是一项正式的以太坊改进提案,已作为公共区块链上的智能合约代币标准予以采纳。 ERC-20 最初由开发人员 Fabian Vogelsteller 提出,目前已扩张至包含一系列功能,如支持 2017 年的 ICO 募资方法和 ICO 热潮,强调公共网络中标准化协议的潜力等。

概括而言,以太坊是一个公共区块链网络,用于使用智能合约开发去中心化应用程序 (DApp),其中智能合约采用编程语言 Solidity 编写。 以太坊的原生加密货币称为以太币 (ETH),用于在网络上转移价值并支付 Gas 费用,这些费用需要覆盖整个网络的计算成本并阻止垃圾邮件。

然而,网络上智能合约的存在(表面上是自主账户和计算机程序)在以太坊中启用了一套比特币中未提供的全新功能。 以太坊是一个图灵完备性平台,这意味着几乎任何逻辑均可通过编程写入网络上的应用程序中。 智能合约是在网络上自动执行各项功能的账户,共同达成更广泛用途的一组智能合约将形成 DApp(去中心化应用程序)。

为便于沟通,同时简化可互操作的功能性 DApp 和智能合约的开发,创建了一个标准化的代币智能合约框架。 此框架中最引人注目的便是 ERC-20。

ERC-20 是一种用于在以太坊上创建、发行和管理可替代代币的标准化格式。 这些代币具有不同的用例和应用程序(如实用型代币),且由开发人员以 ERC-20 作为参考创建。 该标准提供了用于传输 ERC-20 代币以及与 ERC-20 代币交互的基本格式,随后各种钱包使用此类格式来支持代币的存储、传输和管理。

标准化促进了快速创新且强调互联网的设计。

借助 ERC-20,项目可以轻松创建和发行代币,以在各种 DApp 中用作激励结构或筹款工具。 值得注意的是,ERC-20 是首次代币发行 (ICO) 的基础,其中 ICO 是一种直接以加密货币形式筹集资金来为项目注资的工具,如以太坊上的 DApp。 ICO 在 2018 年筹集了 63 亿美元,独特的众筹方法将用户和投资者直接与项目对接。

ERC-20 代币设计为可替代代币,这意味着每个代币单位都与下一个等值。 例如,使用 Maker DAO ERC20,1 MKR 在价值上总是等价于 1 MKR。

ERC-20 的标准化技术格式和不断扩张的网络效应相结合,使该标准在以太坊上得到广泛采用。 网络上的大多数代币都兼容 ERC-20,且可以在网络上无缝兑换和转移。 您在币聚合网站上找到的大多数与以太坊相关的代币均为 ERC-20 代币,如 Maker、Dai 和 Augur REP。

重要的一点是,ERC-20 代币在加密货币领域引发了有关标准化协议和合约所充当角色的更广泛对话,目的是提高创新和互操作性。 区块链的发展目标是能够在彼此间传输价值和数据,因此协议的标准化成为讨论的核心。

除了以太坊上的 ERC-20 之外,还出现了其他几个标准(即 ERC-721),它们分别专注于不同类型的代币,如非同质化代币。 这些非同质化代币旨在代表独特的数字资产,如虚拟猫,随着《迷恋猫》的兴起,虚拟猫成为非同质化代币可实现内容的最佳示例。

ERC-20 的总体影响是以太坊上资产、DApp 和创新(即 DeFi)生态系统的长足发展。 ERC-20 作为代币标准的流行程度揭示了将标准化进一步扩张到公共区块链的潜在可能,而该行业才刚刚开始加足马力。

请记住,ERC-20 代币虽然建立在以太坊上,但和 DApp 一样是存在于网络生态系统中的代币,这一点很重要。

支持的加密货币

直接使用 Ledger Live 安全管理 种币和 ERC20 代币。 更多使用外部钱包。

VET

VeChain

币安币(BNB)

币安币

TRX

波场(Tron)

LINK

ChainLink

EOS

EOS

联系我们

可以在我们的博客查看公告。 媒体联系: [email protected]

订阅我们的 简报

在收件箱中直接查看支持的新币种、博客更新以及专属优惠

输入您的电子邮件地址

注册订阅新闻简报

您的电子邮件地址将仅用于向您发送我们的简报,以及更新和优惠信息。您可通过简报中的链接随时取消订阅。

详细了解我们如何管理您的数据和您的权利。

简体中文

العربية

Français

Deutsch

Русский

Español

日本語

한국어

Türkçe

Português

版权所有 © Ledger SAS。 保留所有权利。 Ledger、Ledger Stax、Ledger Nano S、Ledger Vault、Bolos 是 Ledger SAS 拥有的商标。

1 rue du Mail, 75002 Paris, France

付款方式

 

 

 

 

 

 

 

产品Ledger Stax

Ledger Nano X

Ledger Nano S Plus

比较我们的设备

捆绑销售

配件

所有产品

下载

加密资产比特币钱包

以太坊钱包

卡尔达诺钱包

瑞波币钱包

门罗币钱包

泰达币钱包

查看所有资产

加密服务加密货币价格

买入加密货币

权益质押

互换加密货币

企业Ledger 企业解决方案

对于初创公司来自 Ledger Cathay Capital 的资金

开发者开发者门户

使用入门开始使用 Ledger 设备

兼容的钱包和服务

如何购买比特币

比特币购买指南

比特币硬件钱包

其他链接支持

赏金计划

转销商

Ledger 媒体资料包

联署营销

状态

合作伙伴

职场加入我们

全部职位

简介我们的愿景

Ledger 学院

公司

人员

多样性

博客

法律销售条款与条件

网站使用条款

Ledger Live 使用条款

隐私政策

Cookie 政策

Ledger 保修

免责声明

其他

USDT充币提币ERC20、TRC20、Omni如何选择?有啥区别? - 知乎

USDT充币提币ERC20、TRC20、Omni如何选择?有啥区别? - 知乎切换模式写文章登录/注册USDT充币提币ERC20、TRC20、Omni如何选择?有啥区别?usdt区块链是现在,区块链是未来。在充提USDT的时候,投资者发现有3个不同的链类型供选择,分别是ERC20、TRC20和Omni,而大多数投资者就卡在这里了,在三者之间不知道该如何选择,甚至都不了解这三者是什么,简单点说ERC20是以太坊区块链的链类型,TRC20是波场区块链的链类型,而Omni是比特币区块链网络的链类型。USDT充币提币ERC20、TRC20、Omni如何选择?除了地址不同之外,选择不同的链类型,转转账的速度和手续费也是不一样的。如果你希望可以快速转账,追求的是速度,那就应该选择波场区块链的TRC20链类型。波场网络TPS达到1500TPS,目前来说转账最快到账的是波场USDT。如果你在意的是手续费,希望转账手续费能低一些,那也应该选择TRC20链类型。因为TRC20链类型转账,手续费为0。而ERC20链类型的手续费是2USDT,大概是14块钱。OMIN链类型手续费最贵,需要5个USDT,大概是35人民币。但是如果你希望转账能安全一点,那就选择比特币网络的OMIN链类型,这个链类型虽然手续费高了一点,但是安全性好。贵,也是有道理的嘛。USDT充币提币ERC20、TRC20、Omni有啥区别?1、Omni-USDT的安全性最好,但转账速度太慢。要是你有不着急交易的大额订单,可以优先选择Omni-USDT。2014年,USDT于比特币网络上诞生,于2015年2月正式上线几大主流交易所。在2018年之前,USDT的转账路径只有一条,那就是基于比特币网络的Omni-USDT。Omni-USDT存储在比特币地址上,因此每次转账的时候,需要支付比特币作为矿工手续费。Omni-USDT于比特币网络的链上,黑客攻击的成本很高,所以资产相对安全性较高。但是其交易速度非常慢,已经无法满足当今加密交易市场的需求,但很多大宗交易还是会倾向于Omni-USDT。2、ERC20-USDT的安全性和转账速度居中。适用于数字货币市场的频繁交易。要是你经常做短线交易,可以优先选择ERC20-USDT。2018年,以太坊网络开始流行,在区块链应用也大面积展开,ERC20-USDT出现。和Omni-USDT一样,使用ERC20-USDT同样需要支付旷工费,但转账速度有了显著的提升。由于安全性好、转账速度快,ERC20-USDT被市场广泛接受,USDT的发行者泰达公司也开始支持更高效的以太坊ERC20。由于综合指数比较高,在主流交易平台比较受欢迎。3、TRC20-USDT的转账速度最快,而且链上转账无需手续费,但安全性比较低。适合需要快速到账的朋友,建议小额为主,现在一次转账一般都只需要几分钟时间。2019年,泰达公司宣布在波场上发行了基于TRC-20协议的USDT,TRC20-USDT诞生。发行时承诺完全公开透明,零转账费,秒级到账。和前两者不同的是,目前TRC20-USDT转账是不收取手续费的。ERC20、TRC20、Omni这三种类型的USDT在交易所内并没有差别,但在链上是不互通的,也就是说Omni上的USDT是无法转到另外两条链上的,所以在交易所充提USDT时一定要留意地址种类。发布于 2021-03-15 14:34比特币 (Bitcoin)USDT比特币合约​赞同 136​​30 条评论​分享​喜欢​收藏​申请

区块链100讲:如何理解ERC20代币合约 - 知乎

区块链100讲:如何理解ERC20代币合约 - 知乎首发于HiBlock区块链社区切换模式写文章登录/注册区块链100讲:如何理解ERC20代币合约yaoyao路是什么,走着走着就知道了前面我们大致介绍了几种ERC协议,其中ERC20代币合约可以说在发币中算是听到非常多的一个名词了,说到发币都会想到这个合约。本文我们就详细介绍如何理解ERC20代币合约。有关ERC20标准可以参考官方文档(https://theethereum.wiki/w/index.php/ERC20_Token_Standard),可以说比较抽象,使用Solidity描述的ERC20的接口。ERC-20最初作为一种尝试,旨在为以太坊(Ethereum)上的token合约提供一个特征与接口的共同标准,并且,它现在已经被证明是非常成功的了。ERC-20有很多好处,包括允许钱包显示数以百计不同token的账户余额;创建一个交易工具,只需提供token合约的地址就可以将更多token列入表中。创建ERC-20兼容token的好处很多,以至于在今天,很少有其他token合约用其他方式创建。1什么是代币(token)合约目前依旧有“代币(token)合约到底是什么”的争论。本质上来说,一个代币合约就是一个包含了一个对账户地址及其余额的映射的智能合约。账户余额表示一种由合约创建者定义的值:一个代币合约也许使用余额来表示物理对象,或是表示另一种货币价值,还可以表示持有人的名望。余额的单位通常被称为token。代币余额的地址列表当token从一个账户被转移到另一个账户的时候,代币合约更新两个账户的余额。例如,从 0x2299…3ab7 转移到 0x1f59…3492 10个token将导致余额列表如下图所示进行更新:从0x2299…3ab7 发送10枚token给 0x1f59…3492; 变化部分用红色标出如果该token合约允许的话,改变token总体数量有两种方案。token的总数可以通过铸造新token来增加。举个例子,铸造出100个token到地址 0x4ba5…ae22 余额变更如下图所示:铸造100枚token给0x4ba5…ae22; 变化部分用红色标出也可以通过“销毁”减少token总量,比如,0x4919…413d 销毁50枚token将导致余额如下方式变化:销毁 0x4919…413d 上的50枚token; 变化部分用红色标出销毁token的另一种方式是将token发送到一个未创建私钥的地址,通常来说就是0地址。这会使得这些token不可用,在这方面,它与销毁token有同样的效果,但并没有减少token的总数。比如, 0x93f1…1b09 用此种方式销毁了50枚token将导致如下图所示的余额:0x93f1…1b09 发送50枚token到黑洞地址上; 变化部分用红色标出简单的代币合约在一个从地址到余额的映射中保存上述信息。当更多复杂的情景出现时,比如分红,替代性结构或者增补性结构往往更强一些。但是,不管操作上的细节的话,对外部可见的token余额总是像上面的图示那样的。2ERC20代币合约的定义ERC20 合约是通过合约的地址以及可用的token总数来定义的,但通常还提供一些可选项目,也是为用户提供更多细节。比如token的名字、符号、小数位等等。在深入了解之前,必须明确一点:代币合约没有中心化的登记处,因此无法保证特定名字和符号的唯一性。一旦你创建了一个代币合约,你应该申请将它加入公共站点,如Etherscan,MyEtherWallet 以及 CoinMarketCap。当然,确保符合网站上的说明,可以最大限度提高申请被接受的机会。代币合约的名字是代币的完整名称,比如“My token”。名字长度没有限制,但是太长的话在某些钱包应用中可能显示不完整,所以最好保持名字的简洁。代币合约的符号是代币的符号,比如“MYT”。大体相当于股票行情自动收录机。尽管没有长度限制,但通常都是三四个字符长度。小数位这个概念通常容易混淆,通过解释还是很容易理解的。小数位代表一个token的可分割程度,小数位可取值从0(完全不可分割)到18(几乎是连续的),甚至还可以更高。技术上讲,小数位的数字就是显示在屏幕上小数点后面跟着的数字。存在小数位的意义在于以太坊不处理小数,将所有的数字价值都当做整数处理。总发行量是ERC20代币合约最后定义的项,而且是唯一一个强制参数。尽管在ERC20标准中没有明确规定,但是定义总发行量十分简单:总发行量等于所有余额的总和。总发行量在上面的例子中已经给出,无须赘述。本文作者:HiBlock区块链技术布道群-冯宇 原文发布于简书 加微信baobaotalk_com,加入技术布道群以下是我们的社区介绍,欢迎各种合作、交流、学习:) 发布于 2018-08-24 00:06区块链(Blockchain)比特币 (Bitcoin)代币​赞同 1​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录HiBlock区块链社区HiBlock区块

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Error 403 Forbidden - This request is blocked.

For security reasons you can't connect to the server for this app or website at this time.

It maybe that you have too many requests or the illegal request payload is identified as an attack.

Please try again later.

什么是ERC20?以太坊代币标准指南

什么是ERC20?以太坊代币标准指南

产品

加密支付网关

彻底改变支付方式

加密钱包

保护数字资产

加密货币发票

轻松的计费解决方案

批量支付

简化批量传输

White Label

定制品牌解决方案

Donations

通过加密货币增强捐赠能力

连接

API

整合与创新

整合解决方案

优化的插件和库以实现平滑集成

学习

博客

见解和更新

常问问题

澄清您的疑问

帮助

支持与指导

公司

安全

保护您的数字资产

漏洞赏金

奖励安全研究

联系我们

寻求帮助

价钱

登录

报名

什么是ERC20?以太坊代币标准指南

发表于 Feb 8, 2024

分享到

ERC20 是在以太坊区块链上制定和部署智能合约的关键标准,是该生态系统中数字化代币的支柱。源于以太坊托管智能合约的能力——自动执行合约,协议条款直接写入代码行——ERC20 代币是以太坊功能的基石。这些代币支持创建各种去中心化应用程序 (dApp)和平台,从实用代币到去中心化金融 (DeFi)解决方案,所有这些都遵循 ERC20 准则以确保网络兼容性。以太坊是世界领先的可编程区块链,允许用户利用其技术铸造自己的代币,这些代币可以体现各种资产或权利,例如数字积分、公司股票,甚至法定货币的数字表示形式。 ERC20 标准概述了一组规则,确保这些代币在以太坊生态系统中无缝集成和运行,从而促进不同应用程序和服务之间的互操作性和功能。 ERC-20 是什么意思? ERC-20 标准是以太坊区块链上可替代代币创建的基石,由以太坊开发者Fabian Vogelsteller于 2015 年 11 月 19 日提出。该技术规范的正式名称为以太坊征求意见20 (ERC-20),为在以太坊生态系统中发行、创建和部署可互换代币奠定了基础。名称“ERC”表示开发人员建议增强区块链的方法,“20”标记专用于这套操作规则的具体提案编号。 Fungible token 的特点是能够在一对一的基础上无区别地进行交换,已广泛采用 ERC-20 标准,这表明它在以太坊网络上数十万个合约的扩散和运行中发挥着关键作用。该标准不仅促进了代币创建的统一方法,而且还通过为开发人员提供强大的框架来刺激以太坊平台的发展。 ERC-20 作为以太坊改进协议(称为 EIP-20)的认可和正式采用发生在 2017 年底。EIP-20 由 Vogelsteller 和以太坊联合创始人Vitalik Buterin共同撰写,EIP-20 的认可巩固了其作为重要协议的地位。以太坊区块链中的协议,支撑了大量可替代代币,这些代币已成为平台生态系统和更广泛的区块链社区不可或缺的一部分。 ERC-20 的工作原理ERC-20 标准为以太坊区块链上的加密代币功能制定了一个全面的框架,将操作分类为 getter、函数和事件,以确保生态系统内集成的一致性和易用性。 Getters 的目的是在不改变区块链状态的情况下检索和显示数据。 ERC-20 中概述的主要吸气剂包括:总供应量:此函数报告已发行的代币总数,提供对特定代币流通规模的深入了解。 Balance Of :返回特定账户的代币余额,让用户轻松验证其持有情况。津贴:这一独特功能促进了委托支出,其中一个账户可以授权另一个账户代表其支出指定的代币金额。例如,如果用户 A 授权用户 B 使用 50 个代币,则用户 B 可以使用这些代币进行交易,最多可达分配的金额,但不能超过。函数是面向操作的命令,可实现代币管理和传输:转账:这一核心功能用于将代币从一个账户转移到另一个账户,这是代币流通的一个基本方面。批准:它允许代币持有者指定另一个帐户的支出限额,从而实现以太坊网络内的自动支付和津贴等场景。转账来源:基于“批准”功能,允许第三方在批准的限额内在账户之间转移代币,从而简化涉及多方的交易。事件是智能合约发出的信号,表明已发生重大操作,提供透明度和可追溯性:转移事件:每当转移代币时都会触发该事件,该事件会记录交易,提供代币移动的可见性和验证。批准事件:当一个帐户批准另一个帐户花费特定代币金额时,会发出此事件,作为对委托权限的公开确认。除了核心功能之外,值得注意的是 ERC-20 在促进以太坊上去中心化应用程序 (dApp) 之间的互操作性方面的重要性。通过遵守一套标准化规则,ERC-20 代币可以轻松集成到钱包、交易所和其他 dApp 中,从而增强整个生态系统的流动性和实用性。此外,该标准为创新的金融应用程序和协议铺平了道路,通过支持从简单的转账到复杂的智能合约执行等广泛的交易,为去中心化金融(DeFi)的发展做出了重大贡献。作为其基础作用的证明,ERC-20 标准继续影响新代币标准和区块链技术的开发,突显其对以太坊区块链和更广泛的加密领域的关键影响。创建 ERC-20 代币ERC-20 代币通过在以太坊区块链上部署智能合约而存在。这些嵌入了自动执行代码的合约为代币创建和分配开辟了可能性领域,反映了传统金融机制的某些方面,但又具有创新性。一个说明性的场景涉及一个智能合约,旨在接受上限数量的以太坊,例如 10 ETH。收到 ETH 后,合约会激活其代币铸造功能,直接向贡献者的钱包发行预定义数量的代币(例如,每个 ETH 100 个代币)。这种机制可以有效地生成 100,000 个假设的“ABC”代币,并将它们分散给参与者以换取他们的以太坊贡献。这种方法类似于股票市场中首次公开募股(IPO)的概念,即公司向公众发行股票以换取投资资本。同样,智能合约的代币发行过程充当筹集资金的去中心化变体,投资者收到代币而不是股票。这种方法不仅通过消除中央机构实现投资民主化,而且还引入了一种在数字生态系统内资助项目和分配资产的新方式。除了筹款之外,ERC-20 代币标准还促进了各种应用程序,从在去中心化自治组织 (DAO)中授予投票权的治理代币到提供平台内服务访问权限的实用代币。智能合约的可编程特性允许实现限时释放、股息分配和自动奖励等创造性功能,通过灵活和创新的金融工具丰富生态系统。什么是天然气?在以太坊区块链生态系统中,“gas”表示用于量化进行交易或执行智能合约所需的计算量的计量单位。用“ gwei ”表示——以太坊原生加密货币以太币(ETH)的较小面额,通常等同于 nanoeth——气体充当将资源分配给以太坊虚拟机(EVM)的媒介。这种分配有利于去中心化应用程序的自主运行,包括以安全和去中心化的方式执行智能合约。天然气成本是通过供应和需求的动态相互作用来确定的,其中包括提供交易处理和智能合约执行所需计算能力的矿工,以及寻求这些处理能力的网络用户。如果提供的 Gas 价格未能符合其运营成本预期,矿工可以自行决定拒绝交易,从而建立一个 Gas 价格根据网络活动水平和矿工需求波动的市场。该机制通过防止垃圾邮件交易并将资源分配给那些愿意为计算服务支付市场价格的人来确保以太坊网络保持高效。它还强调了以太坊的去中心化性质,其中交易和智能合约的执行是通过平衡网络参与者的需求与矿工的运营能力的系统来激励的。 ERC-20 代币的种类ERC-20 代币通过提供通用且标准化的代币创建框架,彻底改变了以太坊区块链,支持跨不同领域的广泛应用。这些代币可以代表一切,从类似于公司股票的金融资产(在某些司法管辖区可能作为证券进行监管)到忠诚奖励和黄金或房地产等实物资产。例如,一些 ERC-20 代币的运作方式与公司股票类似,根据监管角度,其发行人可能需要承担特定的法律义务。另一些则在数字生态系统中提供创新的实用性,例如来自在线预订平台的忠诚度积分,可用于未来的服务或与其他人进行交易,从而在其原始背景之外增加一层价值和实用性。这种多功能性延伸到了像 Tether (USDT) 这样的稳定币,它们与现实世界的货币挂钩,并提供传统货币的数字对应物,并具有区块链技术的额外优势,例如易于转移和通过智能合约产生潜在收益。然而,用 ERC-20 代币代表物理对象或法定货币会带来挑战,特别是在维持数字到物理链接的准确性方面。例如,USDT 的价值与 Tether Limited 持有的美元挂钩,需要信任传统的审计方法以确保支持的存在,这凸显了数字领域和物理领域之间潜在的脱节。 ERC-20 代币的采用进一步体现在它们与各种应用程序的集成: 美元硬币 (USDC) 和 Tether (USDT) 等稳定币为加密市场提供了稳定性。治理代币,例如 Maker (MKR),可以参与去中心化决策。实用令牌授予对特定服务的访问权限,例如 Brave 浏览器中的基本注意令牌 (BAT) 。资产支持代币将数字代币与现实世界的资产联系起来,提供有形的价值。游戏内货币和Metaverse 平台利用 ERC-20 代币来管理虚拟经济并促进数字世界中的交易。去中心化金融 (DeFi)应用程序使用Aave (AAVE)等代币来实现治理和实用目的。成功的 ERC-20 代币,包括Uniswap (UNI) 、ApeCoin (APE)、 Wrapped Bitcoin (WBTC)和 Chainlink (LINK),展示了该标准的适应性及其在以太坊生态系统内促进创新方面的作用。这些代币具有多种功能,从促进数字社区内的去中心化交易和治理,到在DeFi应用程序中使用比特币,以及将智能合约与外部数据连接起来。 ERC-20 代币的广泛采用和成功凸显了促进整个以太坊网络兼容性和互操作性的统一标准的重要性。这种标准化对于使区块链技术超越那些具有深厚技术知识的人来说至关重要,为数字代币继续丰富数字世界和物理世界的未来铺平了道路。 ERC-20、ERC-721、ERC-1155以太坊区块链支持各种代币标准,每个标准旨在满足生态系统内的不同需求。除了众所周知的 ERC-20 标准之外,另外两个重要标准是 ERC-721 和 ERC-1155,它们扩展了可以在区块链上表示的资产的功能和类型。 ERC-20 设定了可替代代币的标准,这意味着每个代币在类型和价值上都与另一个代币相同,类似于传统加密货币的运作方式。该标准对于创建可互换且统一的数字货币至关重要。 ERC-721引入了不可替代代币(NFT)的概念,它们彼此不同并代表独特的资产。该标准通常用于数字收藏品和艺术品,可以对具有特定特征的单个物品进行标记化。 ERC-1155 被称为多代币标准,提供多功能智能合约接口,能够在单个合约中处理多种代币类型。这种创新方法允许 ERC-1155 代币封装 ERC-20 和 ERC-721 标准的功能,支持可替代和不可替代代币。这种灵活性使得 ERC-1155 对于需要混合可替代和不可替代资产的应用程序特别有用,例如游戏或去中心化金融。这些标准共同增强了以太坊生态系统托管广泛数字资产的能力,从可互换的货币代币到独特的数字收藏品和混合应用程序,展示了该平台的适应性和区块链领域的巨大创新潜力。 ERC-20 代币的优点和缺点ERC-20代币的优点互操作性:ERC-20 代币的一个突出特点是它们能够在以太坊生态系统中无缝交互,从而实现不同代币之间的轻松交换。这种互操作性支持从交易到项目融资的各种应用程序。增强的安全性:ERC-20 代币建立在以太坊区块链之上,受益于其强大的安全措施。不变性和去中心化等功能可防止操纵,确保代币完整性。定制灵活性:开发人员可以自由定制 ERC-20 代币以满足项目特定要求,包括代币供应、小数精度和独特功能。透明交易:以太坊区块链的透明度允许跟踪 ERC-20 代币变动,提供清晰的交易历史并增强参与者之间的信任。市场流动性:ERC-20代币以其流动性而闻名,这使其对投资者和交易者具有吸引力。在交易所买卖这些代币的便捷性有助于其受欢迎。用户友好:通过 MyEtherWallet 和 MetaMask 等工具促进 ERC-20 代币的可访问性,促进区块链社区内的广泛使用和创新。 ERC-20代币的缺点功能有限:尽管稳定,但 ERC-20 代币的标准化性质可能会限制复杂智能合约或自动化流程所需的高级功能,从而给需要更大多功能性的项目带来挑战。安全漏洞:ERC-20代币在继承以太坊安全特性的同时,也存在一些漏洞,包括易受智能合约漏洞和网络拥塞等影响,从而导致潜在的安全风险。可变汽油费:涉及 ERC-20 代币的交易会产生汽油费,该费用可能会随着网络拥塞而大幅波动,影响成本可预测性,并可能给小投资者带来负担。交易所兼容性问题:并非所有加密货币交易所都支持 ERC-20 代币,这可能会限制其流动性和投资者的交易选择。对兼容交易所的研究对于获得最佳交易体验至关重要。治理和透明度问题:治理不善和缺乏透明度可能会导致代币倾销和内幕交易等问题,从而损害投资者的信心和代币的可信度。无可否认,ERC-20 代币标准塑造了以太坊区块链的格局,提供了促进创新和参与的一系列好处。然而,它带来的挑战,包括安全问题和某些应用程序的有限功能,凸显了生态系统内持续开发和治理改进的重要性。

请注意,Plisio 还为您提供:

单击 2 次即可创建加密发票 and 接受加密捐赠

12 整合

BigCommerce

Ecwid

Magento

Opencart

osCommerce

PrestaShop

VirtueMart

WHMCS

WooCommerce

X-Cart

Zen Cart

Easy Digital Downloads

6 最流行的编程语言库

PHP 图书馆

Python 图书馆

React 图书馆

Vue 图书馆

NodeJS 图书馆

Android sdk 图书馆

19 加密货币和 12 区块链

Bitcoin (BTC)

Ethereum (ETH)

Ethereum Classic (ETC)

Tron (TRX)

Litecoin (LTC)

Dash (DASH)

DogeCoin (DOGE)

Zcash (ZEC)

Bitcoin Cash (BCH)

Tether (USDT) ERC20 and TRX20 and BEP-20

Shiba INU (SHIB) ERC-20

BitTorrent (BTT) TRC-20

Binance Coin(BNB) BEP-20

Binance USD (BUSD) BEP-20

USD Coin (USDC) ERC-20

TrueUSD (TUSD) ERC-20

Monero (XMR)

分享到

最新的文章

CoinSpot 评论:2024 年的详细信息、费用和功能

Mar 15, 2024

Dex Screener:2024 年如何使用

Mar 14, 2024

2024 年葡萄牙加密货币税收指南

Mar 13, 2024

什么是 Chainlink(LINK)?

Mar 13, 2024

Bybit 评论:优点、缺点和特点

Mar 12, 2024

2024 年如何兑现加密货币和比特币

Mar 12, 2024

美国国税局 (IRS) 能否在 2024 年追踪加密货币?

Mar 11, 2024

最佳 DeFi 交易所

Mar 11, 2024

dYdX 评论:优点、缺点和功能

Mar 10, 2024

托管钱包与非托管加密钱包

Mar 10, 2024

Exodus 钱包评论:2024 年的优点、缺点和功能

Mar 8, 2024

Kraken 评论:2024 年的优点、缺点和功能

Mar 8, 2024

加拿大加密货币税收指南(2024 年 CRA 规则)

Mar 7, 2024

Polymarket:去中心化预测市场如何运作

Mar 6, 2024

2024 年最佳 DeFi 加密货币

Mar 6, 2024

体育用品进入加密世界。轻松接受付款。

Mar 6, 2024

MEV Bot:以太坊套利分步手册

Mar 6, 2024

什么是闪电贷?

Mar 5, 2024

最佳区块链游戏公司

Mar 5, 2024

2024 年最佳白标 NFT 市场

Mar 4, 2024

产品

商业

个人的

价钱

批量支付

白色标签

发票

捐款

集成

资源

应用程序接口

博客

安全

漏洞赏金

常问问题

联系我们

政策

隐私政策

服务条款

跟着我们

简体中文

English

اَلْعَرَبِيَّةُ

Deutsch

ελληνικά

Español

فارسی

Français

हिन्दी

Bahasa Indonesia

Italiano

日本語

한국어

Polski

Português

Русский

ไทย

Türkçe

Українська

Tiếng Việt

简体中文

© 2024 Plisio, 公司。保留所有权利。

ERC20解读 | 登链社区 | 区块链技术社区

ERC20解读 | 登链社区 | 区块链技术社区

文章

问答

讲堂

专栏

集市

更多

提问

发表文章

活动

文档

招聘

发现

Toggle navigation

首页 (current)

文章

问答

讲堂

专栏

活动

招聘

文档

集市

搜索

登录/注册

ERC20解读

Confucian

更新于 2022-04-04 19:54

阅读 6963

对ERC20代币标准的个人解读

# ERC20解读

**参考 **[**OpenZepplin文档**](https://docs.openzeppelin.com/contracts/4.x/erc20)** 和 **[**以太坊官方开发者文档**](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/)**,结合自己的理解。**

博客的 Markdown 编辑器暂不支持 Solidity 语法高亮,为了更好阅读代码,可以去 [**我的GitHub仓库**](https://github.com/Blockchain-Engineer-Learning/Contract-Interpretation/tree/main/ERC20) 。

## **什么是ERC20**

**ERC20(Ethereum Request for Comments 20)一种代币标准。**[**EIP-20**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) 中提出。

**ERC20 代币合约跟踪同质化(可替代)代币:任何一个代币都完全等同于任何其他代币;没有任何代币具有与之相关的特殊权利或行为。这使得 ERC20 代币可用于交换货币、投票权、质押等媒介。**

## **为什么要遵守ERC20**

**EIP-20 中的动机:**

> **允许以太坊上的任何代币被其他应用程序(从钱包到去中心化交易所)重新使用的标准接口。**

**以太坊上的所有应用都默认支持 ERC20 ,如果你想自己发币,那么你的代码必须遵循 ERC20 标准,这样钱包(如MetaMask)等应用才能将你的币显示出来。**

## **代码实现**

**需要实现以下函数和事件:**

```

function name() public view returns (string)

function symbol() public view returns (string)

function decimals() public view returns (uint8)

function totalSupply() public view returns (uint256)

function balanceOf(address _owner) public view returns (uint256 balance)

function transfer(address _to, uint256 _value) public returns (bool success)

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

function approve(address _spender, uint256 _value) public returns (bool success)

function allowance(address _owner, address _spender) public view returns (uint256 remaining)

event Transfer(address indexed _from, address indexed _to, uint256 _value)

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

```

**使用 OpenZeppllin 提供的库能够轻松快速地构建 ERC20 Token 。**

### **快速构建**

**这是一个 GLD token 。**

```

// contracts/GLDToken.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract GLDToken is ERC20 {

constructor(uint256 initialSupply) ERC20("Gold", "GLD") {

_mint(msg.sender, initialSupply);

}

}

```

**通常,我们定义代币的发行量和代币名称及符号。**

### **IERC20**

**先来看下 ERC20 的接口(IERC20),这方便我们在开发中直接定义 ERC20 代币。**

**同样地,OpenZepplin 为我们提供了相应的库,方便开发者导入即用。**

```

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

```

****EIP 中定义的 ERC20 标准接口:****

```

pragma solidity ^0.8.0;

interface IERC20 {

event Transfer(address indexed from, address indexed to, uint256 value);

event Approval(address indexed owner, address indexed spender, uint256 value);

function totalSupply() external view returns (uint256);

function balanceOf(address account) external view returns (uint256);

function transfer(address to, uint256 amount) external returns (bool);

function allowance(address owner, address spender) external view returns (uint256);

function approve(address spender, uint256 amount) external returns (bool);

function transferFrom(

address from,

address to,

uint256 amount

) external returns (bool);

}

```

#### **逐一分析**

**函数:**

* `totalSupply()` :返回总共的代币数量。

* `balanceOf(address account)` :返回 `account` 地址拥有的代币数量。

* `transfer(address to, uint256 amount)` :将 **`amount`** 数量的代币发送给 **`to`** 地址,返回布尔值告知是否执行成功。触发 **`Transfer`** 事件。

* `allowance(address owner, address spender)` :返回授权花费者 **`spender`** 通过 **`transferFrom`** 代表所有者花费的剩余代币数量。默认情况下为零。当 **`approve`** 和 **`transferFrom`** 被调用时,值将改变。

* `approve(address spender, uint256 amount)` :授权 **`spender`** 可以花费 **`amount`** 数量的代币,返回布尔值告知是否执行成功。触发 **`Approval`** 事件。

* `transferFrom(address from, address to, uint256 amount)` :将 **`amount`** 数量的代币从 **`from`** 地址发送到 **`to`** 地址,返回布尔值告知是否执行成功。触发 **`Transfer`** 事件。

**事件(定义中的 **`indexed`** 便于查找过滤):**

* `Transfer(address from, address to, uint256 value)` :当代币被一个地址转移到另一个地址时触发。注意:转移的值可能是 0 。

* `Approval(address owner, address spender, uint256 value)` :当代币所有者授权别人使用代币时触发,即调用 **`approve`** 方法。

#### **元数据**

**一般除了上述必须实现的函数外,还有一些别的方法:**

* `name()` :返回代币名称

* `symbol()` :返回代币符号

* `decimals()` :返回代币小数点后位数

### **ERC20**

**来看下 ERC20 代币具体是怎么写的。**

**同样,OpenZepplin 提供了现成的合约代码:**

```

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

```

这里贴一个GitHub源码链接 [**OpenZepplin ERC20**](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)

#### **函数概览**

```

constructor(name_, symbol_)

name()

symbol()

decimals()

totalSupply()

balanceOf(account)

transfer(to, amount)

allowance(owner, spender)

approve(spender, amount)

transferFrom(from, to, amount)

increaseAllowance(spender, addedValue)

decreaseAllowance(spender, subtractedValue)

_transfer(from, to, amount)

_mint(account, amount)

_burn(account, amount)

_approve(owner, spender, amount)

_spendAllowance(owner, spender, amount)

_beforeTokenTransfer(from, to, amount)

_afterTokenTransfer(from, to, amount)

```

****事件(同 IERC20)****

```

Transfer(from, to, value)

Approval(owner, spender, value)

```

#### **逐一分析**

* `constructor(string name, string symbol)` :设定代币的名称和符号。**`decimals`** 默认是 18 ,要修改成不同的值你应该重载它。这两个值是不变的,只在构造时赋值一次。

* `name()` :返回代币的名称。

* `symbol()` :返回代币的符号,通常是名称的缩写。

* `decimals()` :返回小数点后位数,通常是 18 ,模仿 Ether 和 wei 。要更改就重写它。

`totalSupply()、balanceOf(address account)、transfer(address to, uint256 amount)、 allowance(address owner, address spender)、approve(address spender, uint256 amount)、transferFrom(address from, address to, uint256 amount)` 都参考 IERC20 。

* `increaseAllowance(address spender, uint256 addedValue)` :以原子的方式增加 **`spender`** 额度。返回布尔值告知是否执行成功,触发 **`Approval`** 事件。

* `_transfer(address from, address to, uint256 amount)` :转账。这个内部函数相当于 **`transfer`** ,可以用于例如实施自动代币费用,削减机制等。触发 **`Transfer`** 事件。

* `_mint(address account, uint256 amount)` :铸造 **`amount`** 数量的代币给 **`account`** 地址,增加总发行量。触发 **`Transfer`** 事件,其中参数 **`from`** 是零地址。

* `_burn(address account, uint256 amount)` :从 **`account`** 地址中烧毁 **`amount`** 数量的代币,减少总发行量。触发 **`Transfer`** 事件,其中参数 **`to`** 是零地址。

* `_approve(address owner, uint256 spender, uint256 amount)` :设定允许 **`spender`** 花费 **`owner`** 的代币数量。这个内部函数相当于 **`approve`** ,可以用于例如为某些子系统设置自动限额等。

* `spendAllowance(address owner, address spender, uint256 amount)` :花费 **`amount`** 数量的 **`owner`** 授权 **`spender`** 的代币。在无限 allowance 的情况下不更新 allowance 金额。如果没有足够的余量,则恢复。可能触发 **`Approval`** 事件。

* `_beforeTokenTransfer(address from, address to, uint256 amount)` :在任何代币转账前的 Hook 。它包括铸币和烧毁。调用条件:

* **当 **`from`** 和 **`to`** 都不是零地址时,**`from` 手里 **`amount`** 数量的代币将发送给 **`to`** 。

* **当 **`from`** 是零地址时,将给 **`to`** 铸造 **`amount`** 数量的代币。**

* **当 **`to`** 是零地址时,**`from` 手里 **`amount`** 数量的代币将被烧毁。

* `from` 和 **`to`** 不能同时为零地址。

* `_afterTokenTransfer(address from, address to, uint256 amount)` :在任何代币转账后的 Hook 。它包括铸币和烧毁。调用条件:

* **当 **`from`** 和 **`to`** 都不是零地址时,**`from` 手里 **`amount`** 数量的代币将发送给 **`to`** 。

* **当 **`from`** 是零地址时,将给 **`to`** 铸造 **`amount`** 数量的代币。**

* **当 **`to`** 是零地址时,**`from` 手里 **`amount`** 数量的代币将被烧毁。

* `from` 和 **`to`** 不能同时为零地址。

#### **小结**

**ERC20 代码中的 **`_transfer`**、**`_mint`**、**`_burn`**、**`_approve`**、**`_spendAllowance`**、**`_beforeTokenTransfer`**、**`_afterTokenTransfer` 都是 **`internal`** 函数(其余为 **`public`** ),也就是说它们只能被派生合约调用。

## **从零开始,自己动手**

### **1.编写IERC20**

[**IERC20.sol**](https://github.com/Blockchain-Engineer-Learning/Contract-Interpretation/blob/main/ERC20/contracts/IERC20.sol)

```

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC20 {

/// @dev 总发行量

function totoalSupply() external view returns (uint256);

/// @dev 查看地址余额

function balanceOf(address account) external view returns (uint256);

/// @dev 单地址转账

function transfer(address account, uint256 amount) external returns (bool);

/// @dev 查看被授权人代表所有者花费的代币余额

function allowance(address owner, address spender) external view returns (uint256);

/// @dev 授权别人花费你拥有的代币

function approve(address spender, uint256 amount) external returns (bool);

/// @dev 双地址转账

function transferFrom(

address from,

address to,

uint256 amount

) external returns (bool);

/// @dev 发生代币转移时触发

event Transfer(address indexed from, address indexed to, uint256 value);

/// @dev 授权时触发

event Approval(address indexed owner, address indexed spender, uint256 value);

}

```

### **2.加上Metadata**

[**IERC20Metadata.sol**](https://github.com/Blockchain-Engineer-Learning/Contract-Interpretation/blob/main/ERC20/contracts/IERC20Metadata.sol)

```

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "IERC20.sol";

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);

}

```

### **3.编写ERC20**

[**ERC20.sol**](https://github.com/Blockchain-Engineer-Learning/Contract-Interpretation/blob/main/ERC20/contracts/ERC20.sol)

```

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

import "./IERC20Metadata.sol";

contract ERC20 is IERC20, IERC30Metadata {

// 地址余额

mapping(address => uint256) private _balances;

// 授权地址余额

mapping(address => mapping(address => uint256)) private _allowances;

uint256 private _totalSupply;

string private _name;

string private _symbol;

/// @dev 设定代币名称符号

constructor(string memory name_, string memory symbol_) {

_name = name_;

_symbol = symbol_;

}

function name() public view virtual override returns (string memory) {

return _name;

}

function symbol() public view virtual override returns (string memory) {

return _symbol;

}

/// @dev 小数点位数一般为 18

function decimals() public view virtual override returns (uint8) {

return 18;

}

function totalSupply() public view virtual override returns (uint256) {

return _totalSupply;

}

function balanceOf(address account) public view virtual override returns (uint256) {

return _balances[account];

}

function transfer(address to, uint256 amount) public virtual override returns (bool) {

address owner = msg.sender;

_transfer(owner, to, amount);

return true;

}

function allowance(address owner, address spender) public view virtual override returns (uint256) {

return _allowances[owner][spender];

}

function approve(address spender, uint256 amount) public virtual override returns (bool) {

address owner = msg.sender;

_approve(owner, spender, amount);

return true;

}

function transferFrom(

address from,

address to,

uint256 amount

) public virtual override returns (bool) {

address spender = msg.sender;

_spendAllowance(from, spender, amount);

_transfer(from, to, amount);

return true;

}

function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {

address owner = msg.sender;

_approve(owner, spender, _allowances[owner][spender] + addedValue);

return true;

}

function decreaseAllowance(address spender, uint256 substractedValue) public virtual returns (bool) {

address owner = msg.sender;

uint256 currentAllowance = _allowances[owner][spender];

require(currentAllowance >= substractedValue, "ERC20: decreased allowance below zero");

unchecked {

_approval(owner, spender, currentAllowance - substractedValue);

}

return true;

}

function _transfer(

address from,

address to,

uint256 amount

) internal virtual {

require(from != address(0), "ERC20: transfer from the zero address");

require(to != address(0), "ERC20: transfer to the zero address");

_beforeTokenTransfer(from, to, amount);

uint256 fromBalance = _balances[from];

require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");

unchecked {

_balances[from] = fromBalance - amount;

}

_balances[to] += amount;

emit Transfer(from, to, amount);

_afterTokenTransfer(from, to, amount);

}

function _mint(address account, uint256 amount) internal virtual {

require(account != address(0), "ERC20: mint to the zero address");

_beforeTokenTransfer(address(0), account, amount);

_totalSupply += amount;

_balances[account] += amount;

emit Transfer(address(0), account, amount);

_afterTokenTransfer(address(0), account, amount);

}

function _burn(address account, uint256 amount) internal virtual {

require(account != address(0), "ERC20: burn from the zero address");

_beforeTokenTransfer(account, address(0), amount);

uint256 accountBalance = _balances[account];

require(accountBalance >= amount, "ERC20: burn amount exceeds balance");

unchecked {

_balances[account] = accountBalance - amount;

}

_totalSupply -= amount;

emit Transfer(account, address(0), amount);

_afterTokenTransfer(account, address(0), amount);

}

function _approve(

address owner,

address spender,

uint256 amount

) internal virtual {

require(owner != address(0), "ERC20: approve from the zero address");

require(spender != address(0), "ERC20: approve to the zero address");

_allowances[owner][spender];

emit Approval(owner, spender, amount);

}

function _spendAllowance(

address owner,

address spender,

uint256 amount

) internal virtual {

uint256 currentAllowance = allowance(owner, spender);

if (currentAllowance != type(uint256).max) {

require(currentAllowance >= amount, "ERC20: insufficient allowance");

unchecked {

_approve(owner, spender, currentAllowance - amount);

}

}

}

function _beforeTokenTransfer(

address from,

address to,

uint256 amount

) internal virtual {}

function _afterTokenTransfer(

address from,

address to,

uint256 amount

) internal virtual {}

}

```

## **总结**

**ERC20 其实就是一种最常见的代币标准,它明确了同质化代币的经典功能并规范了开发者编写 token 时的代码,从而方便各种应用适配。**

ERC20解读

参考 OpenZepplin文档 和 以太坊官方开发者文档,结合自己的理解。

博客的 Markdown 编辑器暂不支持 Solidity 语法高亮,为了更好阅读代码,可以去 我的GitHub仓库 。

什么是ERC20

ERC20(Ethereum Request for Comments 20)一种代币标准。EIP-20 中提出。

ERC20 代币合约跟踪同质化(可替代)代币:任何一个代币都完全等同于任何其他代币;没有任何代币具有与之相关的特殊权利或行为。这使得 ERC20 代币可用于交换货币、投票权、质押等媒介。

为什么要遵守ERC20

EIP-20 中的动机:

允许以太坊上的任何代币被其他应用程序(从钱包到去中心化交易所)重新使用的标准接口。

以太坊上的所有应用都默认支持 ERC20 ,如果你想自己发币,那么你的代码必须遵循 ERC20 标准,这样钱包(如MetaMask)等应用才能将你的币显示出来。

代码实现

需要实现以下函数和事件:

function name() public view returns (string)

function symbol() public view returns (string)

function decimals() public view returns (uint8)

function totalSupply() public view returns (uint256)

function balanceOf(address _owner) public view returns (uint256 balance)

function transfer(address _to, uint256 _value) public returns (bool success)

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

function approve(address _spender, uint256 _value) public returns (bool success)

function allowance(address _owner, address _spender) public view returns (uint256 remaining)

event Transfer(address indexed _from, address indexed _to, uint256 _value)

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

使用 OpenZeppllin 提供的库能够轻松快速地构建 ERC20 Token 。

快速构建

这是一个 GLD token 。

// contracts/GLDToken.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract GLDToken is ERC20 {

constructor(uint256 initialSupply) ERC20("Gold", "GLD") {

_mint(msg.sender, initialSupply);

}

}

通常,我们定义代币的发行量和代币名称及符号。

IERC20

先来看下 ERC20 的接口(IERC20),这方便我们在开发中直接定义 ERC20 代币。

同样地,OpenZepplin 为我们提供了相应的库,方便开发者导入即用。

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

EIP 中定义的 ERC20 标准接口:

pragma solidity ^0.8.0;

interface IERC20 {

event Transfer(address indexed from, address indexed to, uint256 value);

event Approval(address indexed owner, address indexed spender, uint256 value);

function totalSupply() external view returns (uint256);

function balanceOf(address account) external view returns (uint256);

function transfer(address to, uint256 amount) external returns (bool);

function allowance(address owner, address spender) external view returns (uint256);

function approve(address spender, uint256 amount) external returns (bool);

function transferFrom(

address from,

address to,

uint256 amount

) external returns (bool);

}

逐一分析

函数:

totalSupply() :返回总共的代币数量。

balanceOf(address account) :返回 account 地址拥有的代币数量。

transfer(address to, uint256 amount) :将 amount 数量的代币发送给 to 地址,返回布尔值告知是否执行成功。触发 Transfer 事件。

allowance(address owner, address spender) :返回授权花费者 spender 通过 transferFrom 代表所有者花费的剩余代币数量。默认情况下为零。当 approve 和 transferFrom 被调用时,值将改变。

approve(address spender, uint256 amount) :授权 spender 可以花费 amount 数量的代币,返回布尔值告知是否执行成功。触发 Approval 事件。

transferFrom(address from, address to, uint256 amount) :将 amount 数量的代币从 from 地址发送到 to 地址,返回布尔值告知是否执行成功。触发 Transfer 事件。

事件(定义中的 indexed 便于查找过滤):

Transfer(address from, address to, uint256 value) :当代币被一个地址转移到另一个地址时触发。注意:转移的值可能是 0 。

Approval(address owner, address spender, uint256 value) :当代币所有者授权别人使用代币时触发,即调用 approve 方法。

元数据

一般除了上述必须实现的函数外,还有一些别的方法:

name() :返回代币名称

symbol() :返回代币符号

decimals() :返回代币小数点后位数

ERC20

来看下 ERC20 代币具体是怎么写的。

同样,OpenZepplin 提供了现成的合约代码:

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

这里贴一个GitHub源码链接 OpenZepplin ERC20

函数概览

constructor(name_, symbol_)

name()

symbol()

decimals()

totalSupply()

balanceOf(account)

transfer(to, amount)

allowance(owner, spender)

approve(spender, amount)

transferFrom(from, to, amount)

increaseAllowance(spender, addedValue)

decreaseAllowance(spender, subtractedValue)

_transfer(from, to, amount)

_mint(account, amount)

_burn(account, amount)

_approve(owner, spender, amount)

_spendAllowance(owner, spender, amount)

_beforeTokenTransfer(from, to, amount)

_afterTokenTransfer(from, to, amount)

事件(同 IERC20)

Transfer(from, to, value)

Approval(owner, spender, value)

逐一分析

constructor(string name, string symbol) :设定代币的名称和符号。decimals 默认是 18 ,要修改成不同的值你应该重载它。这两个值是不变的,只在构造时赋值一次。

name() :返回代币的名称。

symbol() :返回代币的符号,通常是名称的缩写。

decimals() :返回小数点后位数,通常是 18 ,模仿 Ether 和 wei 。要更改就重写它。

totalSupply()、balanceOf(address account)、transfer(address to, uint256 amount)、 allowance(address owner, address spender)、approve(address spender, uint256 amount)、transferFrom(address from, address to, uint256 amount) 都参考 IERC20 。

increaseAllowance(address spender, uint256 addedValue) :以原子的方式增加 spender 额度。返回布尔值告知是否执行成功,触发 Approval 事件。

_transfer(address from, address to, uint256 amount) :转账。这个内部函数相当于 transfer ,可以用于例如实施自动代币费用,削减机制等。触发 Transfer 事件。

_mint(address account, uint256 amount) :铸造 amount 数量的代币给 account 地址,增加总发行量。触发 Transfer 事件,其中参数 from 是零地址。

_burn(address account, uint256 amount) :从 account 地址中烧毁 amount 数量的代币,减少总发行量。触发 Transfer 事件,其中参数 to 是零地址。

_approve(address owner, uint256 spender, uint256 amount) :设定允许 spender 花费 owner 的代币数量。这个内部函数相当于 approve ,可以用于例如为某些子系统设置自动限额等。

spendAllowance(address owner, address spender, uint256 amount) :花费 amount 数量的 owner 授权 spender 的代币。在无限 allowance 的情况下不更新 allowance 金额。如果没有足够的余量,则恢复。可能触发 Approval 事件。

_beforeTokenTransfer(address from, address to, uint256 amount) :在任何代币转账前的 Hook 。它包括铸币和烧毁。调用条件:

当 from 和 to 都不是零地址时,from 手里 amount 数量的代币将发送给 to 。

当 from 是零地址时,将给 to 铸造 amount 数量的代币。

当 to 是零地址时,from 手里 amount 数量的代币将被烧毁。

from 和 to 不能同时为零地址。

_afterTokenTransfer(address from, address to, uint256 amount) :在任何代币转账后的 Hook 。它包括铸币和烧毁。调用条件:

当 from 和 to 都不是零地址时,from 手里 amount 数量的代币将发送给 to 。

当 from 是零地址时,将给 to 铸造 amount 数量的代币。

当 to 是零地址时,from 手里 amount 数量的代币将被烧毁。

from 和 to 不能同时为零地址。

小结

ERC20 代码中的 _transfer、_mint、_burn、_approve、_spendAllowance、_beforeTokenTransfer、_afterTokenTransfer 都是 internal 函数(其余为 public ),也就是说它们只能被派生合约调用。

从零开始,自己动手

1.编写IERC20

IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC20 {

/// @dev 总发行量

function totoalSupply() external view returns (uint256);

/// @dev 查看地址余额

function balanceOf(address account) external view returns (uint256);

/// @dev 单地址转账

function transfer(address account, uint256 amount) external returns (bool);

/// @dev 查看被授权人代表所有者花费的代币余额

function allowance(address owner, address spender) external view returns (uint256);

/// @dev 授权别人花费你拥有的代币

function approve(address spender, uint256 amount) external returns (bool);

/// @dev 双地址转账

function transferFrom(

address from,

address to,

uint256 amount

) external returns (bool);

/// @dev 发生代币转移时触发

event Transfer(address indexed from, address indexed to, uint256 value);

/// @dev 授权时触发

event Approval(address indexed owner, address indexed spender, uint256 value);

}

2.加上Metadata

IERC20Metadata.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "IERC20.sol";

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);

}

3.编写ERC20

ERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

import "./IERC20Metadata.sol";

contract ERC20 is IERC20, IERC30Metadata {

// 地址余额

mapping(address => uint256) private _balances;

// 授权地址余额

mapping(address => mapping(address => uint256)) private _allowances;

uint256 private _totalSupply;

string private _name;

string private _symbol;

/// @dev 设定代币名称符号

constructor(string memory name_, string memory symbol_) {

_name = name_;

_symbol = symbol_;

}

function name() public view virtual override returns (string memory) {

return _name;

}

function symbol() public view virtual override returns (string memory) {

return _symbol;

}

/// @dev 小数点位数一般为 18

function decimals() public view virtual override returns (uint8) {

return 18;

}

function totalSupply() public view virtual override returns (uint256) {

return _totalSupply;

}

function balanceOf(address account) public view virtual override returns (uint256) {

return _balances[account];

}

function transfer(address to, uint256 amount) public virtual override returns (bool) {

address owner = msg.sender;

_transfer(owner, to, amount);

return true;

}

function allowance(address owner, address spender) public view virtual override returns (uint256) {

return _allowances[owner][spender];

}

function approve(address spender, uint256 amount) public virtual override returns (bool) {

address owner = msg.sender;

_approve(owner, spender, amount);

return true;

}

function transferFrom(

address from,

address to,

uint256 amount

) public virtual override returns (bool) {

address spender = msg.sender;

_spendAllowance(from, spender, amount);

_transfer(from, to, amount);

return true;

}

function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {

address owner = msg.sender;

_approve(owner, spender, _allowances[owner][spender] + addedValue);

return true;

}

function decreaseAllowance(address spender, uint256 substractedValue) public virtual returns (bool) {

address owner = msg.sender;

uint256 currentAllowance = _allowances[owner][spender];

require(currentAllowance >= substractedValue, "ERC20: decreased allowance below zero");

unchecked {

_approval(owner, spender, currentAllowance - substractedValue);

}

return true;

}

function _transfer(

address from,

address to,

uint256 amount

) internal virtual {

require(from != address(0), "ERC20: transfer from the zero address");

require(to != address(0), "ERC20: transfer to the zero address");

_beforeTokenTransfer(from, to, amount);

uint256 fromBalance = _balances[from];

require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");

unchecked {

_balances[from] = fromBalance - amount;

}

_balances[to] += amount;

emit Transfer(from, to, amount);

_afterTokenTransfer(from, to, amount);

}

function _mint(address account, uint256 amount) internal virtual {

require(account != address(0), "ERC20: mint to the zero address");

_beforeTokenTransfer(address(0), account, amount);

_totalSupply += amount;

_balances[account] += amount;

emit Transfer(address(0), account, amount);

_afterTokenTransfer(address(0), account, amount);

}

function _burn(address account, uint256 amount) internal virtual {

require(account != address(0), "ERC20: burn from the zero address");

_beforeTokenTransfer(account, address(0), amount);

uint256 accountBalance = _balances[account];

require(accountBalance >= amount, "ERC20: burn amount exceeds balance");

unchecked {

_balances[account] = accountBalance - amount;

}

_totalSupply -= amount;

emit Transfer(account, address(0), amount);

_afterTokenTransfer(account, address(0), amount);

}

function _approve(

address owner,

address spender,

uint256 amount

) internal virtual {

require(owner != address(0), "ERC20: approve from the zero address");

require(spender != address(0), "ERC20: approve to the zero address");

_allowances[owner][spender];

emit Approval(owner, spender, amount);

}

function _spendAllowance(

address owner,

address spender,

uint256 amount

) internal virtual {

uint256 currentAllowance = allowance(owner, spender);

if (currentAllowance != type(uint256).max) {

require(currentAllowance >= amount, "ERC20: insufficient allowance");

unchecked {

_approve(owner, spender, currentAllowance - amount);

}

}

}

function _beforeTokenTransfer(

address from,

address to,

uint256 amount

) internal virtual {}

function _afterTokenTransfer(

address from,

address to,

uint256 amount

) internal virtual {}

}

总结

ERC20 其实就是一种最常见的代币标准,它明确了同质化代币的经典功能并规范了开发者编写 token 时的代码,从而方便各种应用适配。

学分: 39

分类: 以太坊

标签:

ERC20 

点赞 3

收藏 5

分享

Twitter分享

微信扫码分享

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

你可能感兴趣的文章

花式发币法之发行各类 ERC20 代币

3968 浏览

Michael.W基于Foundry精读Openzeppelin第39期——ERC20.sol

506 浏览

教程:如何在没有 Web 界面的情况下创建 ERC20桥

1574 浏览

一个简单的ERC20代币空投合约

2653 浏览

发布一款ERC20代币,并开发成Dapp

1548 浏览

Aptos合约开发之部署ERC20合约

3944 浏览

相关问题

请教下大家,Swap如何实现卖币手续费

2 回答

如何从发起部署的地址中,转移一部分代币到已经部署的合约地址中,麻烦那位大佬看一下

5 回答

空投的默克尔树如何防止生日攻击?

2 回答

bsc链上的erc20合约,要求只有一点买卖的时候2%兑换成bnb发送到营销钱包,现在的问题是添加流动性会一直报错Fail with error 'TransferHelper::transferFrom: transferFrom failed'

2 回答

eth中如何判断合约是erc20合约

2 回答

寻找使用Vyper部署的带有交易税的ERC20代币模版

1 回答

0 条评论

请先 登录 后评论

Confucian

关注

贡献值: 57

学分: 83

Keep Learning

文章目录

关于

关于我们

社区公约

学分规则

Github

伙伴们

DeCert

ChainTool

GCC

合作

广告投放

发布课程

联系我们

友情链接

关注社区

Discord

Twitter

Youtube

B 站

公众号

关注不错过动态

微信群

加入技术圈子

©2024 登链社区 版权所有 |

Powered By Tipask3.5|

粤公网安备 44049102496617号

粤ICP备17140514号

粤B2-20230927

增值电信业务经营许可证

×

发送私信

请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!

发给:

内容:

取消

发送

×

举报此文章

垃圾广告信息:

广告、推广、测试等内容

违规内容:

色情、暴力、血腥、敏感信息等内容

不友善内容:

人身攻击、挑衅辱骂、恶意行为

其他原因:

请补充说明

举报原因:

取消

举报

×

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!

【科普】USDT的三种链类型(Omni、ERC20、TRC20) - 知乎

【科普】USDT的三种链类型(Omni、ERC20、TRC20) - 知乎首发于区块链那点事切换模式写文章登录/注册【科普】USDT的三种链类型(Omni、ERC20、TRC20)区块链小数据库区块链前沿资讯分享,一级市场项目推荐!很多朋友在进行USDT转账的时候都会出现三种链类型,这个时候就很多人不知道具体选择哪一种,也不知道这几种链类型的区别,心里就会产生谨慎,其实这三种链类型都是可以使用的,本文简单地讲述一下这三种链类型的区别,希望对大家有所帮助。USDT的三种形态分别是:基于比特币网络的Omni-USDT,充币地址是BTC地址,充提币走BTC网络;基于以太坊ERC20协议的ERC20-USDT,充币地址是ETH地址,充提币走ETH网络;基于波场TRC20协议的TRC20-USDT,充币地址是TRON地址,充提币走TRON网络。1、Omni-USDT2014年11月,USDT于比特币网络上诞生,于2015年2月正式上线几大主流交易所。在2018年之前,USDT的转账路径只有一条,那就是基于比特币网络的Omni-USDT。Omni-USDT存储在比特币地址上,因此每次转账的时候,需要支付比特币作为矿工手续费。Omni-USDT于比特币网络的链上,黑客攻击的成本很高,所以资产相对安全性较高。但是其交易速度非常慢,已经无法满足当今加密交易市场的需求,但很多大宗交易还是会倾向于Omni-USDT。2、ERC20-USDT2018年初,以太坊网络爆红,智能合约普及于区块链应用,ERC20-USDT出现。和Omni-USDT一样,使用ERC20-USDT同样需要支付旷工费,但转账速度有了显著的提升。由于安全性好、转账速度快,ERC20-USDT被市场广泛接受,USDT的发行者泰达公司也开始放弃了比特币Omni,转而支持更高效的以太坊ERC20。随着近期泰达公司多次在以太坊上增发USDT,ERC20-USDT的数量显著增加,目前已超过Omni-USDT总量的50%。除了官方放弃Omni协议以外,主流交易所也开始转向支持ERC20-USDT。7月3日,币安交易所宣布将由OMNI网络切换为ERC20网络,虽然原OMNI网络的USDT可以继续充值并上账,但将无法提现OMNI网络的USDT。3、TRC20-USDT2019年4月,泰达公司宣布在波场上发行了基于TRC-20协议的USDT,TRC20-USDT诞生。TRC20-USDT发行时承诺完全公开透明,零转账费,秒级到账。和前两者不同的是,目前TRC20-USDT转账是不收取手续费的,这也是波场打造的一个亮点。但目前TRC20-USDT的发展还不是很成熟,也无法保证安全性。应该如何区分?首先要明白一点:三种类型的USDT在交易所内并没有差别,但在链上是不互通的。也就是说Omn上的USDT是无法转到另外两条链上的,所以在交易所充提USDT时一定要留意地址种类。三者最明显的区别:Omni-USDT的地址是以1开头ERC20-USDT的地址是以0x开头TRC20-USDT的地址是以T开头那么,应该如何选择?Omni-USDT的安全性最好,但转账速度太慢。要是你有不着急交易的大额订单,可以优先选择Omni-USDT。ERC20-USDT的安全性和转账速度居中,适用于数字货币市场的频繁交易。要是你经常做短线交易,可以优先选择ERC20-USDT。TRC20-USDT的转账速度最快,而且链上转账无需手续费,但安全性比较低。要是你非常在意交易速度,可以考虑TRC20-USDT,建议小额为主。发布于 2021-12-28 19:36区块链(Blockchain)数字货币钱包TP​赞同 10​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录区块链那点事一些常用的工具操作方法和教

ERC-20 代币标准 | ethereum.org

20 代币标准 | ethereum.org跳转至主要内容学习用法构建参与研究搜索​​​​语言 ZH帮助更新此页面本页面有新版本,但现在只有英文版。请帮助我们翻译最新版本。翻译页面没有错误!此页面未翻译,因此特意以英文显示。不再显示Change page概述基础主题以太坊简介以太币简介去中心化应用程序简介Web2 与 Web3 的对比帐户交易区块以太坊虚拟机 (EVM)操作码Gas费用节点和客户端运行节点客户端多样性节点即服务节点架构轻客户端归档节点引导节点网络共识机制工作量证明矿工挖矿算法Dagger-HashimotoEthash权益证明Gasper弱主观性认证权益证明机制的奖励和惩罚权益证明攻击与防御密钥权益证明与工作量证明提出区块权益正明常见问题以太坊堆栈堆栈简介智能合约智能合约语言智能合约结构智能合约库测试用智能合约编译智能合约部署智能合约验证智能合约升级智能合约智能合约安全性智能合约形式化验证可组合性开发网络开发框架以太坊客户端APIJavaScript API后端APIJSON-RPC数据和分析区块浏览器存储集成开发环境 (IDE)编程语言DartDelphi.NETGolangJavaJavaScriptPythonRubyRust语言高级链桥标准令牌标准ERC-20:同质化代币ERC-721:非同质化代币 (NFT)ERC-777ERC-1155ERC-4626最大可提取价值 (MEV)预言机缩放乐观卷叠零知识卷叠状态通道侧链以太坊 Plasma 扩容解决方案Validium数据可用性网络层网络地址门户网络数据结构与编码默克尔前缀树递归长度前缀编码 (RLP)简单序列化 (SSZ)Web3 密钥存储定义设计基础设计和用户体验简介ERC-20 代币标准p上次修改时间: @penglaishan.cn(opens in a new tab), Invalid DateTime查看贡献者在本页面介绍前提条件正文方法事件示例延伸阅读介绍什么叫做代币?代币可以在以太坊中表示任何东西:在线平台中的信誉积分游戏中一个角色的技能彩票卷金融资产类似于公司股份的资产像美元一样的法定货币一盎司黄金及更多...以太坊的这种强大特点必须以强有力的标准来处理,对吗? 这正是 ERC-20 发挥其作用的地方! 此标准允许开发者构建可与其他产品和服务互相操作的代币应用程序。什么是 ERC-20?ERC-20 提出了一个同质化代币的标准,换句话说,它们具有一种属性,使得每个代币都与另一个代币(在类型和价值上)完全相同。 例如,一个 ERC-20 代币就像以太币一样,意味着一个代币会并永远会与其他代币一样。前提条件帐户智能合约代币标准正文ERC-20(以太坊意见征求 20)由 Fabian Vogelsteller 提出于 2015 年 11 月。这是一个能实现智能合约中代币的应用程序接口标准。ERC-20 的功能示例包括:将代币从一个帐户转到另一个帐户获取帐户的当前代币余额获取网络上可用代币的总供应量批准一个帐户中一定的代币金额由第三方帐户使用如果智能合约实施了下列方法和事件,它可以被称为 ERC-20 代币合约,一旦部署,将负责跟踪以太坊上创建的代币。来自 EIP-20(opens in a new tab):方法1function name() public view returns (string)2function symbol() public view returns (string)3function decimals() public view returns (uint8)4function totalSupply() public view returns (uint256)5function balanceOf(address _owner) public view returns (uint256 balance)6function transfer(address _to, uint256 _value) public returns (bool success)7function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)8function approve(address _spender, uint256 _value) public returns (bool success)9function allowance(address _owner, address _spender) public view returns (uint256 remaining)显示全部 复制事件1event Transfer(address indexed _from, address indexed _to, uint256 _value)2event Approval(address indexed _owner, address indexed _spender, uint256 _value) 复制示例让我们看看如此重要的一个标准是如何使我们能够简单地检查以太坊上的任何 ERC-20 代币合约。 我们只需要合约的应用程序二进制接口 (ABI) 来创造一个 ERC-20 代币界面。 下面我们将使用一个简化的应用程序二进制接口,让例子变得更为简单。Web3.py 示例首先,请确保您已安装 Web3.py(opens in a new tab) Python 库:1pip install web31from web3 import Web3234w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))56dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)89acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 21011# This is a simplified Contract Application Binary Interface (ABI) of an ERC-20 Token Contract.12# It will expose only the methods: balanceOf(address), decimals(), symbol() and totalSupply()13simplified_abi = [14 {15 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],16 'name': 'balanceOf',17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],18 'stateMutability': 'view', 'type': 'function', 'constant': True19 },20 {21 'inputs': [],22 'name': 'decimals',23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },26 {27 'inputs': [],28 'name': 'symbol',29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],30 'stateMutability': 'view', 'type': 'function', 'constant': True31 },32 {33 'inputs': [],34 'name': 'totalSupply',35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 }38]3940dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)41symbol = dai_contract.functions.symbol().call()42decimals = dai_contract.functions.decimals().call()43totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals4546# DAI47print("===== %s =====" % symbol)48print("Total Supply:", totalSupply)49print("Addr Balance:", addr_balance)5051weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)52symbol = weth_contract.functions.symbol().call()53decimals = weth_contract.functions.decimals().call()54totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals5657# WETH58print("===== %s =====" % symbol)59print("Total Supply:", totalSupply)60print("Addr Balance:", addr_balance)显示全部 复制延伸阅读EIP-20:ERC-20 代币标准(opens in a new tab)OpenZeppelin - 代币(opens in a new tab)OpenZeppelin - ERC-20 实施(opens in a new tab)back-to-top ↑本文对你有帮助吗?是否前一页令牌标准下一页ERC-721:非同质化代币 (NFT)编辑页面(opens in a new tab)在本页面介绍前提条件正文方法事件示例延伸阅读网站最后更新: 2024年3月13日(opens in a new tab)(opens in a new tab)(opens in a new tab)学习学习中心什么是以太坊?什么是以太币 (ETH)?以太坊钱包什么是 Web3?智能合约Gas fees运行节点以太坊安全和预防欺诈措施测试中心以太坊词汇表用法指南选择钱包获取以太币Dapps - 去中心化应用稳定币NFT - 非同质化代币DeFi - 去中心化金融DAO - 去中心化自治组织去中心化身份质押ETH二层网络构建构建者首页教程相关文档通过编码来学习设置本地环境资助基础主题用户体验/用户界面设计基础Enterprise - Mainnet EthereumEnterprise - Private Ethereum参与社区中心在线社区以太坊活动为 ethereum.org 做贡献翻译计划以太坊漏洞悬赏计划以太坊基金会以太坊基金会的博客(opens in a new tab)生态系统支持方案(opens in a new tab)Devcon(opens in a new tab)研究以太坊白皮书以太坊路线图安全性增强以太坊技术史开放研究以太坊改进提案 (Eip)以太坊治理关于我们以太坊品牌资产Code of conduct工作机会隐私政策使用条款缓存政策联系我们(opens in a new tab)本页面对你有帮

ERC-20 合约概览 | ethereum.org

20 合约概览 | ethereum.org跳转至主要内容学习用法构建参与研究搜索​​​​语言 ZH帮助更新此页面本页面有新版本,但现在只有英文版。请帮助我们翻译最新版本。翻译页面没有错误!此页面未翻译,因此特意以英文显示。不再显示ERC-20 合约概览solidityerc-20初学者Ori Pomerantz 2021年3月9日35 分钟阅读 minute read在本页面简介接口实际合约导入声明合约定义变量的定义构造函数用户接口函数读取代币信息代币转账许可额度函数修改代币信息的函数修改小数点设置变量钩子简介以太坊最常见的用途之一是由一个团队来打造一种可以交易的代币,在某种意义上是他们自己的货币。 这些代币通常遵循一个标准, ERC-20。 此标准使得人们能够以此来开发可以用于所有 ERC-20 代币的工具,如流动资金池和钱包。 在这篇文章中,我们将带领大家分析 OpenZeppelin Solidity ERC20 实现(opens in a new tab)以及 ERC20 接口定义(opens in a new tab)。这里使用的是附加说明的源代码。 如果想要实现 ERC-20, 请阅读此教程(opens in a new tab)。接口像 ERC-20 这样的标准,其目的是允许符合标准的多种代币,都可以在应用程序之间进行互操作,例如钱包和分布式交易所。 为实现这个目的,我们要创建一个 接口(opens in a new tab)。 任何需要使用代币合约的代码 可以在接口中使用相同的定义,并且与使用它的所有代币合约兼容。无论是像 MetaMask 这样的钱包、 诸如 etherscan.io 之类的去中心化应用程序,或一种不同的合约,例如流动资金池。如果您是一位经验丰富的程序员,您可能记得在 Java(opens in a new tab) 中,甚至在 C 头文件(opens in a new tab) 中看到过类似的构造。这是来自 OpenZeppelin 的 ERC-20 接口(opens in a new tab) 的定义。 这是将人类可读标准(opens in a new tab)转换为 Solidity 代码。 当然, 接口本身并不定义如何做事。 这一点在下文合约的源代码中作了解释。1// SPDX-License-Identifier: MIT 复制Solidity 文件中一般需要标识软件许可证。 您可以在这里看到许可证列表(opens in a new tab)。 如果需要不同的 许可证,只需在注释中加以说明。1pragma solidity >=0.6.0 <0.8.0; 复制Solidity 语言仍在迅速地发展,新版本可能不适配旧的代码 (请点击此处查看(opens in a new tab))。 因此,最好不仅指定一个最低的 语言版本,也指定一个最高的版本,即测试过代码的最新版本。1/**2 * @dev Interface of the ERC20 standard as defined in EIP.3 */ 复制注释中的 @dev 是 NatSpec 格式(opens in a new tab)的一部分,用于 从源代码生成文档。1interface IERC20 { 复制根据惯例,接口名称以 I 开头。1 /**2 * @dev Returns the amount of tokens in existence.3 */4 function totalSupply() external view returns (uint256); 复制此函数标记为 external,表示它只能从合约之外调用(opens in a new tab)。 它返回的是合约中代币的总供应量 这个值按以太坊中最常见的类型返回,即无符号的 256 位(256 位是 以太坊虚拟机的原生字长宽度)。 此函数也是视图 view 类型,这意味着它不会改变合约状态,这样它可以在单个节点上执行,而不需要在区块链的每个节点上执行。 这类函数不会生成交易,也不会消耗燃料。注意:理论上讲,合约创建者可能会通过返回比实际数量少的总供应量来做骗局,让每个代币 比实际看起来更有价值。 然而,这种担忧忽视了区块链的真正内涵。 所有在区块链上发生的事情都要通过每个节点 进行验证。 为了实现这一点,每个合约的机器语言代码和存储都可以在每个节点上找到。 虽然无需发布您的合约代码,但这样其它人都不会认真对待您,除非您发布源代码和用于编译的 Solidity 版本,这样人们可以用它来验证您提供的机器语言代码。 例如,请查看此合约(opens in a new tab)。1 /**2 * @dev Returns the amount of tokens owned by `account`.3 */4 function balanceOf(address account) external view returns (uint256); 复制顾名思义,balanceOf 返回一个账户的余额。 以太坊帐户在 Solidity 中通过 address 类型识别,该类型有 160 位。 它也是 external 和 view 类型。1 /**2 * @dev Moves `amount` tokens from the caller's account to `recipient`.3 *4 * Returns a boolean value indicating whether the operation succeeded.5 *6 * Emits a {Transfer} event.7 */8 function transfer(address recipient, uint256 amount) external returns (bool); 复制transfer 函数将代币从调用者地址转移到另一个地址。 这涉及到状态的更改,所以它不是 view 类型。 当用户调用此函数时,它会创建交易并消耗燃料。 还会触发一个 Transfer 事件,以通知区块链上的所有人。该函数有两种输出,对应两种不同的调用:直接从用户接口调用函数的用户。 此类用户通常会提交一个交易 并且不会等待响应,因为响应可能需要无限期的时间。 用户可以查看交易收据 (通常通过交易哈希值识别)或者查看 Transfer 事件,以确定发生了什么。将函数作为整个交易一部分调用的其他合约 这些合约可立即获得结果, 由于它们在相同的交易里运行,因此可以使用函数返回值。更改合约状态的其他函数创建的同类型输出。限额允许帐户使用属于另一位所有者的代币。 比如,当合约作为卖方时,这个函数就很实用。 合约无法 监听事件,如果买方要将代币直接转给卖方合约, 该合约无法知道已经获得付款。 因此,买方允许 卖方合约支付一定的额度,而让卖方转账相应金额。 这通过卖方合约调用的函数完成,这样卖方合约 可以知道是否成功。1 /**2 * @dev Returns the remaining number of tokens that `spender` will be3 * allowed to spend on behalf of `owner` through {transferFrom}. This is4 * zero by default.5 *6 * This value changes when {approve} or {transferFrom} are called.7 */8 function allowance(address owner, address spender) external view returns (uint256); 复制allowance 函数允许任何人查询一个 地址 (owner) 给另一个地址 (spender) 的许可额度。1 /**2 * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.3 *4 * Returns a boolean value indicating whether the operation succeeded.5 *6 * IMPORTANT: Beware that changing an allowance with this method brings the risk7 * that someone may use both the old and the new allowance by unfortunate8 * transaction ordering. One possible solution to mitigate this race9 * condition is to first reduce the spender's allowance to 0 and set the10 * desired value afterwards:11 * https://github.com/ethereum/EIPs/issues/20#issuecomment-26352472912 *13 * Emits an {Approval} event.14 */15 function approve(address spender, uint256 amount) external returns (bool);显示全部 复制approve 函数创建了一个许可额度。 请务必阅读关于 如何避免函数被滥用的信息。 在以太坊中,您可以控制自己交易的顺序, 但无法控制其他方交易的执行顺序, 除非在看到其他方的交易发生之前 不提交您自己的交易。1 /**2 * @dev Moves `amount` tokens from `sender` to `recipient` using the3 * allowance mechanism. `amount` is then deducted from the caller's4 * allowance.5 *6 * Returns a boolean value indicating whether the operation succeeded.7 *8 * Emits a {Transfer} event.9 */10 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);显示全部 复制最后,消费者使用 transferFrom 函数用来使用许可额度。12 /**3 * @dev Emitted when `value` tokens are moved from one account (`from`) to4 * another (`to`).5 *6 * Note that `value` may be zero.7 */8 event Transfer(address indexed from, address indexed to, uint256 value);910 /**11 * @dev Emitted when the allowance of a `spender` for an `owner` is set by12 * a call to {approve}. `value` is the new allowance.13 */14 event Approval(address indexed owner, address indexed spender, uint256 value);15}显示全部 复制在 ERC-20 合约状态发生变化时就会激发这些事件。实际合约这是实现 ERC-20 标准的实际合约, 摘自此处(opens in a new tab)。 不能照原样使用,但可以 通过继承(opens in a new tab)将其扩展,使之可用。1// SPDX-License-Identifier: MIT2pragma solidity >=0.6.0 <0.8.0; 复制导入声明除了上述接口定义外,合约定义还要导入两个其他文件:12import "../../GSN/Context.sol";3import "./IERC20.sol";4import "../../math/SafeMath.sol"; 复制GSN/Context.sol 是使用 OpenGSN(opens in a new tab) 所需的文件,该系统允许用户在没有以太币的情况下 使用区块链。 请注意,这里的文件是旧版本,如果需要集成 OpenGSN, 请使用此教程(opens in a new tab)。SafeMath 库(opens in a new tab),用于 完成没有溢出问题的加法和减法。 这非常必要,否则会出现,用户仅有一个代币,花掉 两个代币后,反而有了 2^256-1 个代币。这里的注释说明了合约的目的。1/**2 * @dev Implementation of the {IERC20} interface.3 *4 * This implementation is agnostic to the way tokens are created. This means5 * that a supply mechanism has to be added in a derived contract using {_mint}.6 * For a generic mechanism see {ERC20PresetMinterPauser}.7 *8 * TIP: For a detailed writeup see our guide9 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How10 * to implement supply mechanisms].11 *12 * We have followed general OpenZeppelin guidelines: functions revert instead13 * of returning `false` on failure. This behavior is nonetheless conventional14 * and does not conflict with the expectations of ERC20 applications.15 *16 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.17 * This allows applications to reconstruct the allowance for all accounts just18 * by listening to said events. Other implementations of the EIP may not emit19 * these events, as it isn't required by the specification.20 *21 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}22 * functions have been added to mitigate the well-known issues around setting23 * allowances. See {IERC20-approve}.24 */25显示全部 复制合约定义1contract ERC20 is Context, IERC20 { 复制此行为 OpenGSN 指定继承,在本例中来自上面的 IERC20 和 Context。12 using SafeMath for uint256;3 复制此行将 SafeMath 库附加到 uint256 类型。 您可以在 此处(opens in a new tab)找到此程序库。变量的定义这些定义具体指定了合约的状态变量。 虽然声明这些变量为 private,但 这只意味着区块链上的其他合约无法读取它们。 区块链上 没有秘密,所有节点上的软件在每个区块上 都有每个合约的状态。 根据惯例,状态变量名称为 _。前两个变量是映射(opens in a new tab), 表示它们的结果与关联数组(opens in a new tab)相同, 不同之处在于关键词为数值。 存储空间仅分配给数值不同于 默认值(零)的条目。1 mapping (address => uint256) private _balances; 复制第一个映射,_balances,是代币地址和对应的余额。 要查看 余额,请使用此语法:_balances[
]。1 映射 (address => mapping (address => uint256)) private _allowances; 复制此变量,_allowances 存储之前提到过的许可限额。 第一个索引是 代币的所有者,第二个索引是获得许可限额的合约。 要查询地址 A 可以 从地址 B 账户中支出的额度,请使用 _allowances[B][A]。1 uint256 private _totalSupply; 复制顾名思义,此变量记录代币供应总量。1 string private _name;2 string private _symbol;3 uint8 private _decimals; 复制这三个变量用于提高可读性。 前两项的含义不言自明,但 _decimals 并非如此。一方面,以太坊不具有浮点数或分数变量。 另一方面, 人们希望能够拆分代币。 人们选择将黄金做为货币的一个原因是 当有人想要购买一只牛的一小部分时,就很难找零。解决方案是保持整数值,但是计数时使用一个价值非常小的分数代币, 而不是真正的代币。 就以太币而言,分数代币称为 wei,10^18 个 wei 等于一个 以太币。 在撰写本文时,10,000,000,000,000 wei 约等于一美分或欧分。应用程序需要知道如何显示代币余额。 如果某位用户有 3,141,000,000,000,000,000 wei,那是否是 3.14 个以太币? 31.41 个以太币? 还是 3,141 个以太币? 对于以太币,10^18 个 wei 等于 1 个以太币,但对于您的 代币,您可以选择一个不同的值。 如果无法合理拆分代币,您可以将 _decimals 值设为零。 如果想要使用与以太币相同的标准,请使用 18。构造函数1 /**2 * @dev Sets the values for {name} and {symbol}, initializes {decimals} with3 * a default value of 18.4 *5 * To select a different value for {decimals}, use {_setupDecimals}.6 *7 * All three of these values are immutable: they can only be set once during8 * construction.9 */10 constructor (string memory name_, string memory symbol_) public {11 _name = name_;12 _symbol = symbol_;13 _decimals = 18;14 }显示全部 复制构造函数在首次创建合约时调用。 根据惯例,函数参数名为 _。用户接口函数1 /**2 * @dev Returns the name of the token.3 */4 function name() public view returns (string memory) {5 return _name;6 }78 /**9 * @dev Returns the symbol of the token, usually a shorter version of the10 * name.11 */12 function symbol() public view returns (string memory) {13 return _symbol;14 }1516 /**17 * @dev Returns the number of decimals used to get its user representation.18 * For example, if `decimals` equals `2`, a balance of `505` tokens should19 * be displayed to a user as `5,05` (`505 / 10 ** 2`).20 *21 * Tokens usually opt for a value of 18, imitating the relationship between22 * ether and wei. This is the value {ERC20} uses, unless {_setupDecimals} is23 * called.24 *25 * NOTE: This information is only used for _display_ purposes: it in26 * no way affects any of the arithmetic of the contract, including27 * {IERC20-balanceOf} and {IERC20-transfer}.28 */29 function decimals() public view returns (uint8) {30 return _decimals;31 }显示全部 复制这些函数,name、symbol 和 decimals 帮助用户界面了解合约,从而正常演示合约。返回类型为 string memory,意味着返回在内存中存储的字符串。 变量,如 字符串,可以存储在三个位置:有效时间合约访问燃料成本内存函数调用读/写几十到几百不等(距离越远费用越高)调用数据函数调用只读不可用作返回类型,只可用作函数参数存储直到被修改读/写高(读取需要 800,写入需要 2 万)在这种情况下,memory 是最好的选择。读取代币信息这些是提供代币信息的函数,不管是总量还是 账户余额。1 /**2 * @dev See {IERC20-totalSupply}.3 */4 function totalSupply() public view override returns (uint256) {5 return _totalSupply;6 } 复制totalSupply 函数返回代币的总量。1 /**2 * @dev See {IERC20-balanceOf}.3 */4 function balanceOf(address account) public view override returns (uint256) {5 return _balances[account];6 } 复制读取一个帐户的余额。 请注意,任何人都可以查看他人账户的余额。 试图隐藏此信息没有意义,因为它在每个节点上 都是可见的。 区块链上没有秘密代币转账1 /**2 * @dev See {IERC20-transfer}.3 *4 * Requirements:5 *6 * - `recipient` cannot be the zero address.7 * - the caller must have a balance of at least `amount`.8 */9 function transfer(address recipient, uint256 amount) public virtual override returns (bool) {显示全部 复制调用 transfer 函数以从发送人的帐户转移代币到另一个帐户。 注意 虽然函数返回的是布尔值,但那个值始终为真实值。 如果转账失败, 合约会撤销调用。1 _transfer(_msgSender(), recipient, amount);2 return true;3 } 复制_transfer 函数完成了实际工作。 这是一个私有函数,只能由 其他合约函数调用。 根据常规,私人函数名为 _,与状态 变量相同。在 Solidity 中,我们通常使用 msg.sender 代表信息发送人。 然而,这会破坏 OpenGSN(opens in a new tab) 的规则。 如果我们想使用代币进行交易而不用以太币,我们 需要使用 _msgSender()。 对于正常交易,它返回 msg.sender,但是对于没有以太币的交易, 则返回原始签名而不是传递信息的合约。许可额度函数这些是实现许可额度功能的函数:allowance、approve、transferFrom 和 _approve。 此外,除基本标准外,OpenZeppelin 实现还包含了一些能够提高 安全性的功能:increaseAllowance 和 decreaseAllowance。许可额度函数1 /**2 * @dev See {IERC20-allowance}.3 */4 function allowance(address owner, address spender) public view virtual override returns (uint256) {5 return _allowances[owner][spender];6 } 复制allowance 函数使每个人都能检查任何许可额度。审批函数1 /**2 * @dev See {IERC20-approve}.3 *4 * Requirements:5 *6 * - `spender` cannot be the zero address.7 */8 function approve(address spender, uint256 amount) public virtual override returns (bool) { 复制调用此函数以创建许可额度。 它与上述 transfer 函数相似:该函数仅调用一个完成真正工作的内部函数(本例中为 _approve)。函数要么返回 true(如果成功),要么撤销(如果失败)。1 _approve(_msgSender(), spender, amount);2 return true;3 } 复制我们使用内部函数尽量减少发生状态变化之处。 任何可以改变状态的 函数都是一种潜在的安全风险,需要对其安全性进行审核。 这样我们就能减少出错的机会。TransferFrom 函数这个函数被消费者用于使用许可额度。 这里需要两步操作:将消费的金额转账, 并在许可额度中减去这笔金额。1 /**2 * @dev See {IERC20-transferFrom}.3 *4 * Emits an {Approval} event indicating the updated allowance. This is not5 * required by the EIP. See the note at the beginning of {ERC20}.6 *7 * Requirements:8 *9 * - `sender` and `recipient` cannot be the zero address.10 * - `sender` must have a balance of at least `amount`.11 * - the caller must have allowance for ``sender``'s tokens of at least12 * `amount`.13 */14 function transferFrom(address sender, address recipient, uint256 amount) public virtual15 override returns (bool) {16 _transfer(sender, recipient, amount);显示全部 复制a.sub(b, "message") 函数调用做了两件事。 首先,它计算了 a-b,这是新的许可额度。 之后,它检查这一结果是否为负数。 如果结果为负,将撤销调用,并发出相应的信息。 请注意,撤销调用后,之前在调用中完成的任何处理都会被忽略,所以我们不需要 撤消 _transfer。1 _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount,2 "ERC20: transfer amount exceeds allowance"));3 return true;4 } 复制OpenZeppelin 安全加法将许可额度从一个非零值设定为另一个非零值是有危险的, 因为您只能控制自己的交易顺序,而无法控制其他人的交易顺序。 假设现在有两个用户,天真的 Alice 和不诚实的 Bill。 Alice 想要从 Bill 处获取一些服务, 她认为值五个代币,所以她给了 Bill 五个代币的许可额度。之后有了一些变化,Bill 的价格提高到了十个代币。 Alice 仍然想要购买服务,就发送了一笔交易,将 Bill 的许可额度设置为 10。 当 Bill 在交易池中看到这个新的交易时, 他就会发送一笔交易,以花费 Alice 的五个代币,并且设定高得多的 燃料价格,这样就会更快挖矿。 这样的话,Bill 可以先花五个代币,然后 当 Alice 的新许可额度放款后,他就可以再花费十个代币,这样总共花费了 15 个代币, 超过了 Alice 本欲授权的金额。 这种技术叫做 抢先交易(opens in a new tab)Alice 的交易Alice 的随机数Bill 的交易Bill 的随机数Bill 的许可额度Bill 从 Alice 处获得的总收入approve(Bill, 5)1050transferFrom(Alice, Bill, 5)10,12305approve(Bill, 10)11105transferFrom(Alice, Bill, 10)10,124015为了避免这个问题,有两个函数(increaseAllowance 和 decreaseAllowance)使您 能够修改指定数额的许可额度。 所以,如果 Bill 已经花费了五个代币, 他就只能再花五个代币。 根据时间的不同,有两种方法可以生效, 这两种方法都会使 Bill 最终只得到十个代币:A:Alice 的交易Alice 的随机数Bill 的交易Bill 的随机数Bill 的许可额度Bill 从 Alice 处获得的总收入approve(Bill, 5)1050transferFrom(Alice, Bill, 5)10,12305increaseAllowance(Bill, 5)110+5 = 55transferFrom(Alice, Bill, 5)10,124010B:Alice 的交易Alice 的随机数Bill 的交易Bill 的随机数Bill 的许可额度Bill 从 Alice 处获得的总收入approve(Bill, 5)1050increaseAllowance(Bill, 5)115+5 = 100transferFrom(Alice, Bill, 10)10,1240101 /**2 * @dev Atomically increases the allowance granted to `spender` by the caller.3 *4 * This is an alternative to {approve} that can be used as a mitigation for5 * problems described in {IERC20-approve}.6 *7 * Emits an {Approval} event indicating the updated allowance.8 *9 * Requirements:10 *11 * - `spender` cannot be the zero address.12 */13 function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {14 _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));15 return true;16 }显示全部 复制a.add(b) 函数是一个安全加法。 在罕见的情况下,a+b>=2^256,不会发生 普通加法会出现的溢出错误。12 /**3 * @dev Atomically decreases the allowance granted to `spender` by the caller.4 *5 * This is an alternative to {approve} that can be used as a mitigation for6 * problems described in {IERC20-approve}.7 *8 * Emits an {Approval} event indicating the updated allowance.9 *10 * Requirements:11 *12 * - `spender` cannot be the zero address.13 * - `spender` must have allowance for the caller of at least14 * `subtractedValue`.15 */16 function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {17 _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue,18 "ERC20: decreased allowance below zero"));19 return true;20 }显示全部 复制修改代币信息的函数这些是完成实际工作的四个函数:_transfer、_mint、_burn 和 _approve。_transfer 函数 {#_transfer}1 /**2 * @dev Moves tokens `amount` from `sender` to `recipient`.3 *4 * This is internal function is equivalent to {transfer}, and can be used to5 * e.g. implement automatic token fees, slashing mechanisms, etc.6 *7 * Emits a {Transfer} event.8 *9 * Requirements:10 *11 * - `sender` cannot be the zero address.12 * - `recipient` cannot be the zero address.13 * - `sender` must have a balance of at least `amount`.14 */15 function _transfer(address sender, address recipient, uint256 amount) internal virtual {显示全部 复制_transfer 这个函数将代币从一个账户转到另一个账户。 有两个函数调用它,分别是 transfer(从发送人本人账户发送)和 transferFrom(使用许可额度,从其他人的账户发送)。1 require(sender != address(0), "ERC20: transfer from the zero address");2 require(recipient != address(0), "ERC20: transfer to the zero address"); 复制实际上以太坊中没有人拥有零地址(即不存在对应公钥可以转换为零地址的私钥)。 有人使用该地址时,通常是一个软件漏洞,所以 如果将零地址用作发送人或接收人,交易将失败。1 _beforeTokenTransfer(sender, recipient, amount);2 复制使用该合约有两种方法:将其作为模板,编写自己的代码从它继承(opens in a new tab)一个合约,并且重写您需要修改的函数第二种方法要好得多,因为 OpenZeppelin ERC-20 代码已经过审核,其安全性也已得到证实。 当您的合约继承它时, 可以清楚地表明修改了哪些函数,只需要审核这些特定的函数,人们就会信任您的合约。代币每次易手时,通常都需要调用一个函数。 然而,_transfer 是一个非常重要的函数, 重新编写可能会不安全(见下文),所以最好不要重写。 解决方案是重写 _beforeTokenTransfer 函数,这是一个挂钩函数(opens in a new tab)。 您可以重写此函数,之后每次转账都会调用它。1 _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");2 _balances[recipient] = _balances[recipient].add(amount); 复制这些是实际实现转账的代码。 请注意,将转账金额从发送人帐户上扣除,然后加到接收人帐户之间, 不得有任何动作。 这很重要,因为如果 中间调用不同的合约,可能会被用来骗过这个合约。 目前转账为最小操作单元,即中间什么都不会发生。1 emit Transfer(sender, recipient, amount);2 } 复制最后,激发一个 Transfer 事件。 智能合约无法访问事件,但区块链外运行的代码 可以监听事件并对其作出反应。 例如,钱包可以跟踪所有者获得更多代币事件。_mint 和 _burn 函数 {#_mint-and-_burn}这两个函数(_mint 和 _burn)修改代币的总供应量。 它们都是内部函数,在原有合约中没有任何调用它们的函数。 因此,仅通过继承合约并添加您自己的逻辑, 来决定在什么条件下可以铸造新代币或消耗现有代币时, 它们才是有用的。注意:每一个 ERC-20 代币都通过自己的业务逻辑来决定代币管理。 例如,一个固定供应总量的合约可能只在构造函数中调用 _mint,而从不调用 _burn。 一个销售代币的合约 将在支付时调用 _mint,并大概在某个时间点调用 _burn, 以避免过快的通货膨胀。1 /** @dev Creates `amount` tokens and assigns them to `account`, increasing2 * the total supply.3 *4 * Emits a {Transfer} event with `from` set to the zero address.5 *6 * Requirements:7 *8 * - `to` cannot be the zero address.9 */10 function _mint(address account, uint256 amount) internal virtual {11 require(account != address(0), "ERC20: mint to the zero address");12 _beforeTokenTransfer(address(0), account, amount);13 _totalSupply = _totalSupply.add(amount);14 _balances[account] = _balances[account].add(amount);15 emit Transfer(address(0), account, amount);16 }显示全部 复制当代币总数发生变化时,请务必更新 _totalSupply。1 /**2 * @dev Destroys `amount` tokens from `account`, reducing the3 * total supply.4 *5 * Emits a {Transfer} event with `to` set to the zero address.6 *7 * Requirements:8 *9 * - `account` cannot be the zero address.10 * - `account` must have at least `amount` tokens.11 */12 function _burn(address account, uint256 amount) internal virtual {13 require(account != address(0), "ERC20: burn from the zero address");1415 _beforeTokenTransfer(account, address(0), amount);1617 _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");18 _totalSupply = _totalSupply.sub(amount);19 emit Transfer(account, address(0), amount);20 }显示全部_burn 函数与 _mint 函数几乎完全相同,但它们的方向相反。_approve 函数 {#_approve}这是实际设定许可额度的函数。 请注意,它允许所有者指定 一个高于所有者当前余额的许可额度。 这是允许的,因为在转账时 会核查余额,届时可能不同于 创建许可额度时的金额。1 /**2 * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.3 *4 * This internal function is equivalent to `approve`, and can be used to5 * e.g. set automatic allowances for certain subsystems, etc.6 *7 * Emits an {Approval} event.8 *9 * Requirements:10 *11 * - `owner` cannot be the zero address.12 * - `spender` cannot be the zero address.13 */14 function _approve(address owner, address spender, uint256 amount) internal virtual {15 require(owner != address(0), "ERC20: approve from the zero address");16 require(spender != address(0), "ERC20: approve to the zero address");1718 _allowances[owner][spender] = amount;显示全部 复制激发一个 Approval 事件。 根据应用程序的编写, 消费者合约可以从代币所有者或监听事件的服务器获知审批结果。1 emit Approval(owner, spender, amount);2 }3 复制修改小数点设置变量123 /**4 * @dev Sets {decimals} to a value other than the default one of 18.5 *6 * WARNING: This function should only be called from the constructor. Most7 * applications that interact with token contracts will not expect8 * {decimals} to ever change, and may work incorrectly if it does.9 */10 function _setupDecimals(uint8 decimals_) internal {11 _decimals = decimals_;12 }显示全部 复制此函数修改了 >_decimals 变量,此变量用于设置用户接口如何计算金额。 您应该从构造函数里面调用。 在之后的任何时候调用都是不正当的, 应用程序一般不会处理。钩子12 /**3 * @dev Hook that is called before any transfer of tokens. This includes4 * minting and burning.5 *6 * Calling conditions:7 *8 * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens9 * will be to transferred to `to`.10 * - when `from` is zero, `amount` tokens will be minted for `to`.11 * - when `to` is zero, `amount` of ``from``'s tokens will be burned.12 * - `from` and `to` are never both zero.13 *14 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].15 */16 function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }17}显示全部 复制这是转账过程中要调用的挂钩函数。 该函数是空的,但如果你需要 它做一些事情,只需覆盖它即可。总结复习一下,这些是我认为此合约中最重要的概念(你们的看法可能与我不同)区块链上没有秘密 智能合约可以访问的任何信息 都可以提供给全世界。您可以控制自己交易的订单,但在其他人的交易发生时, 则不能控制。 这就是为什么更改许可额度时会有风险,因为它 允许消费者花掉这两个许可额度的总和。uint256 类型值的溢出。 换言之,0-1=2^256-1。 如果这不是预期的 行为,您必须自行检查(或使用 SafeMath 库执行该服务)。 请注意, Solidity 0.8.0(opens in a new tab) 中对此进行了更改。将特定类型变量的状态改变放在一个特定的地方,这样可以使审核更容易。 这就是我们使用以下等函数的原因,例如 _approve 函数,它可以被approve、transferFrom、 increaseAllowance 和 decreaseAllowance 调用。状态更改应为最小操作单元,其中没有任何其他动作 (如在 _transfer 中所见)。 这是因为在状态更改期间,会出现不一致的情况。 例如, 在减少发送人的余额,和增加接收人的余额之间, 代币总量会小于应有总量。 如果在这两个时刻之间有任何操作, 特别是调用不同的合约,则可能出现滥用。现在您已经了解了 OpenZeppelin ERC-20 合约是怎么编写的, 尤其是如何使之更加安全,您即可编写自己的安全合约和应用程序。m上次修改时间: @mdranger(opens in a new tab), Invalid DateTime查看贡献者本教程对你有帮助吗?是否编辑页面(opens in a new tab)在本页面简介接口实际合约导入声明合约定义变量的定义构造函数用户接口函数读取代币信息代币转账许可额度函数修改代币信息的函数修改小数点设置变量钩子网站最后更新: 2024年3月13日(opens in a new tab)(opens in a new tab)(opens in a new tab)学习学习中心什么是以太坊?什么是以太币 (ETH)?以太坊钱包什么是 Web3?智能合约Gas fees运行节点以太坊安全和预防欺诈措施测试中心以太坊词汇表用法指南选择钱包获取以太币Dapps - 去中心化应用稳定币NFT - 非同质化代币DeFi - 去中心化金融DAO - 去中心化自治组织去中心化身份质押ETH二层网络构建构建者首页教程相关文档通过编码来学习设置本地环境资助基础主题用户体验/用户界面设计基础Enterprise - Mainnet EthereumEnterprise - Private Ethereum参与社区中心在线社区以太坊活动为 ethereum.org 做贡献翻译计划以太坊漏洞悬赏计划以太坊基金会以太坊基金会的博客(opens in a new tab)生态系统支持方案(opens in a new tab)Devcon(opens in a new tab)研究以太坊白皮书以太坊路线图安全性增强以太坊技术史开放研究以太坊改进提案 (Eip)以太坊治理关于我们以太坊品牌资产Code of conduct工作机会隐私政策使用条款缓存政策联系我们(opens in a new tab)本页面对你有帮

代币标准:ERC20 vs ERC721 vs ERC1155 | 登链社区 | 区块链技术社区

代币标准:ERC20 vs ERC721 vs ERC1155 | 登链社区 | 区块链技术社区

文章

问答

讲堂

专栏

集市

更多

提问

发表文章

活动

文档

招聘

发现

Toggle navigation

首页 (current)

文章

问答

讲堂

专栏

活动

招聘

文档

集市

搜索

登录/注册

代币标准:ERC20 vs ERC721 vs ERC1155

李留白

更新于 2022-06-05 14:03

阅读 6498

ERC是Ethereum Request for Comments的首字母缩写。它就像技术文档,定义了适用于一群想要利用以太坊生态系统的开发者和用户的方法、行为、创新和研究。

以太坊的开发是为了解决第一代区块链--比特币的局限性。Vitalik Bueterin提出了具有集成智能合约功能的开源区块链的想法,以扩大区块链在各主要行业的使用案例。被誉为100%可编程的以太坊生态系统欢迎全世界的区块链爱好者在其生态系统的基础上开发区块链驱动的解决方案,并为增长做出贡献。

以太坊代币开发是普遍存在的开发机会之一,它维护了整个网络和众多相互关联的项目同时运行。基于以太坊的代币可以代表价值和服务,创新公司将这些代币作为内部货币,在生态系统内进行买卖和交易。

现在,以太坊支持代币开发,其社区也制定了一些标准,以确保在以太坊上创建的代币可以与各种现有的生态系统兼容,并满足特定的用户需求。你应该知道,以太坊也允许用户创建一个可替换的代币,而不需要遵守任何ERC标准。

这些类型的代币缺乏与以太坊上其他任何东西的兼容性,如Defi交易所和钱包。因此,ERC代币标准对于提出构建各种智能合约的基本准则至关重要。这些标准不时演变,为ERC代币开发提供更好的接口,以便企业能够满足其特定的用户需求。

这一见解增加了对以太坊代币标准的深入分析,以及对当今领先的四大ERC代币标准的深入研究 ----- ERC20与ERC721与ERC1155。

## 什么是以太坊的ERC?

ERC是Ethereum Request for Comments的首字母缩写。它就像技术文档,定义了适用于一群想要利用以太坊生态系统的开发者和用户的方法、行为、创新和研究。

你可能想知道谁有权力创建和管理ERC。以太坊的智能合约程序员负责编写ERC相关文件,以描述每个基于以太坊的Token必须遵守的一系列规则。他们还经常审查这些文件,并对其进行评论以进一步改进。

要轻松理解ERC,可以考虑成立一个工程任务组,向开发人员传达技术说明和规则,如果每个人都想利用特定生态系统的好处,那么他们都需要遵守这些技术说明和规则。

## 什么是ERC代币标准?

ERC代币标准解释了所有建立在以太坊区块链上的ERC代币的某些规则。以太坊的社区会适当审查这套规则,并根据不断变化的要求进行修订。此外,ERC标准的设计是为了让ERC代币能够无缝互动。

ERC-20、ERC-721和ERC-1155作为三种流行的ERC代币标准或协议出现,在各大行业都有其应用。以太坊社区完全批准了这些代币标准,它们在具体特征和功能方面有所不同。

在了解代币标准的具体含义或工作原理之前,我们首先应该了解以太坊上智能合约标准的要点。以下语句对其进行了定义。

智能合约描述了智能合约程序员应遵守的规则,以利用以太坊网络的潜在优势。

这些标准适用于支持智能合约和去中心化应用(dApps)开发的区块链。

智能合约标准包含代币标准、库的主题与格式、名称注册和相关细节。

ERC代币标准只是智能合约标准的另一个名称。以太坊上的智能合约必须遵守标准或规则,以实现代币创建、交易处理、支出等基本功能。通过引入改进的ERC标准,以太坊释放了其生态系统的真正潜力,并授权开发更具体的智能合约,促进网络的增长。

## 以太坊代币标准的演变

以太坊持续推出不同的ERC代币标准,以使生态系统更易于使用,并支持各种用例。从ERC-20到ERC-721再到ERC-1155,以太坊社区成功地将此区块链打造成一个永远不会过时的主流协议。

下面,我们讨论了以太坊代币标准到目前为止是如何发展的,以及目前与之相关的不同ERC令牌标准。因此,我们将研究全世界企业和用户在以太坊区块链上的增长范围和发展机会。

![1.png](https://img.learnblockchain.cn/attachments/2022/06/T8wJyNJK629d516a3dad5.png!/scale/40)

![](https://cdn.jsdelivr.net/gh/hicoldcat/assets@main/img/微信截图_20220605110631.png)

## ERC-20代币标准

ERC-20在2015年首次被提出,两年后的2017年,最终融入以太坊生态系统。ERC-20介绍了在以太坊区块链上创建可互换代币的代币标准。简单地说,ERC-20由支持开发相同代币的属性组成。

例如,表示货币的ERC-20代币可以像以太坊的原生货币--以太币一样工作。这意味着1个代币将永远等于另一个代币的价值,并且可以相互交换。ERC 20代币为可替换代币的发展设定了标准,但可替换代币实际上能代表什么?让我们来看看它们。

- 任何在线平台的信誉值。

- 彩票和计划。

- 金融资产,如公司的股份、红利和股票。

- 法定货币,包括美元。

- 黄金盎司,以及更多...

以太坊需要一个强大的标准来实现整个运营的统一,以支持代币开发并在区块链网络上对其进行监管。这就是为什么ERC-20可以进入游戏领域。

去中心化世界的开发者为了不同的目的,广泛使用ERC-20代币标准,比如开发可互操作的代币应用,与以太坊生态系统中的其他产品和服务兼容。

### ERC-20代币的特点

- ERC 20代币是 "可替代性代币 "的另一个名称。

- 可替代性定义了资产或代币兑换相同价值资产的能力,例如两张1美元纸币。

- 无论其特征和结构如何,每个ERC-20代币都严格等同于相同的价值。

- ERC代币最受欢迎的应用领域是稳定币、治理代币和ICO。

## ERC-721:不可互换的代币

要了解ERC-721标准,你必须首先了解NFTs(不可替代的代币)。看看我们解释NFTs的详细见解,以及它们在区块链的去中心化世界中的作用。

Cryptokitties(广为流传的非同质化代币)的创始人、CTO Dieter Shirley最初提议开发一种新的代币类型来支持NFTs。该提案将于2018年晚些时候获得批准。它专门用于NFTs,这意味着遵守ERC-721的规则开发的代币可以代表以太坊区块链上任何数字资产的价值。

至此,我们得出结论:如果ERC-20对于发明新的加密货币至关重要,那么ERC-721对于代表某个人对这些数字资产所有权的证明来说是很有价值的。ERC-721可以表示以下内容:

- 一个独特的数字艺术品

- 推文和社交媒体文章

- 游戏中的收藏品

- 游戏人物

- 任何卡通人物和数以百万计的其他NFTs....

这种特殊类型的代币为利用NFTs的企业带来了惊人的可能性。同样,ERC-721也为他们带来了挑战,为了应对这些挑战,ERC-721标准开始发挥作用。

请注意,每个NFTs都有一个uint256变量,称为tokenId。因此,对于每个EBR-721合同,合同地址键值对 uint256 tokenId必须是唯一的。

此外,dApps还应该有一个 "converter"来调节NFTs的输入和输出过程。例如,converter将tokenId视为输入,并输出不可伪造的代币,如僵尸图像、杀戮、游戏收藏品等。

### ERC-721代币的特点

- ERC-721代币是不可伪造的代币(NFTs)的标准。

- 这些代币不能被兑换成同等价值的东西,因为它们是独一无二的。

- 每个ERC-721代表各自NFT的价值,可能有所不同。

- ERC-721代币最受欢迎的应用领域是游戏中的NFTs。

## ERC-1155:多代币标准

结合ERC-20和ERC-720的能力,Witek Radomski(Enjin的首席技术官)为Ethereum智能合约引入了一个包罗万象的代币标准。这是一个标准接口,支持开发同质化的、半同质化的、非同质化的代币和其他配置的通用智能合约。

现在,您可以使用单个接口满足所有代币开发需求并解决问题,从而使ERC-1155成为游戏规则的改变者。这样一个独特的代币标准的想法是开发一个强大的智能合约接口,代表和管理不同形式的ERC代币。

ERC-1155的另一个优点是,它改善了以前ERC代币标准的整体功能,使以太坊生态系统更加高效和可扩展。

### ERC-1155代币的特点

- ERC-1155是一个智能合约接口,代表同质化的、半同质化的和非同质化的代币。

- ERC-1155可以执行ERC-20和ERC-720的功能,甚至可以同时执行两者。

- 每个代币都可以根据代币的性质代表不同的价值;同质化的、半同质化的和非同质化的。

- ERC-1155适用于创建NFT、可兑换购物券、ICO等。

## ERC-20、ERC-721和ERC-1155的接口是怎样的?

### ERC-20

以下是ERC20的基本接口,描述了ERC20合约的功能和事件特征,接下来是对每个给定功能的解释。

```sol

contract ERC20 {

event Transfer(address indexed from, address indexed to, uint256 value);

event Approval(

address indexed owner,

address indexed spender,

uint256 value

);

function totalSupply() public view returns (uint256);

function balanceOf(address who) public view returns (uint256);

function transfer(address to, uint256 value) public returns (bool);

function allowance(address owner, address spender)

public

view

returns (uint256);

function transferFrom(

address from,

address to,

uint256 value

) public returns (bool);

function approve(address spender, uint256 value) public returns (bool);

}

```

以下是ERC-20智能合约接口的特点和组成部分。

#### totalsupply

函数totalSupply是公开的,因此所有人都可以访问。它显示了目前正在流通的代币的总数。由于这个totalSupply函数被标记为视图修改器,所以它不消耗gas。此外,每当有新的代币被铸造出来,它就会更新内部的代币值totalSupply。

```

// its value is increased when new tokens are minteduint256 totalSupply_;

// access the value of totalSupply_function totalSupply() public view returns (uint256) { return totalSupply_;}

```

#### balanceOf

balanceOf是另一个带有视图修改器的公共函数,每个人都能访问,而且是不消耗gas的。它接受以太坊地址并返回该地址拥有的代币数量。

```

// Updated when tokens are minted or transferredmapping(address => uint256) balances;

// Returns tokens held by the address passed as _ownerfunction balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner];}

```

#### transfer

transfer函数与上述两个功能不同,因为它需gas,而且会导致以太坊智能合约的变化。应各代币持有人的请求,它将代币从一个地址转移到另一个地址。

```

function transfer(address _to, uint256 _value) public returns (bool) {

// Check for blank addresses

require(_to != address(0));

// Check to ensure valid transfer

require(_value <= balances[msg.sender]);

// SafeMath.sub will throw if there is not enough balance.

balances[msg.sender] = balances[msg.sender].sub(_value);

balances[_to] = balances[_to].add(_value);

// Event transfer defined in the ERC 20 interface above

Transfer(msg.sender, _to, _value);

return true;

}

```

#### allowance, approve and transferFrom

最后的函数 allowance, approve, 和 transferFrom 支持如授权其他一些以太坊地址代表各自的持有人使用代币的高级功能。

### ERC-721

为了了解ERC-721是如何工作的,让我们看看它内部的接口。

```sol

contract ERC721 {

event Transfer(

address indexed _from,

address indexed _to,

uint256 _tokenId

);

event Approval(

address indexed _owner,

address indexed _approved,

uint256 _tokenId

);

function balanceOf(address _owner) public view returns (uint256 _balance);

function ownerOf(uint256 _tokenId) public view returns (address _owner);

function transfer(address _to, uint256 _tokenId) public;

function approve(address _to, uint256 _tokenId) public;

function takeOwnership(uint256 _tokenId) public;

}

```

#### balanceOf

在下面的片段中, ownedTokens表示一个特定地址的完整的代币ID列表。而balanceOf函数返回该地址的代币数量。

```

mapping (address => uint256[]) private ownedTokens;

function balanceOf(address _owner) public view returns (uint256) { return ownedTokens[_owner].length; }

```

#### OwnerOf

映射token所有者拥有的token,并输出该持有者的id。然而,由于它的可见性被设置为私有,通过使用ownerOf函数,你可以将这个映射的值设置为公共。同时它还需要在返回值之前对零地址进行检查。

```

mapping (uint256 => address) private tokenOwner;

function ownerOf(uint256 _tokenId) public view returns (address) {

address owner = tokenOwner[_tokenId];

require(owner != address(0));

return owner;

}

```

#### transfer

这个transfer函数将要转给的所有者的账户地址作为_to参数,要转移的token的id作为_tokenId参数,同时注意,它只能由token的当前所有者调用。它必须包括检查转移是否清除转移所需的批准检查的逻辑。然后是从当前所有者中移除令牌的所有权并将其添加到新所有者拥有的令牌列表的逻辑。

```

modifier onlyOwnerOf(uint256 _tokenId) { require(ownerOf(_tokenId) == msg.sender); _; }function transfer(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) { // Logic to clear approval for token transfer // Logic to remove token from current token owner // Logic to add Token to new token owner }

```

#### approve

Approve 是另一个函数,用于声明给定令牌ID的所有权。它被一个只有OwnerOf的修饰语所限制,这说明只有代币持有者可以出于明确的原因访问这个函数。

```

mapping (uint256 => address) private tokenApprovals;

modifier onlyOwnerOf(uint256 _tokenId) {

require(ownerOf(_tokenId) == msg.sender);

_;

}

function approvedFor(uint256 _tokenId) public view returns (address) {

return tokenApprovals[_tokenId];

}

function approve(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) {

address owner = ownerOf(_tokenId);

require(_to != owner);

if (approvedFor(_tokenId) != 0 || _to != 0) {

tokenApprovals[_tokenId] = _to;

// Event initialised in the interface above

Approval(owner, _to, _tokenId);

}

}

```

#### takeOwnership

函数takeOwnership接收_tokenId并对消息发送者进行同样的检查。如果他通过了类似于转移函数的检查逻辑,他必须返回拥有_tokenID的所有权账户地址。

```

function isApprovedFor(address _owner, uint256 _tokenId) internal view returns (bool) {

return approvedFor(_tokenId) == _owner;

}

function takeOwnership(uint256 _tokenId) public { require(isApprovedFor(msg.sender, _tokenId));

// Logic to clear approval for token transfer

// Logic to remove token from current token owner

// Logic to add Token to new token owner}

```

### ERC-1155

#### Batch Transfers

批量转移与常规ERC-20转移密切相关。让我们来看看ERC-20 transferFrom函数。

```

// ERC-20function transferFrom(address from, address to, uint256 value) external returns (bool);

// ERC-1155function

safeBatchTransferFrom(address _from,address _to,uint256[] calldata _ids,uint256[] calldata _values,bytes calldata _data) external;

```

ERC-1155的不同之处在于将令牌值作为一个数组和一个id数组传递。转移的结果是这样的。

- 将200个ID为5的代币从_from转移到_to。

- 将300个ID为7的代币从_from转到_to。

- 从_from 转移3个id为15的代币到_to。

除了利用ERC-1155的函数作为transferFrom,没有转移,你可以通过设置表格地址到调用函数的地址来利用它作为常规转移。

#### Batch Balance

相较于的ERC-20 balanceOf调用,同样具有其支持批处理的功能。提醒一下,这是ERC-20版本:

```

// ERC-20function balanceOf(address owner) external view returns (uint256);// ERC-1155function balanceOfBatch(address[] calldata _owners,uint256[] calldata _ids) external view returns (uint256[] memory);

```

对于余额调用来说更简单,我们可以在一次调用中检索到多个余额。我们传递所有者的数组,然后是令牌ID的数组。

例如,给定_ids=[3, 6, 13]和_owners=[0xbeef..., 0x1337..., 0x1111...],返回值将是:

```

[balanceOf(0xbeef...),balanceOf(0x1337...),balanceOf(0x1111...)]

```

#### Batch Approval

```

// ERC-1155function setApprovalForAll(address _operator,bool _approved) external;function isApprovedForAll(address _owner,address _operator) external view returns (bool);

```

这里的approvals 与ERC-20略有不同。你需要使用setApprovalForAll将操作员设置为已批准或未批准,而不是批准特定的金额。

#### Receive Hook

```

function onERC1155BatchReceived(address _operator,address _from,uint256[] calldata _ids,uint256[] calldata _values,bytes calldata _data) external returns(bytes4);

```

ERC-1155只支持智能合约的接收钩子。钩子函数必须返回一个预定义的magic bytes4值,如下所示。

```

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

```

一旦接收合约返回这个值,我们就认为该合约现在可以接受转让,而且它了解如何管理ERC-1155代币。这就完成了!

## ERC20 vs. ERC721 vs. ERC1155 比较

如果你想在以太坊区块链上创建任何种类的代币,那么你必须知道ERC-20、ERC721和ERC之间的区别。能够区分这些最普遍的ERC,你就可以选择正确的代币标准,完美地符合你的业务特定需求。

| 技术规格 | ERC-20 | ERC-721 | ERC-1155 |

| :------ | :------ | :------ | :------- |

| 使用的便利性 | 每笔交易需要进行单一操作 | 每笔交易需要进行单一操作 | 允许在一次交易中进行多项操作 |

| BME(燃烧和铸造)模型 | 没有 | 有 | 有 |

| 支持的代币 | 同质化代币 | 非同质化代币 | 同质化和非同质代币 |

| KYC核查 | 不需要KYC验证 | 内建的KYC/AML | 内建的KYC/AML |

| 用例 | Bianance Coin, Maker, OmiseGo | Decentraland, Cryptokitties, Ethermon | Reedemable shopping vouchers |

| 智能合约 | 需要一个共同的智能合约 | 要求每个代币有一个独特的智能合约 | 需要一个单一的智能合约来实现无限的代币 |

| 效率 | 需要更多的存储空间 | 可能需要更多的存储空间 | 需要更少的存储空间 |

| 代币转移 | 可以一次转移1或2个代币 | 支持单一代币一次性转移 | 支持许多代币的批量转移 |

| 本地化 | 支持单一语言 | 支持单一语言 | 支持语言的本地化 |

| 转移类型 | 用户之间的价值转移 | 权利的转让 | 价值或权利的转让 |

### ERC-20, ERC-721, ERC-1155, ERC-下一步是什么?

以太坊代币标准还有哪些变化?为了给出这个问题的合适答案,让我们简要概述即将推出的ERC代币标准及其对以太坊智能合约的潜在影响。

#### ERC-3475: 多重可赎回债券

ERC-3475是以太坊社区推出的最新智能合约标准,支持创建可管理多种可赎回或可赎回债券的代币。使用ERC-3475,企业可以存储债券的集体信息,推出各种类型的债券,在现有的债券中整合额外的功能和特性,这对去中心化金融市场的发展至关重要。

#### ERC-3475是如何工作的?

- ERC-20是目前全球流行的LP(流动性提供者)代币,但它需要为每个代币部署单独的智能合约。考虑到这一点,ERC-3475为债券的发行者提供了多次债券赎回的便利。

- 通过这样做,这个新的ERC标准证明是一个真正的突破,帮助以太坊区块链用户为现有的分散债券市场建立更好的基础设施。

- ERC-3475可以有效地管理多个可赎回的债券,存储大量的数据而不需要消耗很多gas。因此,它具有成本效益。

## ERC20、ERC721或ERC1155的具体使用案例是什么?

即使以太坊旨在通过每一个新的ERC标准使代币开发成为一个简单的过程,但我们必须同意,所有现有的代币标准在今天都是相关的,并且与不同行业及其特定的用户需求相关。以下是ERC代币的具体使用案例。

#### ERC-20的使用案例

ERC-20代表了可替代资产的价值,对于组织众筹活动、发行ICO和在市场上推出更多的加密货币是非常有用的。

#### ERC-721的使用案例

ERC-721代表某人对数字资产的所有权,主要用作游戏行业的NFT,NFT市场和Metaverse平台。

#### ERC-1155的使用案例

多用途代币标准--ERC1155,经常用于网络游戏。现在的游戏有可替代的元素,如生命/能量,NFT如游戏角色,和可替代的原生货币来交换价值。

## 总结

以太坊发布新代币标准的动机是为了应对区块链世界不断发展的变化。每个ERC代币标准的独特功能对希望利用Ethereum的不同企业和开发者来说都是一种好处。三种代币ERC20、ERC721和ERC1155目前在数字生态系统中是非常有效和包容的。然而,以太坊代币标准的不断发展,可能会在未来几年内带来区块链的根本性进步。

![my.png](https://img.learnblockchain.cn/attachments/2022/06/WUPIuX01629d51cdc3652.png!/scale/15)

> 原文:[https://www.leewayhertz.com/erc-20-vs-erc-721-vs-erc-1155/](https://www.leewayhertz.com/erc-20-vs-erc-721-vs-erc-1155/)

> 翻译:李留白

以太坊的开发是为了解决第一代区块链--比特币的局限性。Vitalik Bueterin提出了具有集成智能合约功能的开源区块链的想法,以扩大区块链在各主要行业的使用案例。被誉为100%可编程的以太坊生态系统欢迎全世界的区块链爱好者在其生态系统的基础上开发区块链驱动的解决方案,并为增长做出贡献。

以太坊代币开发是普遍存在的开发机会之一,它维护了整个网络和众多相互关联的项目同时运行。基于以太坊的代币可以代表价值和服务,创新公司将这些代币作为内部货币,在生态系统内进行买卖和交易。

现在,以太坊支持代币开发,其社区也制定了一些标准,以确保在以太坊上创建的代币可以与各种现有的生态系统兼容,并满足特定的用户需求。你应该知道,以太坊也允许用户创建一个可替换的代币,而不需要遵守任何ERC标准。

这些类型的代币缺乏与以太坊上其他任何东西的兼容性,如Defi交易所和钱包。因此,ERC代币标准对于提出构建各种智能合约的基本准则至关重要。这些标准不时演变,为ERC代币开发提供更好的接口,以便企业能够满足其特定的用户需求。

这一见解增加了对以太坊代币标准的深入分析,以及对当今领先的四大ERC代币标准的深入研究 ----- ERC20与ERC721与ERC1155。

什么是以太坊的ERC?

ERC是Ethereum Request for Comments的首字母缩写。它就像技术文档,定义了适用于一群想要利用以太坊生态系统的开发者和用户的方法、行为、创新和研究。

你可能想知道谁有权力创建和管理ERC。以太坊的智能合约程序员负责编写ERC相关文件,以描述每个基于以太坊的Token必须遵守的一系列规则。他们还经常审查这些文件,并对其进行评论以进一步改进。

要轻松理解ERC,可以考虑成立一个工程任务组,向开发人员传达技术说明和规则,如果每个人都想利用特定生态系统的好处,那么他们都需要遵守这些技术说明和规则。

什么是ERC代币标准?

ERC代币标准解释了所有建立在以太坊区块链上的ERC代币的某些规则。以太坊的社区会适当审查这套规则,并根据不断变化的要求进行修订。此外,ERC标准的设计是为了让ERC代币能够无缝互动。

ERC-20、ERC-721和ERC-1155作为三种流行的ERC代币标准或协议出现,在各大行业都有其应用。以太坊社区完全批准了这些代币标准,它们在具体特征和功能方面有所不同。

在了解代币标准的具体含义或工作原理之前,我们首先应该了解以太坊上智能合约标准的要点。以下语句对其进行了定义。

智能合约描述了智能合约程序员应遵守的规则,以利用以太坊网络的潜在优势。

这些标准适用于支持智能合约和去中心化应用(dApps)开发的区块链。

智能合约标准包含代币标准、库的主题与格式、名称注册和相关细节。

ERC代币标准只是智能合约标准的另一个名称。以太坊上的智能合约必须遵守标准或规则,以实现代币创建、交易处理、支出等基本功能。通过引入改进的ERC标准,以太坊释放了其生态系统的真正潜力,并授权开发更具体的智能合约,促进网络的增长。

以太坊代币标准的演变

以太坊持续推出不同的ERC代币标准,以使生态系统更易于使用,并支持各种用例。从ERC-20到ERC-721再到ERC-1155,以太坊社区成功地将此区块链打造成一个永远不会过时的主流协议。

下面,我们讨论了以太坊代币标准到目前为止是如何发展的,以及目前与之相关的不同ERC令牌标准。因此,我们将研究全世界企业和用户在以太坊区块链上的增长范围和发展机会。

ERC-20代币标准

ERC-20在2015年首次被提出,两年后的2017年,最终融入以太坊生态系统。ERC-20介绍了在以太坊区块链上创建可互换代币的代币标准。简单地说,ERC-20由支持开发相同代币的属性组成。

例如,表示货币的ERC-20代币可以像以太坊的原生货币--以太币一样工作。这意味着1个代币将永远等于另一个代币的价值,并且可以相互交换。ERC 20代币为可替换代币的发展设定了标准,但可替换代币实际上能代表什么?让我们来看看它们。

任何在线平台的信誉值。

彩票和计划。

金融资产,如公司的股份、红利和股票。

法定货币,包括美元。

黄金盎司,以及更多...

以太坊需要一个强大的标准来实现整个运营的统一,以支持代币开发并在区块链网络上对其进行监管。这就是为什么ERC-20可以进入游戏领域。

去中心化世界的开发者为了不同的目的,广泛使用ERC-20代币标准,比如开发可互操作的代币应用,与以太坊生态系统中的其他产品和服务兼容。

ERC-20代币的特点

ERC 20代币是 "可替代性代币 "的另一个名称。

可替代性定义了资产或代币兑换相同价值资产的能力,例如两张1美元纸币。

无论其特征和结构如何,每个ERC-20代币都严格等同于相同的价值。

ERC代币最受欢迎的应用领域是稳定币、治理代币和ICO。

ERC-721:不可互换的代币

要了解ERC-721标准,你必须首先了解NFTs(不可替代的代币)。看看我们解释NFTs的详细见解,以及它们在区块链的去中心化世界中的作用。

Cryptokitties(广为流传的非同质化代币)的创始人、CTO Dieter Shirley最初提议开发一种新的代币类型来支持NFTs。该提案将于2018年晚些时候获得批准。它专门用于NFTs,这意味着遵守ERC-721的规则开发的代币可以代表以太坊区块链上任何数字资产的价值。

至此,我们得出结论:如果ERC-20对于发明新的加密货币至关重要,那么ERC-721对于代表某个人对这些数字资产所有权的证明来说是很有价值的。ERC-721可以表示以下内容:

一个独特的数字艺术品

推文和社交媒体文章

游戏中的收藏品

游戏人物

任何卡通人物和数以百万计的其他NFTs....

这种特殊类型的代币为利用NFTs的企业带来了惊人的可能性。同样,ERC-721也为他们带来了挑战,为了应对这些挑战,ERC-721标准开始发挥作用。

请注意,每个NFTs都有一个uint256变量,称为tokenId。因此,对于每个EBR-721合同,合同地址键值对 uint256 tokenId必须是唯一的。

此外,dApps还应该有一个 "converter"来调节NFTs的输入和输出过程。例如,converter将tokenId视为输入,并输出不可伪造的代币,如僵尸图像、杀戮、游戏收藏品等。

ERC-721代币的特点

ERC-721代币是不可伪造的代币(NFTs)的标准。

这些代币不能被兑换成同等价值的东西,因为它们是独一无二的。

每个ERC-721代表各自NFT的价值,可能有所不同。

ERC-721代币最受欢迎的应用领域是游戏中的NFTs。

ERC-1155:多代币标准

结合ERC-20和ERC-720的能力,Witek Radomski(Enjin的首席技术官)为Ethereum智能合约引入了一个包罗万象的代币标准。这是一个标准接口,支持开发同质化的、半同质化的、非同质化的代币和其他配置的通用智能合约。

现在,您可以使用单个接口满足所有代币开发需求并解决问题,从而使ERC-1155成为游戏规则的改变者。这样一个独特的代币标准的想法是开发一个强大的智能合约接口,代表和管理不同形式的ERC代币。

ERC-1155的另一个优点是,它改善了以前ERC代币标准的整体功能,使以太坊生态系统更加高效和可扩展。

ERC-1155代币的特点

ERC-1155是一个智能合约接口,代表同质化的、半同质化的和非同质化的代币。

ERC-1155可以执行ERC-20和ERC-720的功能,甚至可以同时执行两者。

每个代币都可以根据代币的性质代表不同的价值;同质化的、半同质化的和非同质化的。

ERC-1155适用于创建NFT、可兑换购物券、ICO等。

ERC-20、ERC-721和ERC-1155的接口是怎样的?

ERC-20

以下是ERC20的基本接口,描述了ERC20合约的功能和事件特征,接下来是对每个给定功能的解释。

contract ERC20 {

event Transfer(address indexed from, address indexed to, uint256 value);

event Approval(

address indexed owner,

address indexed spender,

uint256 value

);

function totalSupply() public view returns (uint256);

function balanceOf(address who) public view returns (uint256);

function transfer(address to, uint256 value) public returns (bool);

function allowance(address owner, address spender)

public

view

returns (uint256);

function transferFrom(

address from,

address to,

uint256 value

) public returns (bool);

function approve(address spender, uint256 value) public returns (bool);

}

以下是ERC-20智能合约接口的特点和组成部分。

totalsupply

函数totalSupply是公开的,因此所有人都可以访问。它显示了目前正在流通的代币的总数。由于这个totalSupply函数被标记为视图修改器,所以它不消耗gas。此外,每当有新的代币被铸造出来,它就会更新内部的代币值totalSupply。

// its value is increased when new tokens are minteduint256 totalSupply_;

// access the value of totalSupply_function totalSupply() public view returns (uint256) { return totalSupply_;}

balanceOf

balanceOf是另一个带有视图修改器的公共函数,每个人都能访问,而且是不消耗gas的。它接受以太坊地址并返回该地址拥有的代币数量。

// Updated when tokens are minted or transferredmapping(address => uint256) balances;

// Returns tokens held by the address passed as _ownerfunction balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner];}

transfer

transfer函数与上述两个功能不同,因为它需gas,而且会导致以太坊智能合约的变化。应各代币持有人的请求,它将代币从一个地址转移到另一个地址。

function transfer(address _to, uint256 _value) public returns (bool) {

// Check for blank addresses

require(_to != address(0));

// Check to ensure valid transfer

require(_value <= balances[msg.sender]);

// SafeMath.sub will throw if there is not enough balance.

balances[msg.sender] = balances[msg.sender].sub(_value);

balances[_to] = balances[_to].add(_value);

// Event transfer defined in the ERC 20 interface above

Transfer(msg.sender, _to, _value);

return true;

}

allowance, approve and transferFrom

最后的函数 allowance, approve, 和 transferFrom 支持如授权其他一些以太坊地址代表各自的持有人使用代币的高级功能。

ERC-721

为了了解ERC-721是如何工作的,让我们看看它内部的接口。

contract ERC721 {

event Transfer(

address indexed _from,

address indexed _to,

uint256 _tokenId

);

event Approval(

address indexed _owner,

address indexed _approved,

uint256 _tokenId

);

function balanceOf(address _owner) public view returns (uint256 _balance);

function ownerOf(uint256 _tokenId) public view returns (address _owner);

function transfer(address _to, uint256 _tokenId) public;

function approve(address _to, uint256 _tokenId) public;

function takeOwnership(uint256 _tokenId) public;

}

balanceOf

在下面的片段中, ownedTokens表示一个特定地址的完整的代币ID列表。而balanceOf函数返回该地址的代币数量。

mapping (address => uint256[]) private ownedTokens;

function balanceOf(address _owner) public view returns (uint256) { return ownedTokens[_owner].length; }

OwnerOf

映射token所有者拥有的token,并输出该持有者的id。然而,由于它的可见性被设置为私有,通过使用ownerOf函数,你可以将这个映射的值设置为公共。同时它还需要在返回值之前对零地址进行检查。

mapping (uint256 => address) private tokenOwner;

function ownerOf(uint256 _tokenId) public view returns (address) {

address owner = tokenOwner[_tokenId];

require(owner != address(0));

return owner;

}

transfer

这个transfer函数将要转给的所有者的账户地址作为_to参数,要转移的token的id作为_tokenId参数,同时注意,它只能由token的当前所有者调用。它必须包括检查转移是否清除转移所需的批准检查的逻辑。然后是从当前所有者中移除令牌的所有权并将其添加到新所有者拥有的令牌列表的逻辑。

modifier onlyOwnerOf(uint256 _tokenId) { require(ownerOf(_tokenId) == msg.sender); _; }function transfer(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) { // Logic to clear approval for token transfer // Logic to remove token from current token owner // Logic to add Token to new token owner }

approve

Approve 是另一个函数,用于声明给定令牌ID的所有权。它被一个只有OwnerOf的修饰语所限制,这说明只有代币持有者可以出于明确的原因访问这个函数。

mapping (uint256 => address) private tokenApprovals;

modifier onlyOwnerOf(uint256 _tokenId) {

require(ownerOf(_tokenId) == msg.sender);

_;

}

function approvedFor(uint256 _tokenId) public view returns (address) {

return tokenApprovals[_tokenId];

}

function approve(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) {

address owner = ownerOf(_tokenId);

require(_to != owner);

if (approvedFor(_tokenId) != 0 || _to != 0) {

tokenApprovals[_tokenId] = _to;

// Event initialised in the interface above

Approval(owner, _to, _tokenId);

}

}

takeOwnership

函数takeOwnership接收_tokenId并对消息发送者进行同样的检查。如果他通过了类似于转移函数的检查逻辑,他必须返回拥有_tokenID的所有权账户地址。

function isApprovedFor(address _owner, uint256 _tokenId) internal view returns (bool) {

return approvedFor(_tokenId) == _owner;

}

function takeOwnership(uint256 _tokenId) public { require(isApprovedFor(msg.sender, _tokenId));

// Logic to clear approval for token transfer

// Logic to remove token from current token owner

// Logic to add Token to new token owner}

ERC-1155

Batch Transfers

批量转移与常规ERC-20转移密切相关。让我们来看看ERC-20 transferFrom函数。

// ERC-20function transferFrom(address from, address to, uint256 value) external returns (bool);

// ERC-1155function

safeBatchTransferFrom(address _from,address _to,uint256[] calldata _ids,uint256[] calldata _values,bytes calldata _data) external;

ERC-1155的不同之处在于将令牌值作为一个数组和一个id数组传递。转移的结果是这样的。

将200个ID为5的代币从_from转移到_to。

将300个ID为7的代币从_from转到_to。

从_from 转移3个id为15的代币到_to。

除了利用ERC-1155的函数作为transferFrom,没有转移,你可以通过设置表格地址到调用函数的地址来利用它作为常规转移。

Batch Balance

相较于的ERC-20 balanceOf调用,同样具有其支持批处理的功能。提醒一下,这是ERC-20版本:

// ERC-20function balanceOf(address owner) external view returns (uint256);// ERC-1155function balanceOfBatch(address[] calldata _owners,uint256[] calldata _ids) external view returns (uint256[] memory);

对于余额调用来说更简单,我们可以在一次调用中检索到多个余额。我们传递所有者的数组,然后是令牌ID的数组。

例如,给定_ids=[3, 6, 13]和_owners=[0xbeef..., 0x1337..., 0x1111...],返回值将是:

[balanceOf(0xbeef...),balanceOf(0x1337...),balanceOf(0x1111...)]

Batch Approval

// ERC-1155function setApprovalForAll(address _operator,bool _approved) external;function isApprovedForAll(address _owner,address _operator) external view returns (bool);

这里的approvals 与ERC-20略有不同。你需要使用setApprovalForAll将操作员设置为已批准或未批准,而不是批准特定的金额。

Receive Hook

function onERC1155BatchReceived(address _operator,address _from,uint256[] calldata _ids,uint256[] calldata _values,bytes calldata _data) external returns(bytes4);

ERC-1155只支持智能合约的接收钩子。钩子函数必须返回一个预定义的magic bytes4值,如下所示。

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

一旦接收合约返回这个值,我们就认为该合约现在可以接受转让,而且它了解如何管理ERC-1155代币。这就完成了!

ERC20 vs. ERC721 vs. ERC1155 比较

如果你想在以太坊区块链上创建任何种类的代币,那么你必须知道ERC-20、ERC721和ERC之间的区别。能够区分这些最普遍的ERC,你就可以选择正确的代币标准,完美地符合你的业务特定需求。

技术规格

ERC-20

ERC-721

ERC-1155

使用的便利性

每笔交易需要进行单一操作

每笔交易需要进行单一操作

允许在一次交易中进行多项操作

BME(燃烧和铸造)模型

没有

支持的代币

同质化代币

非同质化代币

同质化和非同质代币

KYC核查

不需要KYC验证

内建的KYC/AML

内建的KYC/AML

用例

Bianance Coin, Maker, OmiseGo

Decentraland, Cryptokitties, Ethermon

Reedemable shopping vouchers

智能合约

需要一个共同的智能合约

要求每个代币有一个独特的智能合约

需要一个单一的智能合约来实现无限的代币

效率

需要更多的存储空间

可能需要更多的存储空间

需要更少的存储空间

代币转移

可以一次转移1或2个代币

支持单一代币一次性转移

支持许多代币的批量转移

本地化

支持单一语言

支持单一语言

支持语言的本地化

转移类型

用户之间的价值转移

权利的转让

价值或权利的转让

ERC-20, ERC-721, ERC-1155, ERC-下一步是什么?

以太坊代币标准还有哪些变化?为了给出这个问题的合适答案,让我们简要概述即将推出的ERC代币标准及其对以太坊智能合约的潜在影响。

ERC-3475: 多重可赎回债券

ERC-3475是以太坊社区推出的最新智能合约标准,支持创建可管理多种可赎回或可赎回债券的代币。使用ERC-3475,企业可以存储债券的集体信息,推出各种类型的债券,在现有的债券中整合额外的功能和特性,这对去中心化金融市场的发展至关重要。

ERC-3475是如何工作的?

ERC-20是目前全球流行的LP(流动性提供者)代币,但它需要为每个代币部署单独的智能合约。考虑到这一点,ERC-3475为债券的发行者提供了多次债券赎回的便利。

通过这样做,这个新的ERC标准证明是一个真正的突破,帮助以太坊区块链用户为现有的分散债券市场建立更好的基础设施。

ERC-3475可以有效地管理多个可赎回的债券,存储大量的数据而不需要消耗很多gas。因此,它具有成本效益。

ERC20、ERC721或ERC1155的具体使用案例是什么?

即使以太坊旨在通过每一个新的ERC标准使代币开发成为一个简单的过程,但我们必须同意,所有现有的代币标准在今天都是相关的,并且与不同行业及其特定的用户需求相关。以下是ERC代币的具体使用案例。

ERC-20的使用案例

ERC-20代表了可替代资产的价值,对于组织众筹活动、发行ICO和在市场上推出更多的加密货币是非常有用的。

ERC-721的使用案例

ERC-721代表某人对数字资产的所有权,主要用作游戏行业的NFT,NFT市场和Metaverse平台。

ERC-1155的使用案例

多用途代币标准--ERC1155,经常用于网络游戏。现在的游戏有可替代的元素,如生命/能量,NFT如游戏角色,和可替代的原生货币来交换价值。

总结

以太坊发布新代币标准的动机是为了应对区块链世界不断发展的变化。每个ERC代币标准的独特功能对希望利用Ethereum的不同企业和开发者来说都是一种好处。三种代币ERC20、ERC721和ERC1155目前在数字生态系统中是非常有效和包容的。然而,以太坊代币标准的不断发展,可能会在未来几年内带来区块链的根本性进步。

原文:https://www.leewayhertz.com/erc-20-vs-erc-721-vs-erc-1155/

翻译:李留白

学分: 42

分类: 智能合约

标签:

ERC20 

ERC721 

ERC1155 

点赞 4

收藏 3

分享

Twitter分享

微信扫码分享

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

你可能感兴趣的文章

离线授权 NFT EIP-4494:ERC721 -Permit

816 浏览

花式发币法之发行各类 ERC20 代币

3968 浏览

Michael.W基于Foundry精读Openzeppelin第39期——ERC20.sol

506 浏览

Solidity实战系列 - (NFT - 质押 - 锁仓 - ERC1155 - 兑换)

703 浏览

Gnosis的ConditionalTokens解读

908 浏览

教程:如何在没有 Web 界面的情况下创建 ERC20桥

1574 浏览

相关问题

请教下大家,Swap如何实现卖币手续费

2 回答

如何从发起部署的地址中,转移一部分代币到已经部署的合约地址中,麻烦那位大佬看一下

5 回答

空投的默克尔树如何防止生日攻击?

2 回答

bsc链上的erc20合约,要求只有一点买卖的时候2%兑换成bnb发送到营销钱包,现在的问题是添加流动性会一直报错Fail with error 'TransferHelper::transferFrom: transferFrom failed'

2 回答

eth中如何判断合约是erc20合约

2 回答

Solidity怎么能正常获取销毁后所有者名下的所有ERC721数组

1 回答

0 条评论

请先 登录 后评论

李留白

关注

贡献值: 485

学分: 581

公众号【李留白】作者,Fullstack Developer, All in Web3.0.

官网:https://hicoldcat.com/

文章目录

关于

关于我们

社区公约

学分规则

Github

伙伴们

DeCert

ChainTool

GCC

合作

广告投放

发布课程

联系我们

友情链接

关注社区

Discord

Twitter

Youtube

B 站

公众号

关注不错过动态

微信群

加入技术圈子

©2024 登链社区 版权所有 |

Powered By Tipask3.5|

粤公网安备 44049102496617号

粤ICP备17140514号

粤B2-20230927

增值电信业务经营许可证

×

发送私信

请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!

发给:

内容:

取消

发送

×

举报此文章

垃圾广告信息:

广告、推广、测试等内容

违规内容:

色情、暴力、血腥、敏感信息等内容

不友善内容:

人身攻击、挑衅辱骂、恶意行为

其他原因:

请补充说明

举报原因:

取消

举报

×

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!

【科普】USDT的三种链类型(Omni、ERC20、TRC20)_omni是什么链-CSDN博客

>

【科普】USDT的三种链类型(Omni、ERC20、TRC20)_omni是什么链-CSDN博客

【科普】USDT的三种链类型(Omni、ERC20、TRC20)

最新推荐文章于 2023-08-01 18:53:52 发布

安全大哥

最新推荐文章于 2023-08-01 18:53:52 发布

阅读量6.1w

收藏

20

点赞数

13

分类专栏:

区块链

原文链接:https://www.jianshu.com/p/40a153e27d42?from=singlemessage

版权

区块链

专栏收录该内容

20 篇文章

5 订阅

订阅专栏

本文阐述usdt的三种链类型的区别以及安全性

文章参考来源:https://www.jianshu.com/p/40a153e27d42?from=singlemessage

很多朋友在进行USDT转账的时候都会出现三种链类型,这个时候就很多人不知道具体选择哪一种,也不知道这几种链类型的区别,心里就会产生谨慎,其实这三种链类型都是可以使用的,本文简单地讲述一下这三种链类型的区别,希望对大家有所帮助。

 

  USDT的三种形态分别是:

  基于比特币网络的Omni-USDT,充币地址是BTC地址,充提币走BTC网络;

  基于以太坊ERC20协议的ERC20-USDT,充币地址是ETH地址,充提币走ETH网络;

  基于波场TRC20协议的TRC20-USDT,充币地址是TRON地址,充提币走TRON网络。

  1、Omni-USDT

  2014年11月,USDT于比特币网络上诞生,于2015年2月正式上线几大主流交易所。在2018年之前,USDT的转账路径只有一条,那就是基于比特币网络的Omni-USDT。Omni-USDT存储在比特币地址上,因此每次转账的时候,需要支付比特币作为矿工手续费。Omni-USDT于比特币网络的链上,黑客攻击的成本很高,所以资产相对安全性较高。但是其交易速度非常慢,已经无法满足当今加密交易市场的需求,但很多大宗交易还是会倾向于Omni-USDT。

  2、ERC20-USDT

  2018年初,以太坊网络爆红,智能合约普及于区块链应用,ERC20-USDT出现。和Omni-USDT一样,使用ERC20-USDT同样需要支付旷工费,但转账速度有了显著的提升。由于安全性好、转账速度快,ERC20-USDT被市场广泛接受,USDT的发行者泰达公司也开始放弃了比特币Omni,转而支持更高效的以太坊ERC20。随着近期泰达公司多次在以太坊上增发USDT,ERC20-USDT的数量显著增加,目前已超过Omni-USDT总量的50%。除了官方放弃Omni协议以外,主流交易所也开始转向支持ERC20-USDT。7月3日,币安交易所宣布将由OMNI网络切换为ERC20网络,虽然原OMNI网络的USDT可以继续充值并上账,但将无法提现OMNI网络的USDT。

 

  3、TRC20-USDT

  2019年4月,泰达公司宣布在波场上发行了基于TRC-20协议的USDT,TRC20-USDT诞生。TRC20-USDT发行时承诺完全公开透明,零转账费,秒级到账。和前两者不同的是,目前TRC20-USDT转账是不收取手续费的,这也是波场打造的一个亮点。但目前TRC20-USDT的发展还不是很成熟,也无法保证安全性。

  应该如何区分?

  首先要明白一点:三种类型的USDT在交易所内并没有差别,但在链上是不互通的。也就是说Omn上的USDT是无法转到另外两条链上的,所以在交易所充提USDT时一定要留意地址种类。

  三者最明显的区别:

  Omni-USDT的地址是以1开头

  ERC20-USDT的地址是以0x开头

  TRC20-USDT的地址是以T开头

  那么,应该如何选择?

  Omni-USDT的安全性最好,但转账速度太慢。要是你有不着急交易的大额订单,可以优先选择Omni-USDT。

  ERC20-USDT的安全性和转账速度居中,适用于数字货币市场的频繁交易。要是你经常做短线交易,可以优先选择ERC20-USDT。

  TRC20-USDT的转账速度最快,而且链上转账无需手续费,但安全性比较低。要是你非常在意交易速度,可以考虑TRC20-USDT,建议小额为主。

 

 

优惠劵

安全大哥

关注

关注

13

点赞

20

收藏

觉得还不错?

一键收藏

知道了

0

评论

【科普】USDT的三种链类型(Omni、ERC20、TRC20)

本文阐述usdt的三种链类型的区别以及安全性文章参考来源:https://www.jianshu.com/p/40a153e27d42?from=singlemessage很多朋友在进行USDT转账的时候都会出现三种链类型,这个时候就很多人不知道具体选择哪一种,也不知道这几种链类型的区别,心里就会产生谨慎,其实这三种链类型都是可以使用的,本文简单地讲述一下这三种链类型的区别,希望对大家有所帮助。  USDT的三种形态分别是:  基于比特币网络的Omni-USDT,充币地址是BTC地.

复制链接

扫一扫

专栏目录

授权转币接口TRC20和ERC20

11-07

授权转币接口TRC20和ERC20

开发语言是nodejs做的任何语言可以进行调用使用!

trc20和erc20、OMNI有什么区别

热门推荐

西京刀客

01-09

3万+

文章目录一、USDT三种链类型Omni、ERC20、TRC20的区别二、参考

一、USDT三种链类型Omni、ERC20、TRC20的区别

关于USDT:大家都知道它是入场的币种之一,由Tether公司发行的基于美元1:1挂钩的稳定币。

USDT的三种形式是:

基于比特币网络的Omni-USDT,货币地址是BTC地址,货币被带到BTC网络;

这是最开始USDT发行方式,基于Omni协议发行的加密货币,可以简单理解为基于比特币的USDT。

根据以太坊ERC20协议的ERC20-USDT,货币地址是ET

参与评论

您还未登录,请先

登录

后发表或查看评论

助记词碰撞TRC20链

最新发布

02-01

软件已经集成一体化,可以开箱即用,点击【开始碰撞】即可。 

如果您勾选详细模式,那么日志列表会显示每次碰撞的地址与助记词,您可以登录 小狐狸或者ok等钱包亲自去验证助记词与地址是否匹配,杜绝弄虚作假! 但是平时为了碰撞效率卖不建议您开此功能,此功能仅限于向您展示碰撞效果。

配置并勾选宏观计数模式:默认值设置为10000,也就是说每碰撞10000次, 便会显示一次日志,该模式方便您整体观测碰撞速度与进度。

本软件的优势

算法优势,市面上一些碰撞软件采用的是完全随机的生成规则,而不是按照虚拟货币钱包的规则生成的,导致计算中出现了许多无效的密钥,浪费了许多资源,降低碰撞效率,而本软件的生成规则是完全遵守钱包的设计规则生成,每次碰撞的地址都可以支持使用助记词手动验证,本人亲自验证该方式的效率要比这些完全随机生成的软件快了大约50%。

安全优势,本软件可在无网络环境下运行,不需要使用者输入任何与自己钱包有关的信息,也不操作任何内容,碰撞成功只向您展示助记词,无需担心被他人利用摘桃子的风险。

信息优势,本软件支持自动化导入地址本地地址库,无需像其他软件一样需要您自己去其他地方获取地址信息在粘

erc20faucet:https:peppersec.com制作的ERC20令牌水龙头

02-05

ERC20令牌水龙头

以太坊主网上以及Ropsten,Kovan,Rinkeby和Görli测试网上的ERC20令牌龙头。

访问页面,设置适当的代币数量,单击“免费代币”按钮。 而已!

您将需要一些以太(ETH)来支付网络交易费用。 请参阅下面的,以获得testnet醚。

部署的水龙头令牌

网络

地址

主网

罗普斯滕

林克比

格尔利

科万

POA

Testnet乙醚龙头

测试网

探险家

Testnet ETH龙头

罗普斯滕

科万

林克比

格尔利

请提交PR以及上述信息的更新。

请享用!

(c)PepperSec.com/麻省理工学院执照。

PHP-TRC20-usdt.zip

09-07

PHP-Tron-开发

创建地址

$ php 演示/NewAddressDemo.php

TRX转账及余额查询

$ php 演示/TrxDemo.php

Trc20 代币转账、余额查询和事件监控

$ php 演示/Trc20Demo.php

Tron 智能合约部署

$ php 演示/DeployContractDemo.php

联络我

更多源码请联系

QQ19816858

帮助

http://sc.hubwiz.com/codebag/tron-php-lib/

什么是ERC20?

Web3 & Basketball

07-07

2137

ERC20 代币可以存储在兼容的以太坊钱包中,如 MetaMask、MyEtherWallet 等,并可以在以太坊上的去中心化交易所(如 Uniswap、SushiSwap)以及其他支持 ERC20 标准的交易平台进行交易。它是由中心化的机构发行的,并且是一个 ERC20 代币。它定义了代币合约的基本功能和接口,使得代币可以在以太坊网络上流通、交易和与其他 ERC20 代币互操作。通过这些功能,ERC20 代币可以在以太坊网络上进行交易、转账和存储,并且可以与其他兼容 ERC20 标准的代币进行互操作。

TRC20和ERC20的区别(trc20怎么换成erc20)

m0_67888579的博客

08-01

2627

例如,用户可以在imToken钱包中将TRC20-USDT转账到自己的波场地址,然后选择切换到以太坊网络,再将ERC20-USDT转账到自己的以太坊地址,或者在钱包内部直接兑换成ERC20-USDT。| 代币示例 | TRC20-USDT,TRC20-BTC,TRC20-ETH等 | ERC20-USDT,ERC20-BTC,ERC20-ETH等 |2.ERC20是以太坊网络的代币标准,是一种通用的接口规范,允许任何符合该标准的代币在以太坊网络上进行转账、交易和智能合约操作。

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

shengzang1998的博客

11-16

9249

什么是 ERC20?

【只是技术探讨,请不要参与违法犯罪活动,谨防数字加密货币炒作风险。】

ERC20 有什么作用?

在交易所中的 ERC20

EIPs 中的定义

在 etherscan 中的 ERC20

OMNI协议介绍

The future is already here it's just not evenly distributed。

09-13

1万+

OMNI

    OMNI是创建和交易定制数字资产和货币的平台。它是一个建立在最受欢迎、严格审核、最安全的Bitcoin之上的软件层。OMNI交易是比特币交易,使用比特币链上的下一代功能。Omni Core是一个增强的Bitcoin,它提供了Bitcoin的所有特性以及Omni的一些高级特性。

                                                  ...

一张图看懂 USDT三种类型地址 Omni、ERC20、TRC20的区别

的专栏

11-17

2万+

是当前实用最广泛,市值最高的稳定币,它是中心化的公司Tether发行的。在今年的4月17日之前,市场上存在着2种不同类型的USDT。4月17日又多了一种波场TRC20协议发行的USDT,它们各自有什么区别呢?哪个转账最快到账?哪种最安全?手续费最低?USDT三种链类型Omni、ERC20、TRC20的区别Tether公司发行发行的USDT稳定币一共有三种类型,分别是基于比特币、以太坊和TRON。基于比特币和基于以太坊的USDT,两者不兼容、不能相互转账,可以从存储的地址中判断USDT是属于哪一种。

彩虹易支付USDT-TRC20支付收款插件.zip

03-16

一款适用于原版彩虹易支付的USDT(TRC20)收款插件,收到的货币直接到自己钱包,不经过任何第三方。

本源码仅供个人学习研究所用,任何人或组织用作他用,产生的任何后果 责任自负。

1. 新增一种支付方式,调用值必须设置为usdt,显示名称无所谓,支持设备选PC+Mobile

2. 将本项目直接打包下载,随后解压得到一个文件夹,再将文件夹重命名为usdt;然后将整个文件夹上传到易支付网站的plugins目录。

3. 登录易支付后台,刷新支付插件之后便能看到一个USDT 收款插件;随后便能按照正常流程添加支付通道。

IOBC Capital:LayerZero 定义 Omnichain 互联互通新标准

资讯速递

08-31

1126

Layerzero是一种全链(Omnichain)的互操作性协议。Layerzero构建了一种全新的超轻节点模式,为各种跨链协议提供一种安全可靠的基础设施。

链游知识01:同质化和非同质化资产标准是什么?

lianyouwanjia的博客

08-27

2145

前言:链游知识是链游玩家专门推出的针对入门玩家的游戏知识科普,从小白到高玩,看链游玩家就够了。

区块链游戏诞生于17年末18年初,至今也不到2年的时间,虽然目前已经有很多团队和项目方在做区块链游戏了,但是他的门栏依旧很高。

撇开游戏不谈,光是区块链这一项,就无形中劝退很多人。想要玩区块链游戏,你需要买代币,去交易所买,充币提币对新手来说都是十分难以搞懂的。就拿USDT来说,有E...

ERC20 协议

chinusyan的专栏

10-24

3141

ERC20

区块链-Linux下USDT测试节点搭建

Java_Mike的博客

06-20

3182

本文转载自https://lhalcyon.com/blockchain-usdt-node/

Tether Limited 公司基于 Omni Layer 这层协议(Omni Layer protocol)发行tetherUSD . Omni Layer 是基于比特币区块链的通信协议 , 它实现了智能合约的特性 , 也就是说 tetherUSD是 Omni Layer的一个智能合约 ....

omni私链常用命令

Guanxing__的博客

09-29

1283

启动服务

omnicored -conf=/root/omnicore-master/src/bitcoin.conf -daemon

停止服务

omnicore-cli -conf=/root/.omnicore/bitcoin.conf stop

生成钱包地址

omnicore-cli -conf=/taft/omni/bitcoin.conf getnewaddress “name”

获取指定地址omni余额

omnicore-cli -conf=/taft/omni/bitcoin.conf o

什么是USDT?

gtyi999的专栏

10-21

8883

什么是USDT?

 

USDT是Tether公司推出的基于稳定价值货币美元(USD)的代币Tether USD(简称USDT),1 USDT=1美元。

USDT的发行和交易使用的是Omni(原Mastercoin)协议,它是一个基于比特币区块链的2.0币种。USDT的交易确认等参数与比特币是一致的。用户可以通过SWIFT电汇美元至Tether公司提供的银行帐户,或通过交易所换取USDT。赎回...

usdt充值 btc网络(区块充值)

jmkweb的博客

06-18

1万+

下边介绍基于 比特币网络的usdt做充值

基于比特币网络发行的USDT (基于Omni协议发行)

1.首先现在节点服务器上生成每个用户的钱包地址

/**

* 方法:生成USDT地址

* @param $user_id

* @return bool

*/

public function usdtcoin($user_id)

{

...

Omni研究系列【USDT raw transaction】

秋天的博客

06-19

1万+

Omnicore-cli命令一览

Omni的资料相对比较少,把一些常用命令执行结果也列出来,便于快速的了解。omni_getallbalancesforid

取指定omni代币Chaim:bin Chaim$ ./omnicore-cli "omni_getallbalancesforid" 1[{"address": "1DUJAPA5i7biVYyZNCnckqEBEjY1Act2ct","...

USDT-ERC20转出去

05-28

您可以使用支持USDT-ERC20的数字钱包将USDT-ERC20转出去。首先,您需要确认您的数字钱包支持USDT-ERC20,并且您已经将USDT-ERC20存入该钱包。然后,您需要在钱包中选择转账功能,并输入接收方的钱包地址以及转账金额。在确认转账信息无误后,您可以提交交易并等待该交易被确认。请注意,USDT-ERC20的转账需要支付一定的网络手续费,具体费用取决于当前网络状况和交易金额。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

安全大哥

CSDN认证博客专家

CSDN认证企业博客

码龄7年

暂无认证

231

原创

1万+

周排名

3111

总排名

111万+

访问

等级

7702

积分

3068

粉丝

425

获赞

233

评论

1747

收藏

私信

关注

分类专栏

区块链

20篇

红蓝对抗

53篇

云安全

9篇

威胁情报

2篇

OWASP

3篇

JAVA代码审计

20篇

应用安全

15篇

密码学

2篇

python

17篇

Web渗透测试

106篇

系统

5篇

知识点

16篇

apk渗透

3篇

小tips

32篇

内网渗透

17篇

工具小tip

12篇

linux常见问题

2篇

应急响应

4篇

window应急响应

2篇

php

灰黑产关注

17篇

CTF

1篇

最新评论

记一次任意文件下载漏洞思路(jeesite框架)

阿德来了:

没说怎么修复呀

侦查系列之微信用链接查看对方IP(包括机型、系统版本等信息)

2301_82262745:

有没有相对稳定点的链接,这个链接总是限时网站不稳定

防火墙问题解决办法-----“出于安全原因,某些设置由系统管理员进行管理”

sunbo1983856917:

怎么把登录账号设置为管理员啊

【漏洞案例】记一次aws-key泄露导致火币交易所被攻击案例

布丁奥利奥:

看不懂一点

go环境下载github文件显示timeout解决方法

akisturyoko:

您好!我是英国华威大学的在读研究生,专业是网络安全管理。目前我正在为毕业论文的研究项目”探索中国渗透测试人员面临的社会和道德挑战“ 收集数据,希望邀请中国的渗透测试从业者参与研究,内容为线上访谈,时间约为1小时。请问您愿意接受研究访谈吗?感谢您的阅读与回复!

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

加密货币在网络违法犯罪活动中的利用情况调查

Burpsuite配置BurpJSLinkFinder进行网页JS链接提取

HIKVISION iSecure Center RCE 海康威视综合安防管理平台任意文件上传 POC&EXP

2024年2篇

2023年40篇

2022年51篇

2021年42篇

2020年67篇

2019年36篇

2018年46篇

目录

目录

分类专栏

区块链

20篇

红蓝对抗

53篇

云安全

9篇

威胁情报

2篇

OWASP

3篇

JAVA代码审计

20篇

应用安全

15篇

密码学

2篇

python

17篇

Web渗透测试

106篇

系统

5篇

知识点

16篇

apk渗透

3篇

小tips

32篇

内网渗透

17篇

工具小tip

12篇

linux常见问题

2篇

应急响应

4篇

window应急响应

2篇

php

灰黑产关注

17篇

CTF

1篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值