4.3 长枝生存
区块链是公共账本的展开形式,直观上看,它有两种表示:(1)竖立模型,以创世纪块为起点朝上生长,类似建楼房,故有“高度”的概念;(2)横向模型,以创世纪块为起点朝右生长。
本节我们讨论区块链是如何生长的。
4.3.1 挖矿
在第1章中我们提到,记账员都在记账并维护自己的账页,对于当前账页,谁先提交正确的账页,谁就胜出,即绝大多数记账员承认他的账页并以他的账页为基础,开展下一页的记账工作,而由于每个账页中含有一笔支付给该账页记账员的奖励交易,故他获得了奖金。
由于他的账页中含有谜题的解,故除了第1章所要求的账务正确、含前一页的缩微等验证,还应验证谜题的解是否正确,好在谜题的验证非常容易。
因此,要想获得奖金,必须提交谜题的正确解,而解谜题是个拼算力的苦力活儿,类似于挖矿,故记账员摇身一变成了“矿工”,而他的本职工作记账倒是花费很少的时间与精力了。账页中那笔奖励交易可以视为挖矿收入,故可称为“挖矿”交易。
这样,第1章的公共账本,现在每页多了一个“谜题的解”,它体现该页的“挖矿”工作量。每一编号的账页,按“提交优先”的原则选择一个,即大家只承认最先提交者的工作,只有他的账页作为共享账本的页面,并且他因此获得了“挖矿”收入。
4.3.2 软分叉
在上述机制下,每个账页含有前一个账页的“缩微”,把这种关联关系视为“链接”,就形成了链,即公共账本。如果把这种关系视为“父子”关系,则形成一个家族链,只是每代都是“独子”。哈哈,如果不是独子,我们就取“长子”,类似于在古代皇帝选皇太子。
我们再看看在非常大的广域网络环境中,上述“提交优先”的原则碰到的问题:矿工竞争挖矿,完成当前页后,迅速提交各自完成的账页,由于网络传输的影响,你看到的“最先提交”和他看到的“最先提交”很可能不同。你以自己看到的“最先提交”为基础进行挖矿,他也以自己看到的“最先提交”为基础进行挖矿,这样就产生了分叉。
例如,你可能在片刻的时间内,同时收到了A、B、C广播的“当前块”,它们都是正确的区块,谜题的解也正确。A一定在产生A块的那个矿工的链上,B一定在产生B块的那个矿工的链上,C一定在产生C块的那个矿工的链上,将这三个矿工的链都拿过来,将三条链中重复的部分重叠在一起,因为三条链都是从同一个创世纪区块开始的,即使再短的链,至少创世纪区块是一致的,所以会出现分叉。但这种分叉是“暂时”的,因此称为“软分叉”,就像你看到的新生的树枝,如图4.1所示。
图4.1 软分叉
4.3.3 剪枝成干
假定你也是矿工,你在上述“软分叉”的情形下,选取三条链中的哪一条?即选择A、B、C中的哪一块作为自己生产新区块的前置区块?
假定你收到的次序为“B、C、A”,此时,你“认可”A、B、C中的哪一个?程序给出了一个“认可”的规则,当然是在区块正确的前提下,包含不合格交易的区块将被抛弃:第一优先权(长度优先),也就是说,能使区块链更长的区块具有优先权。又因区块链的长度也被称为高度,故也称为高度优先。显然,图4.1中的B不满足此条件。
如图4.2所示,C与A处的高度是一样的,假定你先收到C,故你选定C为“当前块”,你将以它为基础去创造下一个区块(此时你心目中当前“认可”的区块链为C所在的链)。你选择C,可能别人选择A,这样就分叉了,两叉均向前成长,如图4.3所示,一旦后续你先收到A的后代E,再收到C的后代F,E与F处于同一高度,在收到E还未收到F时,你按长度优先原则马上选择了E。由于E的父亲为A,这样,就表示你调整了分支,从C所在的分支调整到了A所在的分支,也就是说,你原来投C的票改为投A了。
图4.2 选择分支
图4.3 调整分支
每个矿工都有一条心目中“当前认可”的区块链,之所以说“当前”是因为由于长度优先原则可能会使得你后续调整,如C分支没竞争过A分支,则你会抛弃C所在的链转而选择A所在的链,因为你希望基于正确的链去创造新的区块以获得奖金。这种情况称C被剪枝。
假定矿工都“守规矩”,矿工各自遵循上述规则,从“创世纪”区块出发,逐步“PK”并“成长”出一条区块链。这相当于矿工对区块进行投票,而矿工对区块链的每一高度都只有一票,如上述你可以先投区块C一票,再撤销这一票,改投区块A。
假定我们能将所有矿工的链都拿过来,将相同的区块叠加,由于所有矿工都以创世纪区块为起点,所以叠加结果如图4.4所示。在这里以区块颜色的深度表示叠加的数量,颜色越深,叠加的区块越多,即以投票的多少表示达成共识的程度,该区块链成为共识链。
图4.4 共识链
请比较图4.4和图1.7,它们都是修树成链,一个是统计意义下的链(区块链),一个是绝对确定意义下的链(链堂)。既然是统计意义下的链,那么,要获得正确的区块就不能只从一个网络节点取数据,而应该从多个节点取数据,再以“计票”统计来确定(横向验证)。好在这种功能在P2P网络中很容易实现。
其实,我们只要对点对点P2P网络进行统计抽样,仍然能得到上述共识链。从区块链不断向右生长的角度看,最右端新区块还没有完全达到共识,左端越老的区块共识度越高,而一定时间前的区块是完全共识的,即在各矿工那里的老账页副本完全一样,这就是区块链作为分布式数据库而言的“最终一致性”,但实际上是滞后一致性。
在自然界,我们也能看到如水杉、白杨树等向上生长的过程中,顶端是分叉的,虽有许多小枝,但树干是唯一的,这实际上也是竞争形成的:一方面顶端各小枝向上争夺阳光;另一方面底下向上输送物质,物质与阳光合成养分,采取“高度”优先的原则,使得顶端“高度”占优的枝茁壮成长,它们在生长过程中又分出小枝,而其他枝则不再生长,甚至脱落,即剪枝。
在“长度优先”的基础上,还可以增加其他次级优先权,如下所示。
第二优先权(交易数量):包含较多交易的区块优先;
第三优先权(区块的时间):区块中时间戳越早,代表产生的区块越早,则越优先,但时间戳是矿工填入的,需要存疑,所以,只有时间戳合乎一定要求的区块才是合格的。
4.3.4 不被剪掉
如图4.5所示,站在区块链上的某区块处(区块链以竖立模型理解)。
(1)向下看(向左看),从创世纪块开始到这个区块为止,区块的个数为该区块的“高度”。
(2)向上看(向右看),从该区块到该分支的末端(最右端)的区块个数为该区块的“深度”。区块深度也称为该区块被确认的次数。
图4.5 区块的“高度”与“深度”
上述剪枝过程使得区块链与树类似,它们的底部(左侧)是固化的,随着时间的推移,固化段越来越长,它在向上(向右)生长的过程中,向上(向右)逐步变成“树干”,即区块链从创世纪块开始,向上(向右)逐步成为永久的主干,即公共账本,只是在顶端(或最右)枝繁叶茂。
从上述剪枝过程分析,我们知道越在顶端的区块越容易被剪掉,即区块被剪掉的可能性与它与顶端的距离成“反比”关系,因此,区块深度可以用来度量区块不被剪掉的程度。
分支不同而高度相同的两个区块A与B,A的深度为5,B的深度为3,显然,A所在的分支比B所在的分支更长,故A被剪掉的可能性低于B,即区块被剪掉的概率与区块深度成反比:区块被确认的次数越多,意味着它所在的分支链越长,该区块被剪掉的可能性越低。
这个原理也可以看作通过算力保护该区块不被剪掉,深度越深,保护得越牢。区块深度代表区块被算力保护的程度。
我们再看看通过算力来防篡改:对区块的恶意修改可以从修改的节点开始,形成一个新的分支,相对于原分支而言,由于作恶者算力不足,新分支的长度没有追赶上原分友,因而在“长度优先”的比较中,在统计意义上,新分支将被剪掉,原分支将被保留,从而达到防篡改的目的。
防剪掉强于防篡改,因为:①篡改一定会产生新的分支,新分支在竞争中一定会被剪掉,而保留未被篡改的;②发生软分叉时的两个分支,链上数据可能都完全正确,在竞争中短枝会被剪掉,长枝会被保留。
通过上述方法在所有矿工中达成共识,专业术语叫作区块“最终一致性”,即滞后一致性:
(1)某一高度的区块经一定的确认次数,矿工们达成了一致;
(2)达到一定深度的区块已在“主干”上,不可能被剪掉。
“最终”实际上是指“滞后”,是用确认次数(即深度)来表示的。比特币区块链的“最终”为至少“6次确认”,即如果某区块被确认了6次以上,到达了“最终”时刻,则可以认为矿工们对该区块达成了共识,这时,该区块中的交易就是算数的。而对于新产生的区块,还没有达到6次确认,其区块中的交易是否算数还需要等待。
“在所有矿工中达成共识”中的“所有”不是绝对的,而是统计学意义上的共识,即指“任意”抽取一定数量的矿工,“都能”实现“多数”矿工是一致的。