以太坊智能合约开发指南2(理解ERC-20代币合约)

ERC-20的目标是为以太坊上的代币合约(token contract)提供一组特征与接口的通用标准。通用的标准有很多好处,比如允许钱包显示数以百计的不同代币的账户余额额;代币交易所,只需要知道代币合约的地址就可以将其列入交易列表中。事实上,ERC-20已经成为目前创建代币合约的标准。

代币合约(token contract)是什么?

代币合约就是一个包含了账户地址(address)到余额(balance)映射(mapping)的智能合约(smart contract).账户余额表示合约创建者定义的某种权益,可以是物理实体,也可以是另一种货币,甚至可以是持有人的信用。
变更代币的总供给(totalSupply)有两种方式:

  • 铸造新的代币来增加
  • 销毁现有代币来减少,销毁代币可以将代币发送到一个未创建私钥的地址(一般使用0地址)

定义一个ERC-20代币合约

一个ERC-20合约通过地址和总供给(totalSupply)来定义,通常还提供一些非必须(optional)的东西,为用户提供更多细节。包括名字(name),标识(symbol),小数位(decimals)

  • 名字(name) 是代币合约的完整名称,例如"My Token"。但是为了在一些钱包应用中能显示完全(可能会被截断显示),这个名字最好短一点。
  • 标识符(symbol) 是代币合约的标识符号,比如"MYT"。通常3到4个字母。
  • 小数位(decimals) 的存在是因为以太坊不处理小数,为了在合约处理的最小单位和用户显示单位之间进行转化。例如一个物理黄金所有权的代币合约,合约需要处理的最小单位为克,而用户表示的单位是千克,那么小数位(decimals)设置为3,即10^3克等于1千克。小数位的取值规则为:
    1. 如果代币合约表示的是不可切分的物体,则取值为0
    2. 如果表示的是一个有特定小数位的物体,那么取值就是那个小数位
    3. 如果上述两者都不是,设置为18
  • 总供给(totalSupply)是定义一个ERC-20合约需要的最后一个参数,也是唯一的强制参数。总供给等于所有余额之和。

一个ERC-20代币合约的功能

  • balance() 函数提供查询给定地址持有代币的数量。任何人都可以查询,正如所有数据在区块链上都是公开的。
  • transfer() 函数将调用者地址的代币转移指定数量到指定地址。系统不会对目的地址做验证(也无法验证),所以如果将代币发送到一个没有拥有者的地址上,那代币就遗失了。
    transfer() 的使用有局限性,它只能由函数调用者来指定代币的转移,不能由合约按预定算法进行代币转移。而approve()和transforFrom()配合使用则可以完成这个目标。
  • approve() 函数允许调用者给另一个地址(通常是一个智能合约)授信一定额度代币,称之为配额(allowence),在这个额度内,指定地址(智能合约)可以支出调用者的账户代币。
  • transferFrom() 调用者在配额(allowence)范围内,从一个地址(_from)将代币转移到另外一个地址(_to)。
  • allowance() 函数提供查询拥有者地址(_owner)配额给消费者地址(_spender)的金额。
    1. 注意:任何人都可以查询到所有的配额情况,正如所有信息在区块链上都是公开的。
    2. 另外,配额(allowance)是软性的,即单独或者累积的配额可以超过这个地址上的余额。余额的验证需要在transferFrom函数或者其它根据配额进行支付的函数中进行。

ERC-20代币合约中的事件

ERC-20定义了在合约中的操作,两类事件是必须要被触发的。

  • 第一类事件是Transfer(),这个事件将放出从一个地址转移到另一个地址的代币转移细节。
  • 第二类事件是Approval(),这个事件将放出一个地址许可另外一个地址转移代币配额的细节。
  • 这些细节可以让外部应用(Dapp)跟踪地址余额和配额的变更,而无需查询区块链。
  • 铸造代币会发出一个源地址(_from)为0的Transfer()事件。
  • 销毁代币时,没有事件发出。因此,ERC-20代币合约通常使用transfer()函数发出代币到0地址来销毁代币,

参考文档 https://medium.com/@jgm.orinoco/understanding-erc-20-token-contracts-a809a7310aa5

你可能感兴趣的:(以太坊智能合约开发指南2(理解ERC-20代币合约))