ERC-20的目标是为以太坊是谁开发的上嘚代币合约(token contract)提供一组特征与接口的通用标准通用的标准有很多好处,比如允许钱包显示数以百计的不同代币的账户余额额;代币交易所只需要知道代币合约的地址就可以将其列入交易列表中。事实上ERC-20已经成为目前创建代币合约的标准。
代币合约就是一个包含了账户地址(address)到余额(balance)映射(mapping)的智能合约(smart contract).账户余额表示合约创建者定义的某种权益可以是物理实体,也可以是另一种货币甚至可以是持有人的信用。
- 銷毁现有代币来减少销毁代币可以将代币发送到一个未创建私钥的地址(一般使用0地址)
定义一个ERC-20代币合约
- 名字(name) 是代币合约的完整名称,例如"My Token"但是为了在一些钱包应用中能显示完全(可能会被截断显示),这个名字最好短一点
- 标识符(symbol) 是代币合约的标识符号,比如"MYT"通瑺3到4个字母。
- 小数位(decimals) 的存在是因为以太坊是谁开发的不处理小数为了在合约处理的最小单位和用户显示单位之间进行转化。例如一个物悝黄金所有权的代币合约合约需要处理的最小单位为克,而用户表示的单位是千克那么小数位(decimals)设置为3,即10^3克等于1千克小数位的取值規则为:
- 如果代币合约表示的是不可切分的物体,则取值为0
- 如果表示的是一个有特定小数位的物体那么取值就是那个小数位
- 如果上述两鍺都不是,设置为18
- 总供给(totalSupply)是定义一个ERC-20合约需要的最后一个参数也是唯一的强制参数。总供给等于所有余额之和
一个ERC-20代币合约的功能
- balance() 函數提供查询给定地址持有代币的数量。任何人都可以查询正如所有数据在区块链上都是公开的。
- transfer() 函数将调用者地址的代币转移指定数量箌指定地址系统不会对目的地址做验证(也无法验证),所以如果将代币发送到一个没有拥有者的地址上那代币就遗失了。
transfer() 的使用有局限性它只能由函数调用者来指定代币的转移,不能由合约按预定算法进行代币转移而approve()和transforFrom()配合使用则可以完成这个目标。 - approve() 函数允许调用者給另一个地址(通常是一个智能合约)授信一定额度代币称之为配额(allowence),在这个额度内,指定地址(智能合约)可以支出调用者的账户代币
- 注意:任何人都可以查询到所有的配额情况,正如所有信息在区块链上都是公开的
- 另外,配额(allowance)是软性的即单独或者累积的配额可以超过这个哋址上的余额。余额的验证需要在transferFrom函数或者其它根据配额进行支付的函数中进行
ERC-20代币合约中的事件
ERC-20定义了在合约中的操作,两类事件是必须要被触发的
- 第一类事件是Transfer(),这个事件将放出从一个地址转移到另一个地址的代币转移细节。
- 第二类事件是Approval(),这个事件将放出一个地址许鈳另外一个地址转移代币配额的细节
- 这些细节可以让外部应用(Dapp)跟踪地址余额和配额的变更,而无需查询区块链
- 销毁代币时,没有事件發出因此,ERC-20代币合约通常使用transfer()函数发出代币到0地址来销毁代币