作者: 冒志鸿(ArcBlock 首席执行官、首席架构师)、陈俊(ArcBlock 副总裁)
ArcBlock DevCon 2020[1] 的门票徽章引发了用户的极大热情、业界的极大关注,上面是 ArcBlock 社区用户用他们贵宾票领到的 NFT 徽章自制的视频。我们借花献佛,为所有关注支持 ArcBlock 的朋友伙伴送上节日的祝福。与此同时,参加网上黑客马拉松[2]的开发者朋友和我们团队则加班加点、用自己参赛 DApps 创意为节日献礼,为大会划上圆满的句号。
我们这次大会发行的门票徽章证书,以及即将颁发的黑客马拉松徽章证书,都属于 NFT(Non-Fungible Token,非同质通证)。那么什么是 NFT?通证是什么?和大家耳熟能详的比特币、以太坊等加密货币有何联系和区别?由冒志鸿与陈俊撰写的、中信出版集团出版、今天才印刷出厂的新书《区块链实战:从技术创新到商业模式》在第 2 部分《破除迷思,深入了解区块链的能力与局限》第 7 章《加密货币、加密资产和通证》专门做了概念介绍和辨析。
毋庸讳言,这几年来以比特币为主的各种加密资产及其带来的财富效应,才是吸引全世界的普通大众关注了解区块链技术的最大动力,在此之前可能还从未有任何一种计算机技术让如此多的行外人士如此着迷。
误解一:区块链就是比特币或数字货币。这是一种对区块链技术缺乏基本认识的典型误解。比特币、各种加密数字货币只是区块链的一种应用,而区块链支持很多种其他的应用。
误解二:区块链的作用就是用来“发币”。与误解一类似,区块链除了用于“发币”、发通证之外有很多种用途。“发币”的说法常来自炒作加密货币时代的产物。
误解三:“币”或“通证”除了用于炒作没有别的作用。“通证” 有相当多的用途,非常广范的应用场景,绝大部分区块链应用的设计都离不开使用某种形式的通证,即使这些应用不需要使用虚拟货币。加密货币交易虽然在过去可能是加密货币的主要用途,但已经有越来越多的实用项目采用区块链和通证技术。
误解四:政府要发国家数字货币就必须使用区块链。这也是一种误解,设计和实现一个 Token 并不是非需要区块链不可,完全可以不采用区块链技术。不过在技术发展的今天,采用区块链是一个比较有利的选择。
误解五:企业政府必须使用“无币区块链”。“无币区块链” 是一种“名词之争”,是一些人用于把“区块链技术” 和“币”划清界限而炮制的一种不科学的说法,误导性较强。某种角度而言,几乎不太存在无币(通证)的区块链应用场景。“无币区块链”就好比是“无数据的数据库”一样荒唐可笑。
区块链和“币”
比特币是世界上第一个区块链,因此毫无疑问,谈到区块链是无法回避数字货币的。为了能更好地理解区块链上的币、通证、数字资产的关系,我们有必要首先深入理解区块链的一些设计以及历史成因。
在目前流行的区块链设计里,有两类常见的设计:UTXO 模型和账户模型。无论加密货币、通证,还是加密资产等都离不开一个核心问题——在区块链上它们归属于谁。而这两种设计模型就是回答这个问题的基础。
UTXO 模型
中本聪在比特币白皮书一开始就引入了“电子硬币( Electronic Coin)”概念,并把它定义为“一连串的数字签名(a chain of digital signatures)”,这就是比特币交易的基础,可能也是比特币之所以成为“币”的原因。
比特币里采用了称为 UTXO(未花费的交易输出)的交易模型,你可能有所耳闻并在本书其他部分读到。作为一本非技术的读物我们不打算仔细讲解这一交易模式,但是可将它类比成日常使用的硬币、纸钞等现金支付这样的方式以帮助理解。
假设买一杯奶茶需要支付 32 元,如果用微信钱包、支付宝或银联等电子支付的话,那么非常简单直接扣除 32 元即可,完全不用担心零头的问题,但是拿出现金支付时,就有以下几种付款找零的情形:
•32 枚 1 元的硬币,这时候正好不用找零,但大部分时候我们没带这么多硬币在身上
•3 张 10 元钞票,外加 2 枚 1 元硬币,这样也不需要找零
•4 张 10 元钞票,店家会给我们 8 枚 1 元硬币作为找零
•1 张 100 元钞票,店家给我们 1 张 50 元钞票,外加一张 10 元钞票,外加 8 枚 1 元硬币 ……
UTXO 就是类似于上述现金支付找零这样的方式,只不过并不是硬币本身,而是一个“找零”记录,这个“找零”记录就被称为 UTXO。
比特币这一设计思路是:只记录交易,不记录最终状态,其一个最大的好处就是验证比较容易,我们仍然用现金消费来理解一下:当我们要买上面那杯 32 元的奶茶的时候,我们看下钱包如果发现所有钞票硬币加起来也不足 32 元,我们马上就知道自己钱不够,而要知道一圈购买下来还剩多少钱,把钱包里没花掉的钱加一下即可。
因此比特币里的交易里不是大家想象的转账方式,把 A 的账户余额减少一点,对应把 B 的账户余额增加一点。比特币的系统里面并没有一个“账户余额”的东西存在,你每次在比特币钱包里看到的余额其实是数字钱包根据区块链上的数据(UTXO)计算出来的。从某种角度上来说,在比特币的系统里并不真正存在“币”本身,而只存在 UTXO,“币”仅仅是计量上的概念。
UTXO 和账户余额的体系相比更复杂,可以表达的状态和附加信息更少,扩展性不足。但对于比特币这样一个以点对点的电子现金为设计目标的系统来说已经足够,而其高效率、灵活、防止双花攻击更容易等优点更为重要。大量基于比特币代码分叉的区块链都是采用了类似做法,而在更关注应用和扩展能力的区块链,例如以太坊、Hyperledger Fabric、ArcBlock 等都无一例外还是采用了账户模型的设计方式。
账户模型
账户模型和我们常用的互联网账户、银行账户这些账户模型非常接近,因此比较容易理解。你可以把一个用户的账户模型理解成为一组通用的“容器”,其中一种常见的 “容器”叫“计数器”, 这最容易被用来实现“账户余额”。在这种“账户余额”下的交易,就是我们常规理解中的转账——每次转账交易实际上就是多个参与账户之间的数额变化,当然区块链需要保证这些数额是正确的,不会出现双花攻击等,以太坊里的以太币(ETH)就是这样实现的。
账户就像一组通用容器,意味着账户模式非常灵活,一个账户可以包含多种不同的“容器”,用来保存不同的数据,这就意味着一个账户里完全可以有多种不同的“币种”, 除了这种可以任意分拆按“账户余额”计数的,还可以保存那些不可分拆的,也可以组合地保存多种不同的。这就不难理解在以太坊之上,一个账户除了有 ETH 余额,还可以有各种各样 ERC20 Token 的余额,实际上还可以保存各种各样的数据形态。可编程的区块链系统,如以太坊、Hyperledger Fabric、ArcBlock 等账户系统都可以支持几乎可以被应用无限扩展的区块链上的数据。
账户模型和 UTXO 模型并不矛盾,实际上完全可以直接在账户模型下实现和 UTXO 类似的机制,也有一些区块链尝试把两者结合起来。不过在 UTXO 模型下想实现类似账户的机制也相当麻烦。
Token 命名考源
既然账户体系可以保存如此众多灵活的数据,开发者按照用途作出一些约定(称为协议、数据规范、数据格式等)用来表述各种各样的需求。最先出现的称呼当然是沿用习惯的 Coin,但由于 Coin 本身在比特币体系里已有特定含义,而且在实现机制上又有所不同,因此早期开发者采用了 Token 这个词。
早期还曾有人用 Asset(资产)来指称过,比较著名的有染色币时代的“开放资产协议”(Open Assets Protocol)中使用了 Asset 这个词。但由于 Asset 这个词本身表示的“资产”有特定含义,以太坊著名的 ERC20 标准出现时,其规范文档中使用了 Token 来描述这套标准定义。随着以太坊和 ERC20 标准的流行,Token 成为最为主流的命名。
其实 Token 在英文语境下,尤其在计算机领域里,是一个经常拿来指代“一团不知道究竟该如何命名的数据”的“万精油”名词,因此早期开发者用 Token 来命名一点不奇怪。
Token 这个词汇在计算机领域常被用于不同的场合表达不同含义:上图中所示是一个早期著名的网络架构–令牌环网(Token Ring)里 Token 控制发送数据的权力。很多计算机应用场合都还有被称为 Token 的东西,比如 Session Token,Security Token,Access Token、JSON Web Token,CSRF Token 等等,注意他们其实都是不相关的概念,其共性就是一种表示“有特定用处的、独特不重复的、一小块的数据”。
Token 这个词汇在中文世界首先被翻译成了“代币”,这基本抹杀了当初英文世界命名者称其为 Token 的“良苦用心”,不过后来有人建议把它翻译为“通证”,避免其和“币”有直接的字面联系。
Token 翻译的“代币”、“通证”的之争
区块链语境中,这些权益的英语表达还是都用 Token。当中文要进行翻译的时候,显然,“令牌”一词不能满足更丰富的含义,加之区块链项目投机蔚然成风,Token 被许多人翻译成了“代币”,但是显然这个翻译并没有反映出 Token 一词在区块链项目里所代表的准确含义。2018 年,经过国内区块链行业的热烈讨论之后,Token 开始被更多的文章翻译成“通证”。
2018 年,中关村区块链联盟理事长元道与 CSDN 副总孟岩认为,Token 应该翻译成“通证”更为合适。他们认为 Token 就是一种“可流通的加密数字权益证明”。在一个可以运行 Token 的平台上发行加密数字货币,是一件易如反掌的事情。但是直接把 Token 译为代币,肯定是错误的。因为 Token 所代表的,可以是一切权益证明,甚至是一切凭证,不仅仅是货币。但是无论是使用令牌也好,还是代币也罢,都不能很好的体现出 ICO 之后 Token 处于新阶段的角色转换,因为其拥有了更多的作用,所以创造了一个新词“通证”。Token 区块链语境下的翻译从“代币”改成“通证” 也都是“名词之争”。从 Token 究竟翻译成什么,我们也可以看出人们根据自己立场观察技术的心态,虽然 Token 还是那些作用,也仍然是那个英文单词,但如何称呼它,其实是根据每个人的看法而不同。喜欢以代币来称呼 Token 的,可能更认可更强调 Token 在数字货币的价值,而喜欢使用通证这个译名的人,则认为“通证”才能更全面的反映 Token 实现的多样化功能。
走出“名词之争”
在我看来,读者完全可以认为区块链领域里的 Coin(币)、Token(通证)、Asset(资产)、Cryptocurrency(加密货币)、Crypto Token(加密通证)、Crypto Asset(加密资产)是同一类东西,不必在这些名称里陷入“名词之争”。
比如,说比特币是一种 Coin(币)、Token(通证)、Asset(资产)、Cryptocurrency(加密货币)、Crypto token(加密通证)、Crypto Asset(加密资产),无论用哪个词汇指称它,都对。
在本文的后半部分,我们将用英文的 Token、中文译名“通证”来表述上述任何一种概念。
绝大部分的区块链应用的核心都围绕通证
一个数据库应用的核心是什么?毫无疑问是“数据”,虽然在偶尔极个别应用场景下,数据库会用在和数据本身不相关的地方,例如当年著名的互联网项目 Flickr 曾介绍他们用数据库来作为一个分布式序号计数器的经验。一个电子表格应用,比如微软的 Excel 的核心是什么?毫无疑问是“电子表格”,虽然有人用 Excel 来作画,并且在网上引起过小小的轰动。一个区块链应用的核心是什么,答案就是“通证”。
所有数字货币类型的区块链应用,如比特币等,毫无疑问作为币的通证就是其全部。而在著名的企业联盟链 Hyperledger Fabric 设计里,排列其“资产-参与方-交易”模型之首的就是数字资产,一种通证的典型形态,或者另一种叫法。任何使用 DID、可验证证书技术的应用,本质上都是在使用作为身份的通证和作为证书的通证。读完本书,你可能会发现通证技术有非常广范的应用场景,绝大部分区块链应用设计都离不开使用某种形式的通证,即使这些应用不需要使用虚拟货币。
实际上,基于通证的各种应用是区块链未来最令人激动的地方。正如我在序言里展望的那样,未来 10 年里,区块链技术可能将释放其巨大的威力,区块链网络将成为像今天的电信网和互联网一样的社会基础架构,基于区块链的各种数字通证会如同今天电子邮件一样无处不在,以区块链为基础的应用会如今天的万维网站点和移动应用一样成为每个人生活中不可缺少的一部分。
为什么设计实现 Token 需要使用区块链?
首先设计和实现一个 Token 并不是非需要区块链不可。
你没有看错,区块链并不是必要的,在区块链诞生和流行之前,人们已经用很多种方式实现了各种各样类似的数字币、数字通证的各种功能,被成千上万人使用。看一看现在的网上银行、各种航空公司、酒店或商家的里程积分系统、游戏点卡等等,这些业务已经成熟使用了很多年,这就充分说明没有区块链不影响这些通证业务成功开展。
那么,现在需要设计一个使用 Token 的应用需不需要使用区块链技术呢?答案是:Yes!为什么?因为用区块链技术来定义 Token 是最新的技术进展,比用传统数据库的方式更安全、高效、架构成熟。
很多人因为比特币而知道加密货币和通证。在比特币之前,数字化的货币就是密码学的一个研究分支。密码学界一直有个梦想:手里的实物现金能否数字化,通过数字加密技术像发一封电子邮件那样,直接从某一个数字身份转移到另外一个数字身份名下?读者在第一部分第二章“区块链诞生之前”部分了解到的各种密码学的进步及其应用在 eCash、B-money、BitGold 等探索发明各种数字货币。这些创新突破分别通过签名技术解决了数字货币发行者、持有者的身份问题,非对称加密技术则部分解决了数字货币的流通问题,留下的核心难题“双重花费”问题被 2009 年横空出世的比特币用点对点交易、全网记账和 UTXO 账户设计加以解决。
过去使用中心化的系统来实现数字货币或通证的功能,需要为安全性、可靠性、可审计性付出巨大的代价。那些小规模移动游戏里的积分、虚拟币系统之所以似乎并没有花费巨大,只是因为其本身价值还不够大。
区块链必须有 Token 吗?
虽然大部分区块链系统都默认设计有 Token,但并不是必须的。区块链系统完全可以不设计 Token。例如一些联盟链系统,比如 Hyperledger Fabric、R3 Corda 等通常就没有包含默认 Token。
我们已经知道 Token 其实只是用来表征链上某种实体的数据而已,那么区块链作为一种数据库,只要里面有数据存在就一定是表征某个实体,因此这个区块链系统即使不设计 Token,应用如果需要的话也可以在此基础上再创建出 Token 来。在数字货币概念比较受排斥的时候,有一些人提出了所谓“无币区块链”,可以认为这是另外一种名词之争。当你读完本章或本书对区块链及其应用有更多理解后,会发现绝大部分区块链应用设计都离不开使用某种形式的通证,即使这些应用不需要使用虚拟货币,因此“无币区块链”纯属于无稽之谈。
比特币设计时采用了一个有趣的激励机制,就是给每轮里成功产生区块的“矿工”一定数量的比特币作为奖励。后来的很多区块链的激励机制,也使用类似的“挖矿”奖励 Token 的形式,因此有人认为 Token 和激励机制是必然的对应关系。其实,这并非必然,只不过在一个区块链上采用链上 Token 作为奖励惩罚机制比较容易实现。区块链上可以设计 Token 但不用于激励机制,也完全可以设计或使用一个区块链而没有激励机制,或者使用其他的方式来作为激励机制而不使用通证。
同质通证(FT)和非同质通证(NFT)
还有一种划分方式是按照 Token 是否同质、是否可拆分来区分出两类不同的 Token:同质通证( Fungible Token,缩写 FT)和非同质通证(Non-fungible Token,缩写 NFT)。
同质通证
所谓同质通证就是可以切分,只要数额相等的就意义相同的这种通证。常见的加密货币,如比以太币(ETH),或者各种 ERC20 Token 都属于同质通证。
举例而言,我的以太坊账户里原来有 10 枚 ETH,无论经过多少次转账后,只要我账户里仍然还有 10 枚 ETH,那么对我而言这个账户余额就没有任何变化。也就是任何进进出出的 ETH 都是同质的,用户在意的仅仅是数量。
非同质通证
非同质通证是独一无二的,也是不可替代的。例如一张证书、一张门票等,即使他们有同类,甚至非常类似,但每一个都是独一无二的,而且他们通常也无法被切割拆分。
比如著名的以太坊游戏加密猫(Cryptokitty)就是使用了 ERC721 标准在以太坊上发行的非同质通证,每只猫都对应着一个独一无二的非同质通证。
非质通证有各种各样的形态,从徽章、证书、会员卡、门票等等都是典型的非同质通证,有着非常丰富的场景
其实如果再细分非质通证的话,还可以有一些更有趣的分类。比如有些通证虽然独一无二,但属于同一类型,因此可以为这些通证定义出一个“类”或“模版”,免得每个通证都需要包含相同的信息浪费区块链资源。比如电影票,大部分票的样子都差不多,因此可以定义一个电影票公用模版的通证,然后每张票只需要很少的独特信息(如场次、座位等)。以太坊上的 ERC1155 标准在 ERC721 上作出延伸,就是解决这样的非同质但有类和模版的标准。
多个不同的非同质通证有时候也许有需求组合成另外一个通证,一个典型的例子,例如一个情人节的礼物促销,一个礼包的通证里包含了两张电影票,一张停车券,还有一张餐厅消费卡。在以太坊上也有 ERC998 来提供这种组合型的非同质通证的标准。
上面提到的 ERC 标准都是以太坊上的通证标准,需要注意在不同的区块链上通证的格式、协议等目前没有统一标准。例如在 ArcBlock 的区块链上和非同质通证相关的协议称为 ABBA 协议(ArcBlock Blockchain Assets Protocol,ArcBlock 区块链资产协议),而在 Algorand 区块链上称为 ASA(Algorand Standard Assets,Algorand 标准资产)标准。可以预见在未来 Token 协议标准方面的不同会是一个挑战。
在这个定义下,细心和喜欢思考的读者可能会想,那么比特币和那些使用 UTXO 的币应该算哪一种呢?我觉得在概念上可以认为符合同质通证,但在其具体实现上又更接近非同质通证,因为每一个 UTXO 都是独一无二的。这其实也不难理解,想象一下现实中的钞票,其实每张钞票都有独一无二的编号,从钞票个体而言是非同质的,而对大多数使用钞票的人而言,大家关心的只是钞票上的面值数字而已,因此又是同质的。
我们可以看到,很多概念并不是非黑即白,而是要看从哪一个角度去考虑,“中心化”还是“去中心化”、 “同质”还是“非同质”都是如此。