Skip to content

第五章:把账本变成分布式

ch05

区块链技术的采用,为Q公司塑造了极好的口碑;如今,Q公司已成为技术创新的典范,更是传统游戏与最新技术融合的领头羊。但是与此同时,也把Q公司推到了风口浪尖上。一小部分质疑的声音始终存在,最主要的担忧就是怕Q公司会滥发Q币、审查交易,以及操纵交易内存池。

实际上Q公司早已经有了对策。在一段时间紧锣密鼓的开发之后,Q公司的技术工程师们将给用户带来一次史诗级的升级,彻底解决以上所有问题。这次升级也会让Q公司的服务架构再一次发生质的变化。到底是什么样的变化呢?不妨跟着本章一探究竟!

去中心化

我先直接揭晓答案,Q公司的这次升级可以用一个词来概括,那就是:去中心化。在此之前,不管是从密码模式切换到密钥模式,还是从账户模型切换到UTXO模型,都还没有脱离中心化的架构。但是为了彻底取得用户的信任,现在必须放弃传统的中心化架构了。说起来也简单,把之前的中心化架构复制N份,相互连接起来,我们就得到了去中心化架构,如下图所示(N=4):

nodes

上图右侧的四组服务器,两两之间相互联系,看起来就像是一张网。这种没有中央服务器的架构叫做点对点(Peer-to-Peer,简称P2P)网络,其中每一组服务器都叫做一个节点(Node)。注意我们并不是只把数据分散到N个服务上去,而是把服务和数据都复制了N份。这两个都是分布式架构里常用的扩容模式,前者称为分片(Sharding),后者称为复制(Replication)。数据分片和复制的区别如下图所示:

scale

由于数据和服务都复制了N份,优点和问题都是很明显的。先说优点。第一,单点故障的问题解决了。以上图为例,如果一组服务宕机了,其他三组服务很可能还是好的,所以整体服务还是正常的。第二,可以服务更多的用户了。我们可以近似地认为,服务复制了N份,可以同时处理的用户数量也扩大了N倍。这就好比某家餐厅可以同时容纳100人就餐,当它开成6家连锁店之后,理论上可以一起容纳600人同时就餐才对。

再深入看两个关键问题。其一,大量相互关联的服务间,数据一致性该如何保障?举个例子,可能某用户在服务1查询余额是1万,在服务2查询却显示2万,这种数据矛盾会让用户无所适从,这个问题非常难解。其二,要是所有服务依旧由Q公司掌控运营,那所谓的“去中心化”就只是表面形式,本质上还是中心化架构,相当于“披着羊皮的狼”。

上面第二个问题是相对好解决的,但是需要极大的决心。不过Q公司做到了:它把服务相关的源代码全部都公开了。任何人都可以运行一组服务,作为节点连接到整个服务网络中。不仅如此,现在整个社区可以一起改进这些代码。但是第一个问题,这些服务如何同步数据,有点难。我们把它分解为两个问题,各个击破,具体请看接下来的两个小节。

如果不开放源代码,Q链将归Q公司私有,只有Q公司能运行节点,这种区块链被称为私有链(Private Chain)。而开放源代码后,任何人都可参与其中、无准入门槛,这类区块链则是公有链(Public Chain)。此外还有一种中间形态:由几家公司或机构联合运行一条链,参与者需通过准入机制才能加入,这种区块链被称为联盟链(Consortium Chain)。

这里顺便说明一下,现在Q链已经是一个由众多节点构成的点对点分布式网络。与传统中心化服务不同,这类分布式网络的调试难度极高。为保障网络稳定运行与高效迭代,Q链被分为主网(Mainnet)和测试网(Testnet)两类。新功能或更新通常先在测试网上进行开发、测试与验证,待运行稳定后,再正式部署到主网。测试网的代币通常不具备价值,可以通过水龙头(Faucet)等服务自由领取。

数据传播

这一节我们先来讨论怎么把数据从一个节点扩散到整个网络上,暂时不考虑各个节点保存的数据是否一致。这个问题又可以分成两个更小的问题。第一,节点之间需要交换什么样的信息。第二,节点怎么把这些信息发送给其他所有节点。

第一个问题,节点之间需要交换什么样的信息呢?答案是交易和区块数据。为了便于讨论,我们假设目前Q公司的服务器网络里只有两个节点,服务器1和服务器2,如下图所示:

sync

上图展示了一个简化后的假想流程。假设某用户连接的是服务器1,他想发起一笔交易,那么:一,该用户先通过客户端生成一笔交易,然后发给服务器1。交易被服务器1接收后,会先进入它的交易内存池,等候处理。二,服务器1在收到交易之后,也会立即把它发给服务器2。毕竟产生一个块是需要时间的,也许服务器2那边的压力更小一些,这样用户的交易就能更快得到确认。三,服务器2的压力果然是小一些(可能性能也更好一些),它很快就打包出一个区块,而且用户的交易也在里面。四,服务器2把这个区块追加到整个区块链里,落到磁盘上。五,与此同时,服务器2也把这个新的区块告诉了服务器1。最后,服务器1接收到最新的区块,得知消息已被处理,于是从自己的内存池里把该消息删掉。

以上是一个极度简化后的流程,不过我们理解到这里就可以了。再来看第二个问题,节点之间怎么交换消息。最简单的办法就是广播。比如说某个节点收到一笔交易后,直接把它发送给其他所有节点。但这个做法效率也太低了。如果是一个庞大的网络(例如有几万个节点),那么某个节点可能要花很久才能把消息广播给其他所有节点。

实际上,节点之间会通过更复杂的协议来交换信息,可以快速把数据传播到整个网络。比如Q公司采用的是一个叫做“八卦”(Gossip)的协议。你可以想象一下,平时一些小道消息是怎么在人群之间传播的。采用Gossip协议的节点,深得人类的“八卦传播精髓”。这个协议的细节这里就不展开讨论了,好奇心强的读者可以自己深入学习。

共识机制

数据传播的问题解决了,那么怎么保证节点之间的数据是一致的呢?前面说过,这个问题是非常难解的。但是天才的中本聪把这个难题给破解了!他的解法有两个核心要素。第一,我们在前一章讨论过的工作量证明,也就是PoW。第二,最长链共识算法,马上会介绍。

我们先来复习一下工作量证明。这个机制起初是为了防止Q公司随意删除区块里的交易而引入的,但它也有一个很明显的副作用,导致交易从实时处理变成了延迟确认。这个延迟时间主要是用来计算满足条件(前面必须有一定数量的0)的区块哈希的。恰恰是这个延迟时间,给了交易和区块在各个节点之间传播的机会。

如果一个交易已经被某个节点打包成块,这个块也传播给其他节点了,那么其他节点收到这个块之后,会做些什么呢?当某节点接收到这个新的区块后,它首先要校验这个区块里面的所有交易,如果其中任意一笔交易不合法(比如说同样的输出被使用了两次),那么它就会直接丢掉这个区块。此外,它还要对比这个区块的“前一个区块哈希值”跟自己本地存储的区块链的最高块的哈希是否一致,如果不一致也丢掉这个区块。如果这两个检查都没问题,那么这就是一个合法的区块,节点会把它追加到自己的本地区块链上,完成同步。假设新区块链的高度是2026,这个过程如下图所示:

sync2

但是当网络中有很多节点的时候,有没有可能有两个节点在差不多的时间同时产生了不同的新块?当然有可能,而且节点越多,可能性越大。我们接着上面的例子,比如说某节点接收到了来自不同节点的两个合法但内容不同(比如包含的交易不一样)的新区块,高度都是2026,它该听谁的?答案是,“让子弹飞一会儿”。这个服务器会暂时把这两个新区块都接纳,然后像有两条链一样继续工作,直到一段时间后,其中一条链比另外一条更长,然后丢掉较短的那条链,如下图所示:

fork

上图看起来就像,区块链在#2025之后裂开了:高度#2026上出现了两个不同版本的区块(#2026a#2026b),进而形成两条临时链,这种情况就叫做分叉(Fork)问题。解决分叉问题的核心办法是最长链原则 —— 这里的“最长”实际指“累计工作量最大”,节点之间会达成一致:优先保留累计工作量最大的链,其他分叉则全部丢弃。这种基于“工作量证明 + 最长链”的协议称为共识协议,它由中本聪提出。为致敬他,我们将这套共识机制命名为“中本聪共识”(Nakamoto Consensus)。

上面这种分叉是临时性的,最终总会通过最长链原则自动消解,不会影响Q链的底层规则,我们把它叫做临时分叉。而节点丢掉较短的那条链、改用较长的那条链的过程,叫做链重组(Chain Reorganization,简称Reorg)。还记得上一章讲的双花攻击吗?它钻的正是链重组的空子:付款交易所在的区块被重组掉了,那笔Q币也就又能拿去买别的东西了。这也是为什么大额交易一定要多等几个确认。

还有另外一类分叉,和临时分叉完全不是一回事,它源自规则本身的变化。由于Q链的代码是开源的,任何人都可以获取并修改其核心参数,比如调整区块大小、改变出块奖励或修改代币发行规则等。如果新规则比老规则更严格,那么按新规则产生的区块,在还没升级的老节点看来也是合法的,两拨节点还能待在同一条链上。这种向后兼容的规则升级,叫做软分叉(Soft Fork)。反过来,如果新规则和老规则互不兼容,老节点会拒绝新区块,新节点也不认老区块,两拨节点最终会各走各的,彻底分裂成两条独立的链。这种不兼容的规则升级,就叫做硬分叉(Hard Fork)。

数字淘金

等等,看起来好像哪里不太对劲。我们说Q公司开放了服务器的源代码,大家都可以来当节点,这没问题。但是运行节点也是要花钱的,更何况每出一个块还要做大量的哈希运算,这可费不少电。这种出力不讨好的事情,谁会去干?

这个问题Q公司也想到了。还记得区块链在启动的时候,有一笔Q公司的铸币交易吗?很多用户担心Q公司以后会随意铸币,导致游戏内的通货膨胀。为了奖励节点,也为彻底取得用户的信任,Q公司把这个规则给改了。新的规则是这样的:每一个块的第一笔交易可以凭空铸造50枚Q币。也就是说,我们允许每个区块的第一笔交易没有输入,有且只有一个输出,产生50枚Q币。我们把这样的铸币交易叫做Coinbase交易,如下图所示:

coinbase

从现在开始,Q币不再是Q公司发行了,而是靠整个网络共同产生。Q币也不再由Q公司定价,而是由供需情况决定。Q公司也关闭了Q币的充值与提现业务,用户需要Q币的时候只能去第三方市场购买。这个巨变在游戏圈带来了轰动,不仅Q公司的游戏玩家数量暴增,还有大量的个人爱好者和公司开始运行节点,加入Q公司的服务网络,争相计算哈希,争抢出块权。

这个热潮简直就是19世纪美国旧金山淘金热的电子版。只不过当时是矿工付出自己的努力,淘到金子。而现在是节点付出一定的工作量(计算区块哈希),获得一定报酬(Q币)。由于这个原因,大家也把节点打包区块计算哈希的过程叫做挖矿(Mining),把这些节点叫做矿工(Miner),把计算区块哈希的硬件叫做矿机(Mining Machine)。

总供应量

和之前一样,解决旧问题就会带来新麻烦。现在摆在眼前的至少有两个问题。第一,原来Q币是Q公司承诺一次性铸造的,只要Q公司不乱来(虽然有些人不相信),Q币的总量就不会变。但是现在每个区块都会铸造一定数量的Q币,也就是说Q币是无限增发的。第二,原来的挖矿难度是固定的,Q公司也不会随意去调整,所以出块时间是稳定的。但现在大量矿工涌入之后,开始研究新型硬件,导致出块速度越来越快,威胁到了整个网络的安全。这一小节我们来看第一个问题是怎么解决的,下一个小节讨论第二个问题。

前面说每个区块可以增发50枚Q币。为了避免Q币总量无限增加,Q公司引入了减半机制,同时也把出块时间从原来的十秒钟放慢到了十分钟。为什么要放慢?因为现在出块的不再只有Q公司一家,而是遍布各地的众多节点,得给新区块留出足够的时间传播到全网,否则大家各出各的块,分叉会多到无法收拾。于是Q公司期望大约每十分钟出一个区块,然后规定每21万个块(大约四年),奖励减半。

你还记得吗?计算机是无法精确表示小数的,而且用小数计算也会产生误差。虽然说是游戏币,但是Q公司还是采用了传统银行的做法,使用整数来表示Q币的数量,精度是8。也就是说,当我们说某人有50枚Q币的时候,他实际上有50亿(5,000,000,000)个最小单位的Q币。作为纪念,Q公司的游戏玩家们把这个最小单位叫做“聪”(简称Sat)。

由于Q币的数量是用整数来表示的,减半要用整除法(舍弃余数),所以减半过程不可能无限进行下去。简单计算一下就可以知道,经过33次减半(也就是大约132年)以后,区块奖励就会变成零,Q币也就被全部开采完毕了。由此可以算出,Q币总发行量的上限接近2100万枚,下面是公式:

i=133210000×502i1

这是本书为数不多的数学公式之一。如果你连这个公式也不想看,我可以告诉你,Q币的总供应量在刚开始是增长很快的。大约20年以后,增长就相当缓慢了。我们假设新版Q币是在2009年开始发行的,它的总供应量的增长速度如下图所示:

supply

上面这张图的呈现效果还不够直观,尤其是从2040年左右开始,曲线几乎接近直线了,难以清晰观察变化。下面的表格汇总了Q币前五次减半的数据,能让我们更清晰地看到Q币总发行量的增长速度变化:

减半次数减半高度减半前区块奖励减半后区块奖励减半时开采量减半时开采率
第1次(2012)210,00050.000025.000010,500,00050.000%
第2次(2016)420,00025.000012.500015,750,00075.000%
第3次(2020)630,00012.50006.250018,375,00087.500%
第4次(2024)840,0006.25003.125019,687,50093.750%
第5次(2028)1,050,0003.12501.562520,343,75096.875%

很显然,在Q币全部开采完毕之前,每个区块都会产出新的Q币,这使得其发行量持续增加,因此Q币在此阶段属于通胀模型。但按照当前的开采规则,等到一百多年后Q币全部开采完成,其总量就会固定不再增长。而到了那个时候,一方面会有大量用户因丢失私钥导致持有的Q币永久无法流通,另一方面部分项目会主动将Q币转入无法转出的黑洞地址,这两类情况都会让市场中的可用Q币数量逐渐减少,最终使Q币从通胀模型过渡到通缩模型。

无限增发问题算是解决了,但按下葫芦浮起瓢。按照现在的设计,若干年后,随着奖励减半,矿工们挖矿能够得到的Q币也许就非常少了。那时候咋办,谁还愿意来提供服务?而眼前还有一个问题:如果黑客发送大量交易试图让服务器瘫痪,该怎么办?这种捣乱方式,我们马上会提到,叫做“粉尘攻击”(Dust Attack)。

这些问题Q公司早已考虑到,因此制定了规则:每次转账时,输出的Q币总和要比输入的总和略少一点,差额部分会作为手续费分配给矿工,我们把这个费用叫做矿工费(Miner Fee)。这样一来,即便未来出块奖励大幅减少,矿工的主要收入也能逐步过渡到交易手续费,从而继续维持网络服务。这个差额也有一个最低的限度,以此来抵抗粉尘攻击。

这也恰好解决了另外一个遗留问题:节点内存池里的交易按什么来排序。现在这个问题就简单了,矿工追求的自然是利益最大化,谁给的手续费高,他们就先处理谁的交易。交易手续费的概念如下图所示:

fee

还剩下一个问题没解决,怎么让出块时间稳定在10分钟左右。我们马上来讨论。

哈希竞赛

我们想让出块时间稳定在10分钟左右,可是随着Q币的持续火爆,越来越多的人加入到了挖矿的队伍中。我们知道,哈希函数的输出像是随机数,要想得到前缀带有N个0的哈希值,只能不停地尝试。换句话说,这是一个概率问题。我们要求的零越多,计算同样的次数能算出来满足要求的哈希值的概率就越低。要想提高概率只有两条路可走。第一,让矿机变得越来越强大,同样的时间可以计算更多次的哈希值。第二,买更多的矿机,同一时间让很多机器并行计算。

很不幸,以上两点注定都要发生。我们把单位时间内,某台矿机能够计算哈希值的次数叫做这台机器的哈希算力(Hashrate),简称算力。如果全网算力一直飙升,那么出块时间就会越来越短,整个Q币体系也会崩塌。为了预防这件事情的发生,Q公司规定,Q币的挖矿难度会动态调整。如果一段时间内全网算力持续飙升导致平均的出块时间变低,网络就会提高出块难度(要求前缀有更多的0),否则就会降低出块难度(要求前缀有更少的0)。调整出块难度可以间接调整出块时间,这样就可以让总的平均出块时间基本稳定。

然而,也许Q公司也没有想到市场会如此的狂热。刚开始,Q币爱好者们是使用自己的个人电脑,通过CPU(中央处理器)来挖矿。很快这个方式就行不通了,因为有人开始使用他们打游戏的高配电脑,通过GPU(图形处理器)来挖矿。然后没过多久就有专业人士开始使用FPGA(现场可编程门阵列)编程,甚至设计专门的ASIC(专用集成电路)芯片来挖矿。后来,市面上出现了专业的硬件公司,专门生产Q币矿机。此时个人再想通过普通电脑挖到Q币已经是不可能的事情了。

你以为故事到这里就结束了?并没有。因为大量的矿机进入市场,自己买台矿机单打独斗(俗称SOLO)挖矿也几乎挖不到Q币了。市面上出现了专业的挖矿服务,它们把大量的矿机联合起来,共同挖矿,共享Q币奖励。这种服务通常被称为矿池(Mining Pool)。整个Q币矿机的进化简史如下图所示:

miner

前面讲过,Q币的共识算法基于工作量证明和最长链原则。如果某个机构(比如某个大型矿池)垄断了算力,是不是中心化的一些问题又回来了?的确是这样。实际上,这个机构只要拥有超过全网一半的算力,就可以干很多坏事,例如回滚一个区块(以及里面的交易)。这种攻击行为叫做51%算力攻击。这个问题是无解的,我们只能寄希望于Q币算力尽可能地分散,不要过于集中。

顺带提一句,在写作本书时,“Q链”的全网哈希算力达到了惊人的1.2 ZH/s(Zetta-Hashes per Second),即每秒钟大约可以进行 1.2×1021 次哈希运算;而其区块的哈希值(表示成二进制共256位),前面大概有80个零。

没有银弹

到这里,Q链已完成去中心化转型,成为一条无准入许可的公有链。但没有银弹(这个词源于西方传说,指能一次性解决复杂难题的完美方案),区块链技术也无法解决所有问题。继中本聪之后的区块链领域领军人物维塔利克・布塔林(Vitalik Buterin)提出了著名的“不可能三角”理论。他明确指出,区块链系统无法同时满足可扩展性(Scalability)、安全性(Security)与去中心化(Decentralization)这三大核心特性,三者之间存在天然的权衡关系,如下图所示:

tri

这里的可扩展性,指的是区块链处理交易的能力,具体包括高交易吞吐量和低延迟,直接关乎用户体验;安全性,指的是网络抵抗恶意攻击的能力,比如防范双花攻击、51%算力攻击等风险,确保交易的不可篡改性;去中心化,则是指网络呈现无中心化的分布式结构,所有节点地位平等,需共同参与网络决策与维护。

传统的中心化服务会完全牺牲去中心化特性,且安全性较弱(易遭受攻击),以此换取极高的性能,例如一些大型应用动辄能实现每秒数万笔交易的处理能力。而现在的Q链已实现完全去中心化,安全性较强(网络难以被篡改和攻击),但相应地,其TPS相对较低(每秒仅能处理几十笔交易),且交易确认时间也更长(大额交易往往需要等待几十分钟)。

如何在保证去中心化和安全性的同时尽可能提高性能,目前已有一些缓解办法,例如侧链(Sidechain)、状态通道(最著名的就是闪电网络,即Lightning Network)、Plasma、Rollups(包括Optimistic Rollups,简称OP Rollups,以及Zero Knowledge Rollups,简称ZK Rollups)等。这些技术均不改变区块链主网的底层架构与核心规则,而是在主网之外搭建独立的处理层,承担大部分交易计算与数据处理工作,仅将关键结果同步回主网,因此被称为二层网络(Layer Two,简称L2)。由于理解这些技术需要较强的技术背景,这里我们就不展开讨论了。

本章小结

在这一章,Q公司把服务架构改成了去中心化,让整个网络一起管理一个分布式账本,共同铸币。这就彻底杜绝了滥发Q币、审查交易等隐患,使得Q公司得到了玩家空前的信任。而随着减半机制以及动态难度调整等策略的引入,Q币也完成了它从不值一提的游戏虚拟币到“数字黄金”的蜕变。不仅如此,由于Q币矿机的良性发展,整个芯片行业也有了长足的进步。

我们现实生活中的经济是有周期的,只是捉摸不定。而四年一次的挖矿奖励减半机制直接导致了一个数字版的经济周期,Q币的价格跟着这个周期起起伏伏。这其中充满了机遇和挑战,无数人为之着迷。然而问题也还是有的,质疑声永远都不会停止。这里我们只举一个例子。

我们知道,Q币的挖矿就是计算哈希值,这个过程需要消耗大量的计算机算力,也就是电力。有些人认为这合情合理,是电能到Q币的转化。也有人认为这会抢占社会资源,浪费大量能源,甚至污染环境等等。虽然大家有不同意见,但这个问题还是引起了Q币社区足够的重视。人们开始讨论PoW的替代方案,例如权益证明(Proof of Stake,简称PoS)等。不过这些都不是本书讨论的重点,因此这里一笔带过,感兴趣的读者可以通过搜索引擎或者AI机器人继续深入了解。

本书以 CC0 1.0 协议发布,可自由使用