首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

以太坊上的数字资产定义、发行、流通及ERC 20 标准接口

以太坊上的数字资产定义

以太坊设计目标就是让各种数字资产以智能合约的形式运行在以太坊虚拟机上。目前,在以太坊上的众多智能合约之中,应用最为广泛的是代币合约(Token Contract)。代币合约是在以太坊上管理账户及其拥有的代币的智能合约,实质上可以理解为一张账户地址和对应账户代币余额的映射表。

从某种意义上讲,以太坊上的代币可以被称为数字资产,记录资产数据的代币合约就是一份账本。代币既可以表示某一虚拟货币的价值,又可以象征某些实际的物理量,甚至可用于记录账户持有者的信誉值。但归根结底,以太坊上的数字资产就是指以太坊上代币合约中记录的账户代币余额数据。

与以往搭建由区块链直接记录的加密货币(Cryptocurrency)不同,以太坊上的数字资产(Digital Asset on Ethereum)是记录在以太坊之上的代币合约中。一般意义上的加密货币,如比特币、以太币和莱特币等,是记录在账户状态中,直接存储在区块内的数据,伴随“挖矿”等机制发行,并通过交易的方式流通。而数字资产则是以以太坊区块链为平台,记录在更高一层的代币合约中,具体来讲是存储在以太坊交易消息数据字段的可执行代码中。数字资产的发行无需经过复杂的“挖矿”程序,代币合约的创建者可以通过智能合约定义自己的代币发行标准,直接在合约代码中实现“铸币”功能。并且,代币的流通是通过在以太坊交易中调用智能合约的函数接口进行转账,代币合约创建者同样可以在这一过程中添加一些自定义的操作。相比之下,以太坊上的数字资产较加密货币拥有更高的灵活性,并且其安全性也由以太坊区块链机制和智能合约代码保证。

发行和流通

以太坊上的代币作为一种数字资产,需要有它的发行和流通机制。相较于以太币等加密货币基于PoW和PoS共识算法的发行机制和基于发送交易进行转账的流通机制,以太坊上数字资产的发行和流通更加简便灵活,相关的操作一般由代币合约创建者在代币合约中实现。常见的代币合约在记录账户及代币余额的基础上,还包含有一些基本的数字资产管理操作,如铸造代币、销毁代币以及代币转账等。代币转账是代币合约的一项基本功能,也是数字资产流通功能的具体实现。例如,账户Alice调用合约的转账功能函数,向账户Bob转入50个代币,此时合约中记录的Alice账户余额减少了50,而Bob账户余额增加了50。代币合约通过铸造代币和销毁代币来增加或减少代币供应总量,这两者是数字资产发行和回收功能的具体实现。当其他账户通过向合约转入以太币或其他方式调用合约铸造功能时,该代币合约向账户对应的余额值增加相应数量的代币,代币的总供应量也相应增加,完成铸币。例如,账户Charlie调用代币合约的铸币功能函数,合约经验证后在将其余额增加50个代币,同时代币总供应量也增加50个代币。类似地,账户通过调用合约的销毁功能函数,销毁其账户余额中的代币,代币总供应量也相应地减少。但是,通常代币合约的代币销毁功能时通过向特殊的零地址0x000…0000中转入相应数量的代币来完成,此时代币总供应量不会减少,选择这一操作的原因将在7.3.2节中详细介绍。

除了以上的转账、铸币、销毁等基本功能,代币合约还可以加入数字资产的查询、权限控制,甚至经济学公式计算等功能。那么,在功能繁多的代币智能合约之中,是否有共同点,或者对代币合约的基本功能进行一些规范呢?以太坊开发人员在以太坊改进计划(Ethereum Improvement Proposal,EIP)中提出了ERC 20 代币合约标准,为以太坊代币合约制定了一套标准的接口。

ERC 20 标准接口

自2015年提出以来,ERC 20代币合约标准在以太坊开发社区的协商下逐步确定为7.3.1节所展示的十一个标准接口。这一标准的出现为今年(2017年)以太坊合约代币井喷式发展打下了基础。ERC 20标准接口总共可分为三类:常量、功能函数以及事件,本节将按照分类对各个接口进行逐一介绍。

常量

常量类接口包含代币名称、代币符号和小数点位三个常量,分别定义了合约代币的名称、符号等基本信息。

(1)代币名称

代币名称(name)是由代币合约创建者指定的完整名称,是一串公开的字符串常量,如“CarToken”。尽管在以太坊上,代币名称是由各代币合约各自指定,无法保证一个代币名称唯一标识一种特定的合约代币。但在代币交易所中,符合ERC 20标准的代币可以向交易所提供代币名称进行注册,交易所通过注册机制可以检查并保证代币名称与代币合约一一对应,实现类似于ENS的效果。

(2)代币符号

代币符号(symbol)是由代币合约创建者指定的代币简称,是一串公开的字符串常量,一般由三至四个大写字母组成,便于标识该代币,如“EXT”。与代币名称相同,符合ERC 20标准的代币可以通过在各交易所中注册,使其代币符号能够唯一标识该代币合约。

(3)小数点位

小数点位(decimals)是由代币合约创建者指定的一个公开的无符号整数常量,用于指定代币的最小精度值,一般为18。小数点位的数值表示该代币在交易中最小单位在小数点后的位数,比如18表示该代币在交易中的最小单位为1*10-18个代币。实际上,之所以要引入这一常量,是因为以太坊虚拟机不支持小数计算,智能合约代码中涉及小数的数值只能先转换为整数后再进行计算。代币合约中设置最小精度值后,合约代码中的数值计算便可以先乘10的decimals次乘方转换为整数,再送入EVM进行计算,最终结果还原为小数,确保了合约中数值计算的精确性。

另外,需要指出的是,由于以太币本身的小数点位设置为18,因此符合ERC 20标准的代币一般将小数点位设置为18,。尽管如此,小数点位仍可以根据实际需求进行调整。当代币的数额计算中要求更高精确度时,小数点位可以设置的更高。当数字资产用于表示一些无法分割的实际物品,如软件证书时,代币的最小单位应为1,此时小数点位应设为0。

常函数功能

函数功能包含总供应量、余额、转账、从他人处转账、允许量值以及限额等六个功能函数,分别规定了实现代币合约所必需的查询、转账、权限控制等基本功能的函数接口。

(1)总供应量

总供应量totalSupply( ) 函数用于查看代币当前的总供应量,也即当前合约账本中所有账户余额的总和。该函数没有输入参数,返回值为无符号整数常量。

(2)余额

余额balanceOf( ) 函数用于查看当前合约中指定账户的代币余额。该函数的输入参数为账户地址,返回值为账户代币余额,为无符号整数常量。

(3)转账

转账transfer( ) 函数用于从当前账户向其他账户进行代币转账。该函数的输入参数为目标账户地址和转账的代币数额,返回值为布尔型变量。当账户满足当前有足够的余额、转账数额为正数以及合约编写者指定的其他条件时,转账成功,则合约中当前账户的余额减少,目标账户中的余额增加,函数返回值为真;否则转账失败,函数返回值为假。

(4)从他人处转账

从他人处转账TransferFrom( ) 函数用于从他人账户向其他账户进行代币转账。在有些情况下,用户不仅可以使用transfer( )函数自己发起转账,还可以授权他人在一定限额下调用transferFrom( )函数从自己账户中转出代币,而无需自己介入。例如,在一个银行合约中,由于合约无法控制用户的行为,不能命令用户使用transfer( )发起转账,但可以由用户提前授权,并通过transferFrom( )从用户账户中转出钱款,自动完成转账过程,而无需通知用户参与。该函数的输入参数为转账的发起地址、目标地址以及转账数额。与transfer( ) 函数一样,当转账成功时返回值为真,转账失败则返回值为假。

(5)允许量值

允许量值approve( ) 函数用于设定当前账户对指定账户的允许转账量值(allowed)。该函数的输入参数为代币使用方地址和允许使用的额度,返回值为设置是否成功的布尔型变量。ERC 20 标准为了满足更广泛的需求,提供了transferFrom( ) 接口。为了账户更方便地管理自己的账户余额,必须对其他人从本账户中转走的代币数额进行限制,于是ERC 20 标准引入了允许量值allowed。allowed 是一个二元组,allowed[A][B]记录的是用户A对本账户中允许账户B转走的代币额度。用户A通过调用approve( ) 函数并指定账户B和允许额度,对allowed[A][B]进行设置;当账户B调用transferFrom( ) 函数从账户A中转出代币时,须先通过检查,确保转出的数额不超过账户A设置的allowed[A][B]值,并且转账之后allowed[A][B] 值会减少相应的数额。

(6)限额

限额allowance( ) 函数用于查看当前的allowed 值。该函数的输入参数为代币持有方A地址和代币使用方B地址,返回值为当前在账户A中允许账户B转出的代币数额allowed[A][B],为无符号整型常量。

事件

智能合约中还包括了记录事件的event 类型接口,ERC 20 合约标准也对代币合约基本的事件接口进行了规范。ERC 20 标准要求代币合约需包含至少两个event:转账(Transfer)和允许(Approval)。

(1)转账(Transfer)

Transfer( ) 事件用于记录代币合约最基本的功能——转账。事件的输入参数为转账的发起方、接收方以及转账的代币金额,一般位于transfer( ) 函数和transferFrom( ) 函数中转账成功之后触发。用户可以从交易收据(receipt)中查看每一笔代币转账的相关信息。

(2)允许(Approval)

Approval( ) 事件用于记录代币合约的进阶功能——允许他人从本账户中转出代币。事件的输入是代币的持有者、使用者以及所设置的允许金额,一般位于approve( ) 函数中设置允许限额成功之后触发。用户可以从交易收据(receipt)中查看代币持有者对他人设置的允许转账限额等相关信息。

闫莺(博士)

微软亚洲研究院主管研究员,区块链领域负责人,微软Coco区块链平台中国负责人。中国软件协会区块链创业学院及区块链专委会专家、中国电子学会区块链专家委员。专注于区块链技术、大数据分析、数据库以及云计算的研究。在区块链领域获得多项国际专利,并在数据库和云计算领域国际会议论文和期刊30余篇。参与翻译《区块链项目开发指南》。

郑凯(博士)

电子科技大学教授,博士生导师,澳大利亚昆士兰大学计算机科学博士。主要研究领域为区块链数据管理,以及时空数据挖掘、不确定数据库、内存数据库、图数据库等。在数据库、数据挖掘等领域的重要会议和期刊发表论文100余篇,被累计引用1500余次。2013年获澳大利亚优秀青年基金,2015年获数据库会议ICDE论文奖。担任数据库领域知名国际会议的程序主席和联合执行主席,国际SCI期刊客座编委,以及数十个国际会议的程序委员。

郭众鑫

微软亚洲研究院研发工程师,微软Coco区块链平台核心开发者。专注于区块链技术、大数据分析、分布式系统等方面的研究和开发。

矩阵数字经济智库由矩阵财经依托“MATRIX贝叶斯研究基金”(MATRIX与清华大学教育基金会联合成立)和MATRIX与“一带一路研究中心”的战略合作协议发起。智库将联合区块链、人工智能、金融、数字资产管理与投资领域的专家,聚焦传统产业转型和技术/商业创新,以新技术赋能实体经济,推动技术进步,引领数字经济的变革。

矩阵财经出品

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181021G08X6Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券