货币是可以用作交易媒介、储藏价值或延期支付标准的记账单位。关于货币的本质,学术界仍存在大量的争论。在宏观经济学中,货币不仅是指现金,还可以是各种有形和无形的资产。从现代货币银行学角度来看,货币本质上是一种所有者与市场关于交换权的契约,可以理解为一种具备法律效应的借条。
货币的契约本质决定了货币可以有不同的表现形式,如一般等价物、贵金属、纸币、电子货币等。
货币是伴随着商品价值形式的不断发展变化而最终产生的。商品价值形式经历了以下4个不同的发展变化阶段,当价值形式发展到第四个阶段时,货币就产生了。
● 简单的或偶然的价值形式阶段。在这一阶段,一种商品的价值仅仅是简单的或偶然的表现在与它相交换的另外一种商品上。
● 总和的或扩大的价值形式阶段。在这一阶段,一种商品的价值表现在与它相交换的一系列商品上。
● 一般价值形式阶段。在这一阶段,所有商品的价值都表现在作为一般等价物的商品上。
● 货币形式阶段。在这一阶段,所有商品的价值都表现在作为固定的一般等价物的金或银上。
货币的形态如图1-2所示。自然界中的任何物质(包括实体的和虚拟的),只要它具备了一定的属性,就都有成为货币的资质(注意,货币不一定是法币,法币的铸币权归主权国家所有,神圣不可侵犯)。例如黄金,早在19世纪之前的数千年历史中,人类总共生产的黄金不到1万吨(稀缺性);黄金的化学性质稳定,具有很强的抗腐蚀性(持久性);尽管储量不尽相同,但黄金普遍分布在世界各地,具备很好的群体认可性(共识性)。正是因为黄金很好地具备了稀缺性、持久性、共识性,因此古往今来人们自然而然地将黄金作为了一般等价物。
图1-2 货币的形态
(1)不可轻易获得:稀缺性。货币作为价值的载体,其本身应该具备稀缺性(不可轻易获得和替代)。例如木材、石头等唾手可及的物质,因为不具备稀缺性,就绝不可能成为货币。
(2)便于保存与流转:持久性。货币作为价值的载体,会流转在价值的所有者之间,因此其本身应该容易保存、不轻易流失,即应该具备持久性。例如水银,全世界的储量只有70万吨,但其容易挥发而不具备持久性(毒性暂不讨论),因此不可能成为货币。
(3)普遍的群体认可:共识性。翡翠、宝石等物质具备一定的稀缺性和持久性,但由于其分布范围较小,并不为世界各国都承认为价值的载体,因此它们也没有像黄金一样成为全球通用的硬通货。
比特币的工作原理如图1-3所示。
图1-3 比特币的工作原理
比特币核心程序的工作原理可以简单表述为如下几个步骤。
(1)交易消息广播:所有比特币的交易结果会作为消息广播给所有矿工用户,矿工用户将这些消息记录到自己的账本(这个记录的过程其实就是挖矿,而作为奖赏,矿工将获得一定数量的原始数字货币)。注意,普通用户维护自己的账本,矿工维护世界总账本。
(2)挖矿(记录和确认交易):注意,挖矿是比特币程序最核心、最重要的技术原理。
● 首先,参与维护总账本其实是通过货币发行而获得原始数字货币的方式(另一种获得的方式,就是通过实际交易转账),这就会吸引庞大的群体参与到挖矿工作中来。在这个阶段,挖矿的奖赏机制赋予了共识性。
● 其次,广大的矿工群体会竞争记账权(获得记账权者挖矿成功,获得算法奖赏。如前所述,这其实就是数字货币的发行过程),这个过程采用基于工作量证明的共识算法。在这个阶段,获得记账权需要投入大量的算力,这就赋予了稀缺性。
● 最后,获得记账权的矿工将自己收到的交易打包成数据区块,并广播给其他所有矿工,所有矿工对收到的交易数据进行验证确认后(矿工群体人人参与记账,赋予了持久性),将新的区块存入区块链数据库系统。在区块链数据库中,由于任何一个区块都由上一个区块计算出来,任何区块的篡改都会牵一发动全身。篡改数据的算力投入的成本远高于篡改数据的收益,使得矿工没有作弊的动机,再次加强了持久性。
通过上面的原理剖析可以看到,比特币通过算法保障被赋予了三个货币属性:①基于工作量证明的共识算法,其哈希难度赋予了稀缺性;②分布式存储与基于时序的密码记账赋予了持久性;③挖矿的奖赏机制赋予了共识性。
(1)新比特币的生成过程被称为挖矿,是因为它的产生过程类似于贵金属的挖矿过程。原始的比特币是通过挖矿发行的,这种奖励机制被设计为速度递减模式:矿工通过创造一个新区块得到的比特币数量大约每四年(准确说是每210 000个区块)减少一半。2009年1月每个区块奖励50个比特币,2012年11月减半为每个区块奖励25个比特币,2016年7月再次减半为每个新区块奖励12.5个比特币。基于这个奖励机制,比特币挖矿奖励以指数方式递减,直到2140年,届时所有的比特币(共20 999 999 980个)全部发行完毕。换句话说,2140年之后,不会再有新的比特币被发行。
(2)矿工们同时也会获取交易费。每笔交易都可能包含一笔交易费,交易费是每笔交易记录的输入和输出的差额。在挖矿过程中成功“挖出”新区块的矿工,可以从该区块包含的所有交易中得到“小费抽成”。目前,这笔费用占矿工收入的0.5%或更少,大部分收益仍来自挖矿所得的原始比特币奖励。然而随着挖矿奖励的递减,以及每个区块中包含的交易数量增加,交易费在矿工收益中所占的比重将会逐渐增加。显然,2140年之后,矿工的所有收益都只来自交易费。
所谓共识,是指大家的意见达成一致。其实在现实生活中,有很多需要达成共识的场景,比如开会讨论、投票选举、双方或多方签订合作协议等。在传统的软件结构中这几乎就不是问题,因为有一个中心服务器存在,也就是所谓的主库,其他的从库向主库看齐就行了。在实际生活中,很多事情人们也都是按照这种思路来做的,比如企业老板发布一个通知,员工照着做。但是区块链是一个分布式的对等网络结构,在这个结构中没有哪个节点是“老大”,一切都要商量着来。在区块链系统中,如何让每个节点通过一个规则将各自的数据保持一致是一个核心问题,这个问题的解决方案就是制定一套共识算法。
如上所述,区块链中的共识算法其实就是一个规则,让每个对等的分布式节点都按照这个规则去确认各自的数据,并最终保证所有节点上数据的一致性。暂且抛开共识算法的实现原理,先想一想生活中我们会如何解决这样一个问题:一群人开会,而这群人中没有领导或者老大,大家都各抒己见,那么最后如何产生决议呢?一般会在某一个时间段中选出记录员(例如每个人轮流做记录员),记录员负责记录和汇总大家讲话的内容,并让大家就每个意见进行投票表决,最终支持者最多的意见形成决议,这种思路其实就是一种共识思想。对这种思想而言,如果参与人数确定且数值较小,还好处理;如果人数众多或根本难以确定(动态变化),那就很难达成共识,因为工作效率太低了!这就需要通过一种机制筛选出最有代表性的人,具体到共识算法就是筛选出具有代表性的节点。
如何筛选呢?其实就是设置一组条件,就像筛选运动员一样,给一组指标让大家来完成,谁能更好地完成指标,谁就有机会被选上。在区块链系统中,存在多种这样的筛选方案,比如PoW(proof of work,工作量证明)、PoS(proof of stake,权益证明)、DPoS(delegate proof of stake,委托权益证明)、PBFT(practical byzantine fault tolerance,实用拜占庭容错)等,各种不同的算法,其本质上就是不同的记录员筛选规则。
(1)PoW挖矿算法及分析。PoW是指获得多少货币,取决于挖矿贡献的有效工作。也就是说,计算机性能越好,所分的矿就会越多,这就是根据工作证明来执行货币的分配。大部分的数值货币,比如比特币、莱特币等,都是采用基于PoW算法(算力越高、挖矿时间越长,获得的货币就越多)的共识。
比特币的挖矿算法其实就是通过一个哈希函数找到一个满足当前难度的nonce(包含在区块头里面)的值,哈希函数的输入数据的长度是任意的,将产生一个固定且绝不雷同的值,可将其视为输出的数字指纹。对于特定输入,哈希函数的结果每次都不一样,任何实现相同哈希函数的人都可以计算和验证。每个加密哈希函数的主要特征就是不同的输入几乎不可能出现相同的数字指纹。因此,相对于随机选择输入,有意地选择输入去生成一个想要的哈希值几乎是不可能的。
矿工用一些交易构建一个候选区块,接下来这个矿工会计算这个区块头的哈希值,判断其是否小于当前目标值,如果这个值小于目标值,矿工会修改这个nonce的值,然后再试一次。通常来说,一个矿工会做成千上万次哈希运算来得到一个合适的nonce的值,使得区块头的哈希值满足当前难度。这也是PoW算法的由来。
可见,PoW要求出示一定的证明来表明矿工付出的工作量,这个证明可以是直接记录,也可以用概率表示,其中对于由小概率事件累计的工作,出示结果等同于证明了工作量(因为不太可能直接得到小概率结果)。在比特币和其他类比特币的系统中,PoW是以合乎要求的哈希值作为工作结果。由于矿工要取得合法的计算结果需要一定量的计算,因此得到合法的计算结果就已经可以证明其完成了一定量的计算。
(2)PoS挖矿算法及分析。简单来说,PoS就是一个根据持有货币的量和时间,发放利息的制度。在PoS算法中,有一个名词叫币龄,每个币每天产生1币龄,比如持有100个币,总共持有了30天,那么此时币龄就为3000;这个时候,如果验证了一个PoS区块,币龄就会被清空为0;每被清空365币龄,将会从区块中获得0.05个币的利息(可理解为年利率5%)。那么在这个案例中,利息 = 3000 * 5% / 365个币 = 0.41个币。
以现有的比特币运行发展情况来看,比特币每年的挖矿产量都在不断减半,可以预计随着比特币产量不断降低,矿工人数也会越来越少,这样就会导致整个比特币网络的稳定性出现问题。PoS算法鼓励大家都去打开钱包客户端程序,因为只有这样才可以验证PoS区块并获得利息,同时也增加了网络的健壮性。还有一个担忧就是当矿工人数降低,比特币很可能会被一些高算力的人或团队进行51%攻击,如果采用PoS算法,即便有人拥有了全网51%的算力,也未必能够进行51%攻击,因为这还要求攻击者持有全球51%的货币量,而这是更加难以达到的门槛。比特币好像是一个永远不会膨胀的体系,因为它的货币总量看起来貌似是固定的,但实际上比特币是一个货币紧缩的体系,因为其总存在丢失(钱包密码丢失、货币私钥丢失等)的可能,而PoS采用类似年利率这样的方式,则可以在一定程度上缓解这个问题。
(3)DPoS挖矿算法及分析。DPoS是一种保障加密货币网络安全的算法。它在尝试解决比特币采用的传统工作量证明机制以及以太币2.0所采用的股份证明机制问题的同时,还能通过实施科技式的民主以抵消中心化所带来的负面效应。
通俗地讲,DPoS机制是让每个货币持有者对整个系统资源中想当代表的人进行投票,而获得最多票数的若干个代表进行交易打包计算。这可以理解为有若干个矿池,而矿池彼此的权利是完全相等的。那些握着选票的人可以随时通过投票更换这些代表(矿池),例如只要他们提供的算力不稳定(计算机宕机或者试图利用手中的权力作恶),他们将会立刻被愤怒的选民们踢出整个系统,而后备代表可以随时顶上去。从某种角度来看,DPoS有点像一些国家的议会制度,只不过不是每四年选举一次,而是时时刻刻都在选举过程中。
比特币网络中,数据以文件的形式被永久记录,称之为区块。一个区块是一些或所有最新比特币交易的记录集,且未被其他先前的区块记录。区块可以想象为一个城市记录者的记录本上的单独一页纸(对房地产产权的变更记录)或者股票交易所的总账本。在绝大多数情况下,新区块被加到记录最后,一旦写上,就再也不能改变或删除。每个区块记录了它被创建之前发生的所有事件。
每个区块都包括一个被称为“魔数”的常数0xD9B4BEF9、区块的大小、区块头、区块所包含的交易数量,以及一些或者所有近期的新交易。在每个区块中,对整个区块链起决定作用的是区块头,如表1-1所示。
表1-1 区块头示意图
这里的hashPrevBlock的数值就是区块连成区块链的关键字段,该字段使得各个区块之间可以连接起来,形成一个巨大的“链条”。每个区块都必须指向前一个区块,否则无法通过验证。这个区块链条一直追溯到源头,也就是指向创世区块。很显然,创世区块的hashPrevBlock的值为零或者为空。在区块头中,最关键的一个数据项是随机数Nonce。这串数字是一个答案,而这个答案对于每个区块是唯一的。
● 这个答案很难获得。
● 有效答案有多个,不过只需要找到一个答案就可以了。
● 其他区块对有效答案的验证很容易。
正是因为问题很难解答,没有固定的算法可以求出答案,所以唯一的做法就是不断尝试,找寻这个答案的做法就是“挖矿”,同时有很多人在“挖矿”,他们之间是相互竞争的关系。
区块内包含许多交易,它们通过Merkle根节点间接被哈希,因为所有交易不可能直接被哈希,哈希包含一个交易的区块所花的时间,和哈希包含1万个交易的区块所花的时间一样。
目标哈希值的压缩格式是一个特殊的浮点编码类型,首字节是指数(仅使用了5个最低位),后3个字节是尾数,它能表示256位的数值。一个区块头的SHA256值必定要小于或等于目标哈希值,该区块才能被网络所接受,目标哈希值越低,产生一个新区块的难度越大。
Merkle树是哈希的二叉树。在bitcoin中使用两次SHA256算法来生成Merkle树,如果叶子个数为奇数,则要重复计算最后一个叶子的两次SHA256值,以达到偶数叶子节点的要求。计算过程:首先按照区块中交易的两次SHA256值,然后按照哈希值大小排序,生成最底层。第二层的每个元素是相连续的两个哈希值的两次哈希值,重复这个过程,直到某一层只有一个哈希值,这就是Merkle根。例如,想象有3个交易a、b、c,生成过程如下:
d1 = dhash(a) d2 = dhash(b) d3 = dhash(c) d4 = dhash(c) # 只有3个元素,是奇数,因而把最后一个元素重算一次 d5 = dhash(d1 concat d2) d6 = dhash(d3 concat d4) d7 = dhash(d5 concat d6)
这里的d7就是以上3个交易的Merkle根。需要注意的是,Merkle树的哈希值是小头位序(即高位在后,一种数字在计算机中的表示形式)。对于某些实现和计算,在哈希计算前应该先按位反转,在哈希计算后再反转一次。
创世区块是指区块链的第一个区块,现在的比特币客户端版本把该区块号定为0,以前的版本把该区块号定为1。以下是创世区块的一种表示,它出现在以前的比特币代码的注释中,第一个代码段定义了创建该区块所需的所有变量,第二个代码段是标准的区块类格式,包含第一个代码段中缩短版本的数据。
GetHash()= 0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f hashMerkleRoot = 0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab212 7b7afdeda33b txNew.vin[0].scriptSig = 4866047994 0x736B6E616220726F662074756F6C6961 6220646E6 F63657320666F206B6E697262206E6F20726F6C6C65636E61684320393030322F6E614A2 F33302073656D695420656854 txNew.vout[0].nValue = 5000000000 txNew.vout[0].scriptPubKey = 0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6 DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704 OP_CHECKSIG block.nVersion = 1 block.nTime = 1231006505 block.nBits = 0x1d00ffff block.nNonce = 2083236893 CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot =4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1) CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0) CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65 732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66 207365636f6e64206261696c6f757420666f722062616e6b73) CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) vMerkleTree: 4a5e1e
区块链是所有比特币节点共享的交易数据库,这些节点基于比特币协议参与到比特币网络中。区块链包含每个曾在比特币系统执行过的交易,根据这个信息,人们可以找到任何时候任一个地址中的币的数量。
每个区块包含前一个区块的哈希值,这就使得从创世区块到当前区块形成了一条区块链,每个区块必定按时间顺序跟随在前一个区块之后,区块链结构如图1-4所示。如果不知道前一个区块的哈希值就没法生成当前区块,要改变一个已经在区块链中存在一段时间的区块,从计算上来说是不可行的。因为如果它被改变,它之后的每个区块必须随之改变。这些特性使得双花比特币非常困难,区块链是比特币的最大创新。
如果一个区块是最长区块链的最后一个区块,诚实的矿工只会在这个区块的基础上生成后续区块(创建新区块时通过引用该区块来实现)。“长度”是被计算成区块链的所有联合难度,而不是区块数目,尽管这个区别仅仅在防御几个潜在攻击时有用。如果一个区块链中的所有区块和交易有效,则该区块链有效,并且要以创世区块开头。
对于区块链中的任何区块来说,只有一条通向创世区块的路径。然而,从创世区块出发,却可能有分叉。当两个区块产生的时间仅相差几秒时,可能会产生包含一个区块的分叉。当出现以上现象时,矿工节点会根据收到区块的时间,在先收到的区块基础上继续挖矿。哪个区块的后续区块先出现,这个区块就被包括进主链,因为这条块链更长。在修正需要向后兼容的程序bug后,出现过更严重的分叉。
图1-4 区块链结构示意图
短块链(或有效块链)中的区块没有作用,当比特币客户端转向另一个长块链时,短块链中所有有效的交易将被重新加入交易队列池中,将被包括在另一个块中。短块链中的区块收益不会在长块链中出现,因而这些收益实际上是丢失了,这就是比特币网络强化的100个区块成熟时间的存在原因。
短块链中的区块经常被称为“孤立”区块,这是因为长块链中的生产交易没有父区块,因而这些生产交易在交易列表的RPC调用中表现为孤立。几个矿池误解了这些信息并且把这些区块叫作“孤儿”,事实上这些区块都有父区块,可能还有子区块。
如前所述,比特币产品诞生后,人们基于比特币的数据结构(链式区块)创造了“区块链”这个名词。如今,区块链特指一种综合了分布式数据存储、点对点传输、加密数据、共识计算等技术,具有去中心化、共识自治、不可篡改等特征的计算机网络。在该网络中,信息一旦经过验证并被添加到区块链网络中,即实现了数据的分布式存储和主权保障,数据不仅无法被私自篡改,还可实现数据的主权归属和追溯功能。
从宏观上来看,区块链技术可以构建一种新型网络,网络中的每个节点都能够在去中心化的环境中实现自治的数据信任。简单来说,区块链是一种达成信任的工具。
通俗地讲,区块链通过算法实现了区块链网络中节点与节点之间的秩序,以及流转与传播在区块链网络中数据的归属,基于这种实现了朴素约定的网络秩序和数据契约的设计,使得区块链被认为是一种社会可编程技术框架,并可为社会的各个领域提供新的治理模式(跨域组织信任与协同),如图1-5所示。
图1-5 区块链技术是一种面向人工社会编程的新技术与新的社会治理模式