欧易

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

欧易交易所推荐 2022-09-20 欧易官网okex官网

在区块链2.0的年代,Ethereum以太坊其中一个特点就是允许所有人在平台上透过智能合约SmartContract作出各种DApp应用,其中最为人所熟悉的一种应用就是Token代币,要理解Token代币的概念很简单。举个例子,你到游乐场,要先用现金兑换游乐场的游戏币,才能透过这些游戏币去使用各种设施。同理,在区块链的世界中,若要使用各种区块链的服务,就很有可能要透过获得各种Token,从而获得服务的使用权,这使得Token作为一种价值传递的媒介。

也就是说,Token在某程度上被视作货币的角色,一种无型的货币-虚拟货币。目前在市场上充斥着大量各种各样的虚拟货币,这类型的虚拟货币并没有自己独立的区块链,而是依赖以太坊区块链并运行于其之上。

当然,创建一种虚拟货币有很多种方法,比如说比特币、Zcash等等都有其自己的链,而它们都在自己的链上运行着各自的虚拟货币,并不说一定要使用智能合约并部署在以太坊上才叫虚拟货币。

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

ERC20

ERC的全称为EthereumRequestforComments,而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=>uint)balances

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

mapping(address=>mapping(address=>uint))allowed

{dede:field.title/}

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

balanceOf(addresstokenOwner

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

transfer(addressto,uinttokens

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

transferFrom(addressfrom,addressto,uinttokens

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

approve(addressspender,uinttokens

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

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

totalSupply(

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

allowance(addresstokenOwner,addressspender

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

例子

再引用官方的例子的说明

TokenBalance

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

balances[0x]=

balances[0x]=

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

A:0x

B:0x

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

tokenContract.balanceOf(A)将会返回

tokenContract.balanceOf(B)将会返回

TransferTokenBalance

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

tokenContract.transfer(B,10

将得到下列结果

balances[A]=90

balances[B]=

ApproveAndTransferFromTokenBalance

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

tokenContract.approve(B,30

将得到下列结果

tokenContract.allowed[A][B]=30

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

tokenContract.transferFrom(A,B,20

将得到下列结果

tokenContract.balances[A]=70

tokenContract.balances[B]=

tokenContract.allowed[A][B]=10

总结

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

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

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

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

展开阅读全文
文章标签: 欧易正确网址
okex注册
微信复制成功