一、token的概念
1.token的英文说法
谈到EOSIO中的token,我们要先说下token这个词。
首先,我们先看下英文字典中的说法:
token
- n.
代币; 象征; 记号;
- adj.
作为对某事的保证的; 象征性的; 作为标志的;
- vt.
预兆:预示或象征,预兆;
# 变形
复数: tokens
可以看到Token不仅有“代币”的意思,还能包含积分、财产、证书等。如果进一步扩展的话,也可以代表荣誉标识、身份标识暨确权工具、系统资产量化指标、系统通行证和系统保护等,也就是说可以成为任何事物的权益或价值的代表。
2.token的区块链认知
那么,在区块链的概念中,token的认知应该是什么?从应用的角度来说,Token其实也是一种应用,其目的就是充当代币。最典型的例子就是比特币、以太币、EOS等等。
目前,Token主要分为两大类:
第一类,可以理解为内部Token,即维持区块链运营所发行的代币,用以激励矿工验证及创造区块,矿工需通过出块工作来进行换取。其实,这一类就可以理解为可以流通的数字加密的货币。
第二类,可分为权益代币和债券代币,就类似于投资和债券,并非货币,其代表就是现实中的股票和债券,购买可以获得一定的收益分红和利息回报。
在区块链平台中,token代表了用户所拥有的价值。用户在EOS平台上做的所有操作最终都会落到基于token的流通上,都是 以价值为核心的,这个与我们目前所使用的社会货币的流通与价值方式是完全一致的。
在币圈中有一种说法,认为Token是通往*的通证。这些布道者认为:Token的本质,是金融权利的被技术穿透,技术进步带来的天赋*,每一个碳生物和机器人都是平等的,每一个人类都可以用自己的信用做背书发行Token,来募集生产资料(币,或者等值算力)去实现自己的想法。不需要被任何人类社会组织结构剥削和胁迫而使用法币,所有的价值,应该都是基于人和人、人和机器、机器和机器之间形成的共识,通过算法予以确认。
对于数字货币信仰者来说,Token是通往*的通证。
首先,第一次摆脱了『债』的体系,以『Token』来计量生产。
其次,Token是加密的,*无法监管、无法剥夺、无法控制,100%避税,穿透了所有金融监管和法律体系,让金融牌照废纸化,是首个超越暴力控制的产权模式。
最后,Token天然是去中心化的、动态的,是认同的一种标志。随着核心生产资料从土地、矿产和能源,变成算力、智力和数据,劳动者、企业主的话语权越来越强,人才和智力是无法接受法币剥削的,只能撮合,交换,达成共识。
二、token是如何创建和发行、流通的
token的概念我们已经清楚了,既然它是一种金融权利的技术实现,那么它本身必然也带有金融的特性,那么它是如何运用在区块链平台上的呢?作为数字货币,与我们真实社会上使用的法币的特性保持了一致,所以也是需要有着创建、发行和流通过程,只不过这些流程需要通过区块链平台提供的系统接口功能或智能合约来进行实现。在EOS平台上,是通过eosio.token智能合约来实现的。EOSIO中的所有合约都必须从基类contract来派生,contract基类的定义如下:
我们再来初步看下eosio.token 合约的源码结构,如下图所示:
从上面的代码中,我们可以清楚的看到token对外提供的合约方法为:
三个代币的操作方法 create:创建代币、issue:发行代币、transfer:代币转账
两个代币的查询方法 get_supply: 获取代币的供应量信息、get_balance:获取指定账号代币信息
以上的方法中,使用到了一个定义为asset的类,这个类就是用来记录代币信息的对象类,其定义如下:
我们可以看到,EOSIO中的asset资产类有两个私有成员变量,amount代表的是资产的数量,是个无符号64位整数;而sym则代表了当前资产的代币类型对象。
三、token是如何在EOSIO中进行精度化存储和使用的
我们在平时使用EOS时,有时会发现代币有带小数点后几位的情况,但是之前介绍的token合约中,我们看到的asset资产类中的数量类型却是无符号64位整数,这是怎么回事呢?下面我们来具体的看下EOS中是如何来对资产信息进行精度化存储和使用的。
重点看下symbol的定义,如下:
还有需要我们关注的实现代码相关的内容:string_to_symbol_c方法,实现了给出代币小数点精度和名称后生成相应代币对象唯一uint64_t ID 的过程。
symbol的方法实现:
asset的to_real方法:
从上面的这段代码再结合之前的asset的方法,我们可以认识到如下几点:
a.代币的小数点后精度和代币的名称字串能够生成一个唯一的uint64_t类型的代币ID值
b.代币对象存储在一个uint64_t类型的空间中,最低8位存放 精度值,其他7个字节则按照反向字节序存储代币的名称字节。举例:代币(18,"GALAXY")在存储空间中是这样的,如下图所示:
c. 最终asset的存储是存储的uint64_t类型的数量值,但其对应的代币的类型决定了存储的数值在取出来用的时候,需要根据计算出的换算比率,来进行数值转换,这也是为什么我们在asset类中看到存在一个名叫to_real的方法,就是直接将数量值除换算数。存入时数量是整数值,要乘以换算数,取出时,则用整数值除以换算数,如下图所示,资产A的外部表示是个浮点数,但存储的时候存的是整数值,换算过程如下: