5.1 社区假设
以工作量证明为基础的公有链是中本聪的伟大发明,它有效解决了公众如何达成共识的问题。
程序员通过程序对社区“立法”,将程序发布到网络上,从而发起公有链社区建设。当社区达到一定规模后,它就可以自动运转,并脱离程序员的控制,实现“去中心化”。社区的成员称为“矿工”,他们共同维护着公共账本。公共账本具有防篡改的特征,由此作为信任基础,向公众(包括非社区成员)提供可信服务,如转账交易。
区块链核心程序员发布创世纪区块和核心程序,进行创块、验证和挖矿,启动区块链生长;公众通过下载创世纪区块和核心程序并运行,成为社区的记账员。停机或下网则表示退出社区。创世纪区块可以被认为是安全的“根”这个一致性的起点,而核心程序则可以被认为是社区的“法”。
公有链之所以为“公”,是因为它在互联网上组建社区,在全社区上运行,因此,它的第一个前提条件为:形成有足够社员的社区,即应有足够的记账员矿工,以便查询时能得到统计意义上的多数。可以把这个社区视为一个群,即它有一些群规约束,如承认该链的章程:创世纪区块和核心程序。从网络的角度看,参与“挖矿”的网络节点就是群友,这个群没有管理员,群友既不能拉人入群,也不能被别人踢出群,即网络节点随时可加入和退出社区,但这个动态的网络节点组成的社区应有足够多的节点,以保证它能向公众提供可靠的服务。
记账员中可能有作恶者或不作为者,但为了维护“投票”的正确性,公有链中守规矩的记账员的有效算力应大于50%,即常说的占51%(以整数表述)及以上。这就是第二个前提条件。
一个极端情况——全是“坏人”组成的社区能否实现一个公有链?不能,因为,若大家都不认可别人的数据,都去修改数据,甚至连一个区块的共识都达成不了,就谈不上形成链了。
守规矩的记账员(即“好人”)的有效算力应大于50%是个比较强的条件,也是一个比较容易实现的条件,因为现实社会就是“好人”占大多数。
当个体的算力差异不是很大时,我们可以去谈“合力”,这时,守规矩记账员的算力的合力不必达到51%,因为守规矩记账员能形成合力,而不守规矩的记账员却各怀鬼胎,即篡改的地方不一致,产生不同的分支,形成不了合力。
这里要解释一下“有效算力”。假定区块链社区只有100个记账员,他们都是“好人”且每个人的算力只有1F,那么,他们的“有效算力”为100F吗?实际上,每个区块的产生都只需要一个人的算力,因此,他们的“有效算力”为1F,即这100个人产生区块的效率等价于1个人产生区块的效率。假定现在有一个“恶者”加入了社区,他的算力为2F,现在社区共101个记账员,我们看看会发生什么情况。
创建区块的速度=算力/难度,在一定期间内,创造区块的“难度”是不变的,视为常量。如果现在“坏人”创建区块的速度为“好人”的两倍,那么“坏人”就可以修改一个区块,建一个新分支,新分支的成长速度是旧分支的两倍,很容易追上旧分支,这就实现了篡改。
好在这种情况不会发生,因为,既然“坏人”能弄到2F的设备,那“好人”应该也容易弄到2F的设备,这世界还是“好人”多。后续提到算力都是指“有效算力”。
区块链矿工组成的社区,社区成员来自五湖四海,但一定有“一个共同的目标”,即挖矿获利,由此实现了第二个前提条件:“好人”占大多数。
如果说“走到一起”的是一群“好人”,那么,会不会走着走着都变成了“坏人”?这就需要第三个前提条件:记账员都是“明白人”,即他们知道当前大多数记账员是“好人”,且“好人有好报”,只有遵循规矩才能有获得奖励的机会。后面我们会谈到“恶者”变善。若不是“明白人”,则该激励措施无效。
第四个前提条件:区块链要有足够多的用户,以便有足够多的交易,为记账员提供奖励资金,如比特币发完一定额度的币后,其奖励资金完全来自交易的手续费(后续称为交易费),或者记账员有这个前景预期,否则,无人挖矿,区块链就停止生长。这个前提条件直接换为另一种表述:区块链应不断生长。
第五个前提条件:区块链网络要保持足够的“互联”,即大多数网络节点能够保证与整个网络互联。在现在的互联网条件下,这是容易保证的。为便于理解,我们考虑一种不会发生的情况:假定跨洋海底电缆全部断了,整个互联网分为两个子网,于是,区块链在各自的子网上继续生长,形成两条区块链,即“Y”型,如图5.1所示,分叉的两条区块链相安无事。过了好长一段时间,海底电缆修好了,这时,这两条分支都很长,与交易相关的贸易合同都已履行,那如何选择?所以,要以不发生这种情况作为前提。
图5.1 Y型链
以上五大前提条件是区块链环境必须保证的,因此,我们将其称为社区假设。将“人性”作为技术参数,是区块链的魅力之一。
有了上述公有区块链生存环境的前提条件,还需要区块链的“种子”才能长出区块链来,即需要共同的基础。
(1)创世纪区块,由发布的核心程序来保证。一旦改了就是另一条链的起点。
(2)区块结构,由发布的核心程序来保证。一旦改了就是另一条链或原链的硬分叉。
(3)公共时钟,区块中要含有时间戳。在存证应用时,时间戳很有用。区块共识时需要检验时间戳是否在合理的时间窗口内。如果大家采用的计时时钟不一致,则达不成共识。
(4)核心程序就是区块链的“种子”。虽然既有了“种子”又有了好的“生存环境”,但是要让“种子”开花结果,“农夫”的心态也很重要。
(5)相信自己,即每个网络节点可以不相信别的节点,但一定要相信自己,否则无法达成共识,也无法使用本地数据。这就要保证自己的安全性,如防止病毒暗中破坏数据。除相信自己的数据、自己的计算外,还要相信自己所见。例如,你辛苦地挖出一个区块,却发现网络传来一个“编号”更大的区块,这时你就要相信自己所见:自己挖出的那个区块被这个新区块击败,即被剪枝。
(6)相信当下,即当下新产生的区块最可信,虽然它可能会被剪掉,但是被剪掉不意味着它不正确,只是在竞争中失败了而已。新区块中嵌入了前置区块的指纹,该指纹凝聚了先前区块由共识算法达成的可信性,或者说从递归角度,它凝聚了从创世纪区块开始至此的可信性,因为“过去”是曾经的“当下”,而“过去”又通过指纹嵌入“当下”。要达到“相信当下”这一点,就要保证所选用共识算法的数学原理是正确、实现该算法的程序是正确的。
上述的“相信”不仅由芯片、存储设备等计算机硬件、网络设施及软件的可靠性来保证的,还由软件所表达的共识算法和数学原理来保证。
一个不断生长的区块链的“当下”区块就是最右端处于共识竞争的区块。由(1)和(4)可知,区块链中的最左端和最右端是可信区块,中间的可能被篡改。从最右端开始,通过验证嵌入的指纹是不是前置区块的来确定前置区块是否被篡改。若直到最左端仍未发现被篡改,则说明无篡改。
注意:验证区块是否被篡改就是验证指纹是否相配,而不是验证交易的正确性。