DTeam 技术日志

Doer、Delivery、Dream

ERC20代币合约开发相关函数和事件

冯宇 Posted at — Aug 5, 2018 阅读

了解ERC20代币合约的基本概念和思想之后,再来看看ERC20提供的函数和事件就简单多了。这些在开发中是经常会用到的。

ERC-20代币合约的相关函数

ERC-20代币合约内置了很多函数,允许用户查找账户的余额,以及通过各种各样的合约从一个用户转移到其他用户中,有如下的一些函数。

balanceOf()函数提供查询给定地址的代币数量的功能。注意任何人都可以查询任何地址的余额,所有在区块链上的数据都是公开的。

有两种方法从一个地址发送token到另一个地址上。transfer()函数的功能是直接将token从消息发送者转移到其他地址上。注意这种方式是没有办法查验接收地址的,因此确保发送正确是发送者自己的责任。

尽管transfer()函数用于从一个用户发送给其他用户token这个场景很不错,但是对于作为智能合约中的支付函数就不那么好用了。这是因为在智能合约运行的时候,智能合约没有权限获取哪个地址转账到哪个地址的细节,所以也就没办法断定调用合约的用户支付了合约要求的足够的资金。

假设一个名为Doer的合约部署在了区块链网络上。Doer有一个函数doSomething()需要10个名为Do的token运行。Joe想要调用doSomething(),并且账户中有50个Do token。Joe该如何支付Doer所需要的token,并且能成功运行doSomething()呢?

approve()transferFrom()这两个函数通过两个步骤实现解决上述的场景。第一步token拥有者给另一个地址(通常都是智能合约的地址)批准转出一个最大上限的token,也就是额限。token拥有者使用approve()函数提供这个信息。

image.png

上述例子中第二行显示了Joe的地址0x1f59…3492许可了Doer的地址0xd8f0…c028从Joe的账户中最多转走25个token。

一旦额限创建之后,智能合约就能从用户的配额中占有配额数量的token,作为合约执行的一部分使用。继续这个例子,Joe现在可以调用doSomething()并且doSomething()可以使用transferFrom()函数从Joe的账户中取得10个Do token继续它的工作。如果Joe根本没有10个token,或者额限设置的低于10个token,那么doSomething()将会失败。

allowance()函数提供限制一个地址转移到另一个地址的token数量的功能。注意任何人都可以查看任何地址的额限配置,正如前面所说,区块链的所有数据都是公开的。特别注意的是务必要理解这个额限设置是“软限制”,因为单独和累积的额限都可以超过该地址的余额。在上述例子中的许可表中,持有者0x2299…3ab7批准了转账的最高额限是500个token,但是余额正如先前所见,只有90个token。因任何使用allowance()函数的合约,在计算可用token的时候,都必须额外考虑持有者的余额。

ERC-20代币合约中的事件

ERC-20定义了在合约执行的相关动作中一定会触发的两类事件。第一类事件是Transfer(),发出一个token从一个地址转移到另一个地址的细节。第二类事件是Approval(),发出token许可从一个地址转移到另一个地址的细节。这些事件可以用于追踪地址上的余额和额限的变化,并且不需要查询区块链。

铸造代币会发送一个带有0地址的Transfer()事件作为源。

当token被销毁的时候是没有事件发送的。正因为如此,ERC-20代币合约才会常常使用transfer() 将token发送到0地址代替真正意义上的销毁。

超越ERC-20

ERC-20提供了一个非常强的构建代币合约的基础,但也并不是一点问题都没有。ERC-223提案提供了额外的特性和安全保障,但是并不兼容ERC-20。代币合约在今天构建时还是要继续遵循ERC-20的,开发者应该继续对ERC-223提案保持关注和贡献。

本篇内容来自英文原文: https://medium.com/@jgm.orinoco/understanding-erc-20-token-contracts-a809a7310aa5 在原文内容基础上做的翻译与部分校正和理解。


相关文章