Hero Circle Shape
Hero Moon Shape
Hero Right Shape
imtoken以太坊钱包下载|erc20是以太坊独有的么

imtoken以太坊钱包下载|erc20是以太坊独有的么

  • 作者: imtoken以太坊钱包下载
  • 2024-03-16 05:20:03

以太坊|什么是tokens(代币/通证)以及ERC-20标准 - 知乎

以太坊|什么是tokens(代币/通证)以及ERC-20标准 - 知乎切换模式写文章登录/注册以太坊|什么是tokens(代币/通证)以及ERC-20标准Bit大魔王大学生/Gemini/INTP基础概念:代币是一种具有多功能的数字资产。代币可以是一种货币形式,可以代表数字或实物收藏品,可以代表数字身份,可以被用来享受一些服务……在以太坊区块链上,代币由开发人员以智能合约的方式构建。智能合约的编写方式取决于不同的开发人员。但是,对于一个可能被多方执行的智能合约,遵循一个标准的合约编写方式是有好处的。因为不同的标准可能导致新发行的代币很难和其他项目交互。所以,以太坊就为每个建立在以太坊上的新代币设置了一个标准。ERC-20的引入ERC-20(Ethereum Request For Comments)标准指的是一种可以在以太坊区块链上实现大多数代币执行的智能合约标准,该标准定义了一系列标准和技术条件,每次使用该标准构建智能合约来管理代币时,都必须满足这些条件。ERC-20标准作为区块链的通用语言,在创建代币时使用这种标准的最大好处在于:这种代币可以和区块链上所有其他ERC-20标准的项目进行集成融合。当这种标准在代币中执行得越多,使用该标准构建代币的优势和效用也就越大。加密货币和ERC-20代币的区别ERC-20代币具有一般加密货币的功能,但它们的概念不同。加密货币是一种通过密码学加密的数字资产。这意味着这些加密货币在各自的区块链上运行,而账本则分布在去中心化的区块链上。相对的,代币是存在于区块链之上的应用程序。例如以太坊的ERC-20代币。它完全依赖于以太坊区块链,而没有自己独特的区块链。因此,执行一项交易需要支付以太坊的手续费。矿工用这些费用在网络上验证交易。ERC-20标准代币的关键函数:为了符合标准,所有用ERC-20构建的代币被要求在合约中执行一系列函数。每次执行这些函数时,它们都会返回信息(例如现有的这种代币的总数)并发起操作(例如将一定数量的代币转移到给定地址和账户的实体)。这些函数在ERC-20标准中非常重要,另外,开发人员在决定是否以及如何实现ERC-20标准时需要考虑每个函数中重要的变量。ERC-20代币的优势:方便性:ERC-20代币简单且易于部署。这是因为以太坊智能合约是用类似JavaScript的Solididity编程语言编写的。另外,开发人员也可以使用类似于Python的Vyper编程语言编写智能合约。广泛性:ERC-20标准以及代币能够被大多数交易所和钱包识别,这主要是因为通用协议被大多数交易所接受。此外,它的同质化属性使其非常适合交易应用程序。标准化:以太坊设置了不同代币之间交互规则和购买规则的标准。通用标准下,用户可以将新的代币转移到钱包中,并一次性将其放到交易所中。ERC-20代币的劣势:依赖性:因为ERC-20代币没有自己的区块链,而是构建在以太坊区块链之上,所以对以太坊存在着极高的依赖性。所以,以太坊区块链本身的一些问题也会反应在ERC-20代币之中。例如,高昂的手续费以及较慢的交易速度。门槛低:由于ERC-20代币构建的简单性,有些不法分子可能借此诈骗。建立一些毫无价值的项目,然后通过ICOs(首次代币发行)割韭菜,卖出代币之后就跑路了。ERC-20代币之外:除了ERC-20之外,还有其他ERC代币标准。虽然它们可能拥有类似的协议,但它们为不同的目的服务。ERC-721代币是非同质化的。也就是说每个代币都是独特且稀缺的,以此确保每个代币独一无二的价值。今年大火的NFT也就是基于这种标准构建的非同质化代币。ERC-777被视为ERC-20的升级版。虽然它具有与ERC-20相似的功能,但它的独特之处在于铸造或烧毁代币的选择,并加速了转账过程。它与钱包和代理合约向后兼容,无需重新部署。总结:ERC-20代币无疑对加密货币行业产生了重大影响。不仅催生了数十亿美元的ICO行业,还使数字资产更广泛。新创建的代币如果遵循了ERC-20标准,在发行时可以直接登陆到交易所平台,不需要加密货币和交易所开发者之间进行任何沟通。登陆交易平台的过程变得更加安全、简便,这也使得代币的流动性增加了,从而博得用户的更多信任。虽然有些项目采用了一些新的标准,如ERC-223或ERC-777,但ERC-20仍然是首选标准。ERC-20协议需要不断改进来解决漏洞和现有的问题。编辑于 2021-12-20 18:43区块链(Blockchain)ERC-721+ERC-1155以太币​赞同​​添加评论​分享​喜欢​收藏​申请

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)本页面对你有帮

什么是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代币? - 知乎切换模式写文章登录/注册你真的了解ERC20代币?NGK我们平时所说的ERC20并非是一种代币,而是一种代币标准,并且是基于以太坊存在的。在以太坊网络中,原生代币是ETH,在主网中不仅有原生代币ETH,还可以发行其他代币,只需要根据ERC20标准自己写一份适合目标应用场景的智能合约,将一定量的ETH发送于智能合约,便可以获得预设数量的代币。ERC20代币在方便了开发者与投资者的同时,导致了市场中空气币项目横行,而近年来有实力的优质公链项目则大多不会在以太坊网络中发行ERC20代币,转而前期先开发自己的公链,之后在自己的主网上发行代币,公链项目NGK. IO便是其中一员。 以建设实现大规模商业应用落地为目标的NGK不是ERC20代币,其全网生态代币NGK是基于NGK主网发行。为了使区块链技术真正帮助人们解决现实世界中的生活问题,NGK网络打造了一个通用的智能合约编程平台与区块链操作系统,并拥有自己的图灵完备编程语言与运行环境,超强的商用级性能与安全性、去中心化程度三者共存,为实现应用落地打下了坚实的基础。此外在生态上,NGK. IO已经在新能源、生物科技、体育、娱乐、数据等八大行业有所布局,在NGK. IO主网上线后将快速接入多领域的生态合作伙伴,实现”六位一体“的生态闭环,未来还将开发更多场景的应用,服务于用户。NGK公链不仅不是ERC20代币,反而是在公链领域中以独立主网存在的一匹矫健黑马。就让我们看看NGK. IO如何进军主流市场,开辟数字货币新时代!发布于 2020-09-21 10:01区块链(Blockchain)数字货币​赞同 1​​添加评论​分享​喜欢​收藏​申请

ERC-20是什么? - 知乎

ERC-20是什么? - 知乎切换模式写文章登录/注册ERC-20是什么?爱丽森梦游市场MBA/ 金融管理/区块链/人工智能什么是Token(代币)?在Ethereum中,代币几乎可以代表任何东西,从在线平台的信誉点、游戏中角色的技能、彩票到金融资产债券,再到真正的商品,如公司的股份、货币、金盎司等!如此强大的功能,值得也必须处理好。如此强大的功能,理应也必须由一个强大的标准来处理,对吗?这正是ERC-20的作用所在,ERC-20就是针对这些发布的Token(代币)制定的一个固定的基础的标准原则。什么是ERC-20?ERC-20引入了可替代Token(代币)的标准,换句话说,它们具有使每个Token(代币)与另一个Token(代币)完全相同(在类型和价值上)的属性。例如,ERC-20,Token(代币)的行为与ETH相同,这意味着任意1个遵循ERC-20规则的Token(代币)与所有其他所有Token(代币)是平等和相同的。由Fabian Vogelsteller在2015年11月提出的ERC-20(以太坊请求注释20)是一种Token标准,在智能合约中实现了Token的API。(注:API(token)是一个通用术语。通常,API(token)是请求访问您的服务的应用程序的唯一标识符。您的服务将为应用程序生成API(token),以供您在请求服务时使用。然后,您可以将它们提供的令牌与您存储的令牌进行匹配,以进行身份 验证)它提供的功能类似于将Token(代币)从一个帐户转移到另一个帐户,以获取帐户的当前Token(代币)钱包内的余额以及网络上可用Token(代币)的总供应量。除了这些之外,它还具有其他一些功能,例如批准第三方帐户可以使用帐户中的Token(代币)数量。如果智能合约实施以下方法和事件,则可以称为ERC-20 ,Token(代币)合约,一旦部署,它将负责在以太坊上跟踪创建的Token(代币)(注:网上拥有这种标准的ERC-20代码,就是为了方便程序员编程时候可以直接应用,有兴趣的可以自己搜索看看)ERC-20 定义通用规则?截至2019年10月,以太坊的主网络上存在超过200,000个与ERC-20兼容的Token(代币)。ERC-20至关重要。它定义了所有以太坊Token(代币)必须遵守的通用规则列表。这些规则中,包括如何传输Token(代币),如何批准交易,用户如何访问有关Token(代币)的数据以及Token(代币)的总供应量。 因此,这个特殊的Token(代币)使所有类型的开发人员都能准确地预测新Token(代币)在更大的以太坊系统中将如何运行。这简化了为开发人员设定的任务;他们可以继续进行自己的工作,因为只要Token(代币)遵循规则,就不需要在每次发布新Token(代币)时都重做每个新项目。它确保以太坊发行的许多不同令牌之间的兼容性。许多著名的数字货币都使用ERC-20标准:包括Maker(MKR),Basic Attention Token(BAT),Augur(REP)和OmiseGO(OMG)等,以及今年火爆的Defi(去中心化金融概念),诞生了如AAVE、Compound等优质项目,用户拥有USDT便可参与这些项目。如果您打算购买任何以ERC-20,Token(代币)发行的数字货币,则必须拥有一个与这些Token(代币)兼容的钱包。幸运的是,由于ERC-20,Token(代币)非常流行,因此钱包有很多不同的选择。如何确定某个代币是否为ERC20,Token(代币)呢?通过etherscan或者其他区块链平台查询:ERC-20代币有什么用?ERC20代币的出现,大幅降低了代币发行门槛。只要复制网上的标准代码,一个不懂编程的人也能在几分钟内,发行出一种新的Token(代币)。这一便利,也催生了2017年的「1CO」热潮,从而进一步推动了比特币牛市。目前全球Token(代币)总数超过5000种,绝大部分是ERC20的代币,据估计,至少占比超过95%,由此可见,ERC20是一种十分流行的代币格式。因为ERC20的标准token(代币)规则的便利性和统一性,前段时间的Defi热潮中ERC20,Token(代币)项目也表现得非常火爆:例如:LINK(预言机概念)取得了超过100倍的涨幅、UNI(去中心化交易所代币)创出了史上最强空投(人均1000美元)、UMA(衍生资产概念)获得了50倍的涨幅等等。发布于 2020-11-26 14:06token智能合约​赞同 16​​4 条评论​分享​喜欢​收藏​申请

智能合约ERC20代币详解 - 知乎

智能合约ERC20代币详解 - 知乎首发于区块链技术详解切换模式写文章登录/注册智能合约ERC20代币详解Zarten​计算机技术与软件专业技术资格证持证人作者:Zarten知乎专栏:区块链技术详解知乎ID:Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 !概述ERC20并不是一项技术或者说一套程序,而是以太坊平台的数据通讯标准或者说规则 。ERC20简单理解成以太坊上的一个代币协议,所有基于以太坊开发的代币合约都遵守这个协议。遵守这些协议的代币我们可以认为是标准化的代币,而标准化带来的好处是兼容性好。这些标准化的代币可以被各种以太坊钱包支持,用于不同的平台和项目。ERC20标准官方介绍说明:https://theethereum.wiki/erc20_token_standard/标准规定,一共包括:6个函数,2个event,3个变量。 contract ERC20Interface {

function totalSupply() public constant returns (uint);

function balanceOf(address tokenOwner) public constant returns (uint balance);

function allowance(address tokenOwner, address spender) public constant returns (uint remaining);

function transfer(address to, uint tokens) public returns (bool success);

function approve(address spender, uint tokens) public returns (bool success);

function transferFrom(address from, address to, uint tokens) public returns (bool success);

event Transfer(address indexed from, address indexed to, uint tokens);

event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

string public constant name = "Zarten Token";

string public constant symbol = "ZAR";

uint8 public constant decimals = 18; // 18 is the most common number of decimal places

// 0.0000000000000000001 个代币

}

解释如下:totalSupply()代币发行总量。balanceOf(address tokenOwner)查询某个账户的代币余额。allowance(address tokenOwner, address spender)查询某个账户可转账金额。用于控制代币的交易。transfer(address to, uint tokens)从当前的自己账户,实现代币的交易。approve(address spender, uint tokens)设置允许某个账户spender从此地址可使用的代币数。transferFrom(address from, address to, uint tokens)实现用户之间的代币交易(非自己账户)。event Transfer(address indexed from, address indexed to, uint tokens)当代币交易时会触发此函数。event Approval(address indexed tokenOwner, address indexed spender, uint tokens)当成功调用approve函数后会触发此函数。name代币名称symbol 代币简称decimals 返回token使用的小数点后几位。比如如果设置为3,就是支持0.001表示。一般为18位。ERC20工作原理变量及函数实现定义变量一般会定义几个映射变量:mapping (address => uint256) public balances保存着每个地址对应的余额。mapping (address => mapping (address => uint256)) public allowed两层映射。保存着某个地址A允许另一个地址B可操作的金额。最外层映射为某个地址A,内层映射为另一个地址B,值为可操作(发起交易)金额总量。函数实现balanceOf()function balanceOf(address tokenOwner) public constant returns (uint balance) {

return balances[tokenOwner];

}

从映射变量balances中取出某个地址的余额。transfer()function transfer(address to, uint tokens) public returns (bool success) {

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

balances[to] = balances[to].add(tokens);

Transfer(msg.sender, to, tokens);

return true;

}

当前账户转账操作。msg.sender为保留字,指这个函数的地址。sub:减 add:加首先从当前账户减去相应金额。同时往对方账户加上对应金额。并调用Transfer函数做通知。transferFrom()function transferFrom(address from, address to, uint tokens) public returns (bool success){

balances[from] = balances[from].sub(tokens);

allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);

balances[to] = balances[to].add(tokens);

Transfer(from, to, tokens);

return true;

}

用户之间账户转账操作。由from地址发起转账交易。from地址账户减去相应金额。from从msg.sender总共可操作金额减少相应金额。to地址账户增加相应金额。调用Transfer函数做通知。approve() function approve(address spender, uint tokens) public returns (bool success) {

allowed[msg.sender][spender] = tokens;

Approval(msg.sender, spender, tokens);

return true;

}

设置某账户spender可操控msg.sender的代币数。设置spender地址从msg.sender可使用的代币数。调用Approval函数做通知。举例说明假设2个钱包地址如下:balances[0x1111111111] = 100balances[0x2222222222] = 200 balanceOf()tokenContract.balanceOf(0x1111111111) will return 100tokenContract.balanceOf(0x2222222222) will return 200 transfer()若0x1111111111转账10个代币给0x2222222222,则0x1111111111将执行tokenContract.transfer(0x2222222222, 10)转账成功后得到如下结果:balances[0x1111111111] = 90balances[0x2222222222] = 210 approve()若0x1111111111允许0x2222222222拥有转账操作30个代币的权利,则0x1111111111将执行tokenContract.approve(0x2222222222, 30)设置成功后得到如下结果:tokenContract.allowed[0x1111111111][0x2222222222] = 30transferFrom()若0x2222222222转移0x1111111111的20个代币给自己,则0x2222222222将执行tokenContract.transferFrom(0x1111111111, 0x2222222222, 20)转账成功后得到如下结果:tokenContract.balances[0x1111111111] = 70tokenContract.balances[0x2222222222] = 230tokenContract.allowed[0x1111111111][0x2222222222] = 10 ERC20基本功能代码注:完整代币已上传至Github:GitHub - Zartenc/ZAR-ERC20: Zarten ERC20 Token is ZAR实现ERC标准接口,代码如下:pragma solidity ^0.4.0;

contract ERC20Interface {

function totalSupply() public view returns (uint);

function balanceOf(address tokenOwner) public view returns (uint balance);

function allowance(address tokenOwner, address spender) public view returns (uint remaining);

function transfer(address to, uint tokens) public returns (bool success);

function approve(address spender, uint tokens) public returns (bool success);

function transferFrom(address from, address to, uint tokens) public returns (bool success);

event Transfer(address indexed from, address indexed to, uint tokens);

event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

}

contract ZartenToken is ERC20Interface{

string public name;

string public symbol;

uint8 public decimals;

uint256 public _totalSupply;

mapping (address => uint256) public balances;

mapping (address => mapping (address => uint256)) public allowed;

constructor() public {

symbol = "ZAR";

name = "Zarten Token";

decimals = 18;

_totalSupply = 100000000 * 10**uint256(decimals);

balances[msg.sender] = _totalSupply;

}

function totalSupply() public view returns (uint256) {

return _totalSupply;

}

function balanceOf(address tokenOwner) public view returns (uint256 balance) {

return balances[tokenOwner];

}

function allowance(address tokenOwner, address spender) public view returns (uint remaining) {

return allowed[tokenOwner][spender];

}

function transfer(address to, uint256 tokens) public returns (bool success) {

// 检验接收者地址是否合法

require(to != address(0));

// 检验发送者账户余额是否足够

require(balances[msg.sender] >= tokens);

// 检验是否会发生溢出

require(balances[to] + tokens >= balances[to]);

// 扣除发送者账户余额

balances[msg.sender] -= tokens;

// 增加接收者账户余额

balances[to] += tokens;

// 触发相应的事件

emit Transfer(msg.sender, to, tokens);

return true;

}

function approve(address spender, uint256 tokens) public returns (bool success) {

allowed[msg.sender][spender] = tokens;

emit Approval(msg.sender, spender, tokens);

return true;

}

function transferFrom(address from, address to, uint tokens) public returns (bool success) {

// 检验地址是否合法

require(to != address(0) && from != address(0));

// 检验发送者账户余额是否足够

require(balances[from] >= tokens);

// 检验操作的金额是否是被允许的

require(allowed[from][msg.sender] <= tokens);

// 检验是否会发生溢出

require(balances[to] + tokens >= balances[to]);

balances[from] -= tokens;

allowed[from][msg.sender] -= tokens;

balances[to] += tokens;

emit Transfer(from, to, tokens);

return true;

}

}

以上代码可直接部署并可调用。ERC20高级功能代码ERC20代币有时需要其他一些额外的高级功能,比如代币管理、代币增发、空投代币、代币冻结、销毁代币、代币兑换等。代币管理有时代币需要有一个管理者功能。添加一个owned合约,如下:contract Owned {

address public owner;

constructor() public {

owner = msg.sender;

}

modifier onlyOwner {

require(msg.sender == owner);

_;

}

function transferOwnership(address newOwner) onlyOwner public {

owner = newOwner;

}

}

上面modifier关键字为修饰器,修饰器所修饰的函数体会被插入到特殊符号 _; 的位置,如果是 owner 调用这个函数,则函数会被执行,否则会抛出异常。之后自己的合约继承ERC20Interface合约和owned合约,并msg.sender换为owner。contract ZartenToken is ERC20Interface, Owned{}代币增发代币增发可使代币总供应量增加,可以指定某个账户的代币增加,同时总供应量也随之增加。 //代币增发 function mintToken(address target, uint256 mintedAmount) onlyOwner public {

balances[target] += mintedAmount;

_totalSupply += mintedAmount;

emit Transfer(address(0), address(this), mintedAmount);

emit Transfer(address(this), target, mintedAmount);

}

使用onlyOwner修饰器,只能owner调用。this表示当前合约。代币销毁首先添加一个通知客户端代币消费的事件。event Burn(address indexed from, uint256 value);销毁代币非为销毁管理者代币和销毁用户代币。此时需要管理者去进行销毁。销毁管理者代币 //管理者代币销毁 function burn(uint256 _value) onlyOwner public returns (bool success) {

require(balances[owner] >= _value);

balances[owner] -= _value;

_totalSupply -= _value;

emit Burn(owner, _value);

return true;

}

销毁用户代币 //用户代币销毁 function burnFrom(address _from, uint256 _value) onlyOwner public returns (bool success) {

require(balances[_from] >= _value);

require(_value <= allowed[_from][owner]);

balances[_from] -= _value;

allowed[_from][owner] -= _value;

_totalSupply -= _value;

emit Burn(_from, _value);

return true;

}

代币冻结有时需要冻结账户代币,也就是此账户不能转账操作。1.首先添加一个账户冻结代币的映射mapping (address => bool) public frozenAccount;2.添加冻结的通知函数event FrozenFunds(address target, bool frozen);3..添加冻结的函数 //冻结账户代币 function freezeAccount(address target, bool freeze) onlyOwner public {

frozenAccount[target] = freeze;

emit FrozenFunds(target, freeze);

}

4.在转账函数中判断涉及账户是否为冻结账户,否则不允许转账操作 require(!frozenAccount[from]); require(!frozenAccount[to]);批量代币空投有时需要往很多地址空投一些代币,这样可以使用批量转账。假设从管理员账户空投。关键字memory为声明内存型的,存储的内容会在函数被调用(包括外部函数)时擦除,所以其使用开销相对较小。 //空投代币

function AirDrop(address[] memory _recipients, uint _values) onlyOwner public returns (bool) {

require(_recipients.length > 0);

for(uint j = 0; j < _recipients.length; j++){

transfer(_recipients[j], _values);

}

return true;

}

代币兑换有时代币需要与其他货币(Ether)进行兑换。msg.value表示随消息发送的wei的数量,payable修饰函数表示允许从调用中接收以太币。设置买卖价格的变量 uint256 public sellPrice; uint256 public buyPrice;设置价格函数 function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner public {

sellPrice = newSellPrice;

buyPrice = newBuyPrice;

}

接收以太币进行买操作 function buy() payable public {

uint amount = msg.value / buyPrice;

emit Transfer(address(this), owner, amount);

}

卖操作 function sell(uint256 amount) public {

require(address(this).balance >= amount * sellPrice);

emit Transfer(owner, address(this), amount);

owner.transfer(amount * sellPrice);

}

注:完整代币已上传至Github:GitHub - Zartenc/ZAR-ERC20: Zarten ERC20 Token is ZAR合约编译部署使用remix进行合约代码的编译与部署。官网:http://remix.ethereum.org/编译点击编译按钮;注意编译器版本与代码指定版本要对应。部署remix左侧的第三个按钮是发布按钮。点击发布按钮,会看到有ENVIRONMENT、ACCOUNT 、GAS LIMIT、CONTRACT等。其中,ENVIRONMENT有如下几个选项:1.JavaScript VM:这是Remix自己的内部沙箱。它不连接到MainNet,TestNet或任何专用网络。这是一个内存中的区块链,可用于简单测试和快速挖掘。2.Injected Web3:这是用于浏览器插件(MetaMask)的选项。在这里,Remix将对区块链集成的所有控制权交给MetaMask插件。此时,MetaMask控制要连接到的网络。3.Web3 Provider:这允许在Remix中输入URL以连接到区块链。此处最常见的设置是运行本地节点并通过其IP/端口连接到该节点此时选择 Injected Web3选项。点击Deploy部署后,小狐狸钱包会弹出确认框,此时需要注意选择的网络(主网或测试网等)。这里选择Goerli测试网络。部署成功后,可看到输出的日志和合约地址。此时部署已完成,也可在官方区块链浏览器中查看部署情况。钱包添加代币可把已经部署的代币添加到钱包方便查看,点击钱包添加代币,输入代币合约地址(上面箭头处)、代币符号、小数精度。输入信息如下:代币合约地址:0x9989a0ffB957D3eFf0262d43786df66176785F86代币符号:ZAR小数精度:18添加代币完成后如下所示:应用转账向另外一个地址转账1000个ZAR币,如下所示:转账成功后,另外一个账户收到1000个ZAR币。如下:代币信息总览可在浏览器中查看token详情,如下所示:查看ZAR币详情地址:https://goerli.etherscan.io/token/0x9989a0ffb957d3eff0262d43786df66176785f86#balances发布源代码若需要发布源代码可在浏览器中合约地址页面,Contract选项卡点击Verify and Publish ,接下来按提示步骤操作即可。发布于 2021-07-21 17:20token代币​赞同 36​​7 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录区块链技术详解区块链技术深

解析——什么是ERC-20 - 知乎

解析——什么是ERC-20 - 知乎首发于区块链学习社——知识使人富有切换模式写文章登录/注册解析——什么是ERC-20葛见圣​ ERC-20是一项以太坊代币标准,是从EIP-20提案经过以太坊社区不断讨论验证后通过而来的,是由Vitalik Buterin于2015年提出,是以太坊的第20号代币标准。截止发文以太坊上已存在440698种erc20代币合约,也就意味着共发行了这么多种erc20代币截止发文以太坊上已存在14071种erc721代币合约,也就意味着共发行了这么多种erc721代币 由以上两图得知,以太坊上目前为止总共发行了440698种erc20tokens+14071erc721tokens,二者总和454769,这两种代币标准代币就占据了以太坊上总代币类型的99%以上,基于其余各种较小众的代币标准发行的代币不足1%,其中erc20代币类型独占96.9%,足以看出erc20代币在以太坊上的统治地位,我们平日里所接触的许许多多代币如usdt(erc20)、usdc、dai、unsiwap、chainlink、wbtc、sushi等等绝大都数都是erc20代币,包括现在绝大多数有名的公链币matic、theta、icp、trx、bnb、ht、kcs起初都是erc20代币,可以说erc20代币标准造成了17年的ico热潮,而ico 也带火了erc20。然而到底什么是ERC-20呢?相对于别的ERC标准,erc-20的解释较为麻烦,因为它算是许多标准的基础,例如erc-223、erc621、erc777等都是对erc-20某些不足的补充或升级,所以当解释它们时只需说明是对ERC-20某项功能进行改进即可。而解释erc20这项主要标准则不一样,它需要更为能够说明基础应用的解释。ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如:设定代币名称设定代币总量规定小数点位数规范如何批准代币交易如何访问数据允许查看各地址中erc20代币数目以及代币总量一定条件下,允许第三方账户使用某账户中的代币资产允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容以及一些简单的函数功能等等。 代币时只有按照这个标准才能开发出被各种以太坊钱包、地址、智能合约兼容,假设开发者想创建某个代币,但是初始代币数目想设置为无穷大,或者因为暂时没想到合适的名称,就想着暂时空着,那么这个代币就将无法在ERC20标准上创建成功。假设你要创建一个erc20代币,你就必须给其设定一个名称,一个固定的总量,小数点限制等简单设置,以及一些基础的代码编写,但是如今一键发布的网站很多,创建erc20代币过程中用到的一些代码都已经有人替你写好,你唯一需要的就是填写名称、总量、小数点位数,然后再支付一定的gas费即可,erc20代币创建出来后所有的代币都会自动生成至创建人地址中。基于erc20代币标准发行的代币均为同质化代币(Fungible Token),与现在大火的NFT(Non-Fungible Token 非同质化代币相对应),同质化代币即同一种代币的所有代币其价值与属性完全一致,它们之间可以完全等价互换。而非同质化代币NFT则不同,非同质化即表明,代币之间不是完全相同的属性,即存在差异,与我们现实生活中的物品相对应,例如艺术品、音乐、房产等等,这些都算是非同质化的,存在属性差异的,即这样的物品是不存在完全相同的属性的,就算同一个房地产公司开发的房产,其也有一些性质上的差别,例如楼层,透光性,通透性,业主入住后内部布局等等。ERC20标准的提出大大的简化了发行个人代币的过程,降低了发币成本,此项代币标准在许多领域都可以得到较好利用,同时也促进了新型创业公司基于以太坊上的爆发,因为此等功能很大程度上解决了初创公司融资难的问题,给许多公司提供了很好的融资途径,尤其是现在Defi领域的许多龙头产品,如Compund、Aave、Chainlink等等优质项目当初都是通过发行基于erc20的代币获得开发运作资金的,可以说ERC20代币标准的提出是2017年ICO热潮的技术基础,同时ICO的热潮也反向反馈给了ERC20标准,将其带上了以太坊网络标准完全主导地位,当然技术总是双面的,ICO热潮中诈骗迭出不穷,也着实使得许多人受骗,但是哪项技术刚出炉不会伴随着缺乏监管带来的灰暗面?技术无罪,将好的技术用于黑暗面才有罪。下面将展示发行erc20代币的简短教程(PC端)。1.首先需要在浏览器上安装metamask插件,浏览器推荐使用谷歌或者火狐(安装插件需要天梯),都有metamask插件供安装。点击进入MetaMask点击Download now,在出现的界面中点击Install MetaMask for your browser点击添加至Chrome按导引操作点击此图标弹出的框中有此图标即安装成功接下来点开始使用导入钱包或者创建钱包2选1,已经有以太坊钱包了的可以直接助记词导入,没有的话需要创建,这里只展示创建钱包点我同意这个密码要记住,用于保护你的助记词,打开钱包时需要输入,同时后面很多dapp或者应用的使用需要输入密码始备份钱包,将你的助记词备份好。备份好了之后metamask钱包就OK了。接下来你需要购买一些ETH充值至钱包内用于支付创建代币费用及手续费,写此文时创建费用约0.12ETH,加上手续费应该至少转入约0.15ETH左右,多出部分以备后续使用,这个步骤就不再赘述。接下来你需要打开这个网站点击创建代币选择第一项点击一步到达下个界面,填写相关代币信息:名称、符号、小数位、代币初始总量。再点击下一步点击下一步需要连接钱包点击连接钱包后会跳出钱包框,选择你的钱包,点下一步,再点连接。就可以连接成功。接下来就是付费环节,你账户中至少要有比这个数目要多的eth,因为除支付铸造费用外还需要一些手续费。点击下一步到确认界面,确认过后即可完成。稍微等待一些时间,代币铸成后你需要将代币合约地址复制添加到你的代币列表里面,这样你铸造的代币就会存在你的钱包中了。以上内容仅供分享,不做投资意见本文内容如有不正确之处,敬请指出。推荐内容:编辑于 2021-07-30 21:23区块链(Blockchain)非同质化代币(NFT)​赞同 40​​14 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录区块链学习社——知识使人富有任何行业学习是登顶的必要工具

知识使

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.

了解ERC-20通证智能合约 | ethereum.org

C-20通证智能合约 | ethereum.org跳转至主要内容学习用法构建参与研究搜索​​​​语言 ZH帮助更新此页面本页面有新版本,但现在只有英文版。请帮助我们翻译最新版本。翻译页面没有错误!此页面未翻译,因此特意以英文显示。不再显示了解ERC-20通证智能合约智能合约通证solidityerc-20初学者jdourlensEthereumDev(opens in a new tab) 2020年4月5日6 分钟阅读 minute readcomp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE 在本页面取值器函数事件ERC-20 通证的基本实现ERC-20是以太坊上最重要的智能合约标准之一。它已经成为以太坊区块链上用于可替换通证实现的所有智能合约的技术标准。ERC-20 定义了所有可替换的以太坊通证都应该遵守的通用规则列表。 因此,该通证标准使所有类型的开发者能够准确预测新通证在更大的以太坊系统中将如何工作。 这简化了开发者的任务,因为他们可以继续他们的工作,知道只要通证遵循规则,每次发布新的通证时就不需要重做每个新项目。这里以接口的形式介绍了 ERC-20 必须实现的函数。 如果您不知道什么是接口:请查看我们关于使用 Solidity 进行 OOP 编程(opens in a new tab)的文章。1pragma solidity ^0.6.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}显示全部 复制下面逐行解释每个函数的用途。 在这之后,我们将展示一个 ERC-20 通证的简单实现。取值器1function totalSupply() external view returns (uint256); 复制返回存在的通证数量。 此函数是一个取值器,不会修改合约的状态。 请记住,Solidity 中没有浮点数。 因此,大多数通证都会采用 18 位小数,并且会返回总供应量和其他结果,如下所示:1 个通证 100000000000000000。 您需要在处理通证时格外注意,并不是每个通证都有 18 位小数。1function balanceOf(address account) external view returns (uint256); 复制返回地址拥有的通证数量(account)。 此函数是一个取值器,不会修改合约的状态。1function allowance(address owner, address spender) external view returns (uint256); 复制ERC-20 标准使一个地址能够允许另一个地址从中检索通证。 此取值器返回允许spender代表owner花费的剩余通证数量。 此函数是一个取值器,不会修改合约的状态,并且默认应返回 0。函数1function transfer(address recipient, uint256 amount) external returns (bool); 复制将通证的amount从函数调用者地址(msg.sender) 移动到接收者地址。 此函数发出稍后定义的Transfer事件。 如果可进行转账,它将返回 true。1function approve(address spender, uint256 amount) external returns (bool); 复制设置允许spender从函数调用方(msg.sender)余额转账的allowance的数额。 此函数发出 Approval 事件。 此函数返回是否成功设置了余量。1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); 复制使用余量机制将通证的amount从sender移动到recipient。 然后从调用者的余量中扣除该数额。 此函数发出Transfer事件。事件1event Transfer(address indexed from, address indexed to, uint256 value); 复制将通证(值)的数量从from地址发送到to地址时会发出此事件。在铸造新代币时,转账通常会在 from 0x00..0000 地址进行,而在销毁代币时,转账会在 to 0x00..0000 地址进行。1event Approval(address indexed owner, address indexed spender, uint256 value); 复制当owner批准要由spender使用的通证数量(value)时,将发出此事件。ERC-20 通证的基本实现下面是 ERC-20 通证的最简单代码:1pragma solidity ^0.8.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}171819contract ERC20Basic is IERC20 {2021 string public constant name = "ERC20Basic";22 string public constant symbol = "ERC";23 uint8 public constant decimals = 18;242526 mapping(address => uint256) balances;2728 mapping(address => mapping (address => uint256)) allowed;2930 uint256 totalSupply_ = 10 ether;313233 constructor() {34 balances[msg.sender] = totalSupply_;35 }3637 function totalSupply() public override view returns (uint256) {38 return totalSupply_;39 }4041 function balanceOf(address tokenOwner) public override view returns (uint256) {42 return balances[tokenOwner];43 }4445 function transfer(address receiver, uint256 numTokens) public override returns (bool) {46 require(numTokens <= balances[msg.sender]);47 balances[msg.sender] = balances[msg.sender]-numTokens;48 balances[receiver] = balances[receiver]+numTokens;49 emit Transfer(msg.sender, receiver, numTokens);50 return true;51 }5253 function approve(address delegate, uint256 numTokens) public override returns (bool) {54 allowed[msg.sender][delegate] = numTokens;55 emit Approval(msg.sender, delegate, numTokens);56 return true;57 }5859 function allowance(address owner, address delegate) public override view returns (uint) {60 return allowed[owner][delegate];61 }6263 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {64 require(numTokens <= balances[owner]);65 require(numTokens <= allowed[owner][msg.sender]);6667 balances[owner] = balances[owner]-numTokens;68 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;69 balances[buyer] = balances[buyer]+numTokens;70 emit Transfer(owner, buyer, numTokens);71 return true;72 }73}显示全部 复制ERC-20 代币标准的另一个优秀实现是 OpenZepelin ERC-20 实现(opens in a new tab)。t上次修改时间: @tyevlag(opens in a new tab), Invalid DateTime查看贡献者本教程对你有帮助吗?是否编辑页面(opens in a new tab)在本页面取值器函数事件ERC-20 通证的基本实现网站最后更新: 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)本页面对你有帮

ERC-20 - 维基百科,自由的百科全书

ERC-20 - 维基百科,自由的百科全书

跳转到内容

主菜单

主菜单

移至侧栏

隐藏

导航

首页分类索引特色内容新闻动态最近更改随机条目资助维基百科

帮助

帮助维基社群方针与指引互助客栈知识问答字词转换IRC即时聊天联络我们关于维基百科

搜索

搜索

创建账号

登录

个人工具

创建账号 登录

未登录编辑者的页面 了解详情

贡献讨论

目录

移至侧栏

隐藏

序言

1参考文献

开关目录

ERC-20

4种语言

EnglishFrançaisMagyarPolski

编辑链接

条目讨论

大陆简体

不转换简体繁體大陆简体香港繁體澳門繁體大马简体新加坡简体臺灣正體

阅读编辑查看历史

工具

工具

移至侧栏

隐藏

操作

阅读编辑查看历史

常规

链入页面相关更改上传文件特殊页面固定链接页面信息引用本页获取短URL下载二维码维基数据项目

打印/导出

下载为PDF可打印版

维基百科,自由的百科全书

ERC-20是以太坊区块链上的一种智能合约协议标准[1]。根据Etherscan.io的资料,截至2018年11月19日,一共有142273种加密货币兼容ERC-20[2]。

参考文献[编辑]

^ ERC-20 Token Standard - The Ethereum Wiki. Theethereum.wiki. [2017-08-30]. (原始内容存档于2017-08-29) (英语). 

^ etherscan.io. Etherscan Token Tracker Page. [2019-11-19]. (原始内容存档于2018-12-19) (英语). 

取自“https://zh.wikipedia.org/w/index.php?title=ERC-20&oldid=68903491”

分类:​另类货币区块链密码货币隐藏分类:​CS1英语来源 (en)

本页面最后修订于2021年12月1日 (星期三) 10:42。

本站的全部文字在知识共享 署名-相同方式共享 4.0协议之条款下提供,附加条款亦可能应用。(请参阅使用条款)

Wikipedia®和维基百科标志是维基媒体基金会的注册商标;维基™是维基媒体基金会的商标。

维基媒体基金会是按美国国内税收法501(c)(3)登记的非营利慈善机构。

隐私政策

关于维基百科

免责声明

行为准则

开发者

统计

Cookie声明

手机版视图

开关有限宽度模式