以太坊(Ethereum)ERC20 代币(Token)标准

在区块链2.0 的年代,Ethereum 以太坊其中一个特点就是允许所有人在平台上透过智能合约Smart Contract 作出各种DApp 应用,其中最为人所熟悉的一种应用就是Token 代币,要理解Token 代币的概念很简单。举个例子,你到游乐场,要先用现金兑换游乐场的游戏币,才能透过这些游戏币去使用各种设施。同理,在区块链的世界中,若要使用各种区块链的服务,就很有可能要透过获得各种 Token,从而获得服务的使用权,这使得 Token 作为一种价值传递的媒介。也就是说,Token 在某程度上被视作货币的角色,一种无型的货币-虚拟货币。目前在市场上充斥着大量各种各样的虚拟货币,这类型的虚拟货币并没有自己独立的区块链,而是依赖以太坊区块链并运行于其之上。当然,创建一种虚拟货币有很多种方法,比如说比特币、Zcash等等都有其自己的链,而它们都在自己的链上运行着各自的虚拟货币,并不说一定要使用智能合约并部署在以太坊上才叫虚拟货币。

Token 是以太坊上智能合约的其中一种应用,创建Token 要编写智能合约时,为了具备作为货币的必要特性,就要有交易处理,帐户余额记录、兑换等货币"必备"的功能,而且当智能合约部署后,众所周知,根据区块链的特性,是不能再修改的,如果当中有任何的漏洞或错误,令到整个应用出现不能逆转的缺陷和灾难性的损失,故此对智能合约的准备性和安全性也是相当高。另外,在缺少一种标准(协议)的情况下,每一份Token 的智能合约的内容都可以完全不一样,这种Token 之间的数据不能容易地进行交换,彼此形成"隔离",然而如果有一种规范、模板或指引,告诉你应该要如何标准化、安全地编写一份作为"货币"应有各种性质的智能合约,亦可以令各Token 的智能合约之间可以互通,那将是多么方便和美好的事,故此,以太坊社区提出一种名为ERC20 的协议(标准)。

ERC20

ERC 的全称为 Ethereum Request for Comments ,而 20 是代号。

当你想创造一种Token 时,ERC20 是一种协议(标准) ,能够指引你应该如何编写一份具有"货币"特性的智能合约,另外,亦可视为快速构建Token 的"模板",毋须再"重复造轮子",省去了不少时间。

它定义了一份智能合约中必须具备的

6个function(函数)包括  totalSupply、balanceOf、allowance、transfer、approve、transferFrom 。

 2个event(事件)包括Transfer、Approval。

首先看一下这2 个function,有些function 后面声明了constant,意思就是这个function 是"只读"的,并不会修改到智能合约的状态,所以声明了constant 就说明读取这类function 并不需要消耗Gas。反之,其他function 后面没有声明constant,就代表会修改到智能合约的状态,故此,需要消耗Gas,请链上的各位矿工帮你验证"出块"。

另外2 个event 则只用为重要的事件作记录之用,如Token 之间转账记录,而不会影响智能合约运作,可以视为一般系统中的日志Log。

ERC20 开始时需要设定

Token 的名称(name);

Token的代号(symbol):Token 的简称,通常会设定成3 至4 个字母,比如ETH。

Token 支持小数点后的位数(decimals):Token 代币能够支持最小的单位,通常会设定成18,意思就是Token 最多可至小数点后18 位。

为了更好清楚地了解ERC20 ,就以官方的例子作解释

mapping(address => uint256) balances 

balances 就是指账户上Token 的余额,以mapping 的形式储存,如「账户地址:Token 数量」这种形式对应,若外界需要查找某个账户地址上的余额,就只需要利用这个mapping 查一下就可得知Token 数量,简单直接。

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

allowed 就是指允许让其他账户地址使用的Token 数量,同样以mapping 的形式储存,不一样的是,这个是再"包"一层,使用两层的mapping 的形式储存,如「账户地址A =>账户地址B => Token 数量」这种形式对应,意思也就是账户地址A允许账户地址B使用账户地址A中指定的Token数量,有点像现实生活中的支票。

balanceOf(address tokenOwner)

顾名思义,就是直接获取指定账户上Token 的余额。

transfer(address to, uint tokens)

利用这个function的账户地址作为msg.sender,减去指定数量的Token( tokens),在指定账户地址(to)加上相应数量的Token( tokens),最后再以事件Transfer( msg.sender , to, tokens)以Log记录发送账户地址、指定账户地址、Token数量。

transferFrom(address from, address to, uint tokens)

首先将from的账户地址中减去指定数量的Token( tokens),然后就使用上面的  allowed 的msg.sender允许from的账户地址减去指定数量的Token( tokens),然后在to的账户地址中加上相应数量的Token( tokens),最后再以事件Transfer( from , to, tokens)以Log记录发送账户地址、指定账户地址、Token数量。

approve(address spender, uint tokens) 

利用这个function 的账户地址作为msg.sender,授权指定地址spender可以从msg.sender 的账户地址中提款。同样地,最后以Approval(msg.sender, spender, tokens) 以Log 记录msg.sender 的账户地址、指定账户地址、Token 数量。

另外还有两个function 官方的例子并没提及,就是:

totalSupply()

Token 的发行总数,当到达Token 发行数量的上限,智能合约就将会拒绝再发行新的Token

allowance(address tokenOwner, address spender)

检查尚可以从tokenOwner 钱包提取的Token 数量

例子

再引用官方的例子的说明:

Token Balance

假设这个智能合约目前有两个地址分别拥有的 Token 如下:

balances[0x1111111111111111111111111111111111111111] = 100

balances[0x2222222222222222222222222222222222222222] = 200

 

由于这个地址太长,所以我就简化了一下,设为

A: 0x1111111111111111111111111111111111111111

B: 0x2222222222222222222222222222222222222222

 

如果调用function balanceOf 则会回传以下资讯:

tokenContract.balanceOf(A) 将会返回100

tokenContract.balanceOf(B) 将会返回200

 

Transfer Token Balance

如果 A 想要转移 10 tokens 给 B,调用

tokenContract.transfer(B, 10)

将得到下列结果

balances[A] = 90

balances[B] = 210

 

Approve And TransferFrom Token Balance

如果 A 允许 B 拥有转移 30 tokens ,则调用

tokenContract.approve(B, 30)

将得到下列结果

tokenContract.allowed[A][B] = 30

如果此时 B 想要转移 A 的 20 tokens 给自己,则调用

tokenContract.transferFrom(A, B, 20)

将得到下列结果

tokenContract.balances[A] = 70

tokenContract.balances[B] = 230

tokenContract.allowed[A][B] = 10

总结

写本文的目的,主要除了介绍ERC20这个协议(标准)外,另一样更重要的是想令大家知道目前在市场上充斥大量可疑的ICO,透过使用现有一些协议,如ERC20,毋须太高深的技术,发行各种"空气币"、"山寨币"也只是短短十数分钟内的事情,不信?看下这个网站上共有36,000种以上的Token  https://etherscan.io/tokens  。更甚者,还有一些网站  TokenFactory  能够让一般人只填入Token的名称、代号、发行数量等基本资料,就可以自动生成一份智能合约,连代码都不用编写,直接就可以发布到以太坊上,所以要发行一种新的Token门槛并不高,由此就希望各位自行考量一下那些ICO的真实程度了,并不是说所有ICO都是这样,当中也有一些不错的ICO项目,但更大部份的ICO项目,各位可要小心一点了。

当然,刀刃有两面,ERC20 很大程度上简化、标准化大家发行Token 不用"重复造轮子",发行简单方便,而且只需符合标准就可以被很多交易所、钱包软件集成,亦可以在这些交易所、钱包软件上直接进行交易买卖。

最后,再次说明写本文的目的是希望大家能够了解发行Token 是可以非常简单的,所以劝告大家在进行购买一些ICO 项目的Token 时,可是要相当小心,再三留意项目的本质。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。