(马库斯·雅各布森,工作量证明概念提出者。图片来源于网络)
本篇看点:区块时间的二重性是怎样的?区块时间又是如何与外部世界的时间戳相对锚定的呢?当中本聪使用“工作量证明”(PoW)把“时间之矢”赋予了链接区块的“哈希指针”之后,每一个区块都有一个工作量证明,或者说,每计算出一个工作量证明才能生成一个区块,这样一来,记录比特币交易的各区块就真正成为了时间长河中相继发生的历史记忆,比特币的区块链也就成为了中本聪所说的“时间链”,更具体的,“一条工作量证明的链”(a proof-of-work chain)。在这条“工作量证明链”上,时间具有了二重性。内生时间又叫区块时间,其刻度是区块的高度,相对尺度是区块的数目,比如“区块高度23100之前”,或者“5个区块之后”。而同时,每一个刻度点,也就是每一个区块,都记录了当前区块时间所对应的外部世界的时间戳,比如“2020年6月12日23时50分0秒”。这个时间戳当然有可能是不准确的,甚至有可能是虚假的、伪造的。比如,早年的比特币矿工就会通过修改时间戳来凑工作量证明的哈希值[1]。唯一不能被伪造的,就是计算“工作量证明”所需要花费的时间。而每一个区块中所记录的工作量证明,就是这个区块是上一个区块在时间上的后继的有力的、唯一的证明。[公众号:刘教链]如何让内生时间从一个个独立计算的“工作量证明”中自发涌现出来,并保持其和外部世界时间的协调一致呢?这是一个十分关键的问题。正如我们所知,比特币网络每个区块时间大概对应我们现实世界10分钟左右,而实际上,有时候可以短到几秒钟,有时候又会长达十几分钟甚至几十分钟。这又是什么道理呢?这些问题,我们以后会逐步揭晓。[公众号:刘教链]翻开比特币的源代码,我们可以看到,每个区块所记录的时间戳会有一个相对性的范围限制要求,这个要求主要有两点[2]:第一,不能比本地时间超前2个小时以上,也就是说,不允许区块声明自己创建于2个小时以后的未来世界;第二,必须晚于过去11个区块的中位数时间戳,也就是说,我们允许任何一个接入比特币网络的节点能够基于历史来验证时间戳,而不是基于当前本地时间,这样做的原因是,比特币网络的“无许可性”允许任何节点、在任何时刻、无需任何批准自由加入或退出。[公众号:刘教链]在2008年发表的比特币白皮书的摘要中,中本聪写道,“节点可以随意离开并重新加入网络,接受最长的工作量证明链作为它们离开时发生的事情的证明”[3]。[公众号:刘教链]退出一段时间又重新加入的节点需要能够正确验证整个区块链的时间戳,因此需要用历史前序区块时间戳来进行相对比较。使用“中位数”,而不是“平均数”,也不是随意而为。大家都知道,一个社会的平均收入往往被少数富豪拉高到大大超出广大平民收入的水平,这就是平均数容易被离群值影响的不好的特性,而改用中位数,则可以更好的反应更广大群众的一般收入水平。中本聪在时间戳标定时,使用中位数而不是平均数,同样是基于类似考虑,避免有人恶意操纵时间戳,影响平均数,破坏系统的稳定运行。使用11个数字的中位数,则意味着要进行有效操纵,发动“时间扭曲攻击”,需要能够控制11个数字中的半数以上,也就是一个人挖出6个以上的区块,这个难度就会变得非常高,攻击成功的概率也就被大大降低了[4]。[公众号:刘教链]