比特币创世论文上有一部分的标题就是“时间戳服务器”,也就是 “timestamp server”。 这些文字我记得自己当初看完之后,首先不明白为啥要有个时间戳服务器,另外也不明白比特币的时间戳服务器是怎么工作的。本节咱们一起聊聊这两个问题。
时间戳,英文叫 timestamp , 最早指的就是一个物理的橡胶戳,扣到一个文件上表示这个文件的发布要早于时间戳上的当前时间。但是本文中我们聊的其实是数字时间戳,后面我们就都简称为时间戳了。时间戳就是计算机生成的一个时间,例如某年月日几点几分,格式有很多种,但是总之就是一个很简短的用来表示时间的字符串。
网上进行交易的时候,时间戳是非常重要的。比如我的一个比特币,我先用私钥签署一下,用它买了一只鸡,紧接着又再签署一下,买了一只羊。同一个比特币花了两次,到底哪一次有效呢?当然可以很容易的规定比较早的那次有效。可是问题就在这里,如何确认哪个交易发生的比较早呢?时间戳如果就是我自己的计算机生成的,那很容易造假的。
其实比特币出现之前,人们就会在网上频繁交易,所以时间戳服务器是早就有解决方案的。大家到网上去搜一下,会发现有很多公司在推销自己的时间戳服务器。这类公司一般都是政府颁发过证书的。我把我的数据发给他们,他们就会给我扣上一个时间戳,这个是有法律效力的哦。但是如何防止我改时间戳呢?毕竟时间戳就是个字符串。各家公司的方案肯定有差别,不过基本原理就是用提供时间戳的公司的私钥去签署一下我们的数据。因为有数字签名在,所有人都可以去验证这个时间戳是那家公司给加上的,同时数字签名签署的数据本身是不能修改的,数据改了,签名就直接作废了。其实数字签名中本身就包含一个时间戳,有些时候用这个自带的时间戳的可以了,不用另外添加了。
总之,时间戳就是个表示时间的字符串,本身没啥学问,但是关键在于保证时间戳的权威性。传统的时间服务器都是采用了基于信任的中心化处理方案,由政府和公司信誉做背书。这个方案肯定是不适合比特币的。
回到比特币网络的情况。在一个去中心化的网络上,确定交易的先后循序是非常有挑战的事情。
首先,不能根据交易时间戳来确定。因为每个人的计算机的时间不一定准确,并且也不能防止造假。所以比特币的一笔交易对应的底层数据中,是不包含时间戳的。每个用户进行交易的时候,把交易签名后就会公布到网上。于是网上就会形成一个交易池,池就是水池的池,表示很多交易组成的没有任何排序的一个集合。实际上,矿工进行记账的时候会优先选择交易手续费设置的比较高的交易来进行处理,先发出的交易不一定会被先处理。
同时,交易的先后顺序也不能根据块的时间戳来确定。每个矿工收集到足够的交易之后,会制作一个区块,区块是有时间戳的。当然,由于矿工也只是网络上的一个节点,网络传播其实也很不均匀,其他矿工也不能保证能同时看到这个区块,也无法就这个时间戳的准确性达成共识,所以区块时间戳其实也不适合作为判断交易先后的依据。比特币规定区块时间戳的误差允许在两小时范围之内,所以是一个非常模糊的时间,只是为了方便大家知道里面的各个交易的一个大概发出的时间而已。这个话题的详情可以参考比特币官方 wiki 中时间戳相关的页面,https://en.bitcoin.it/wiki/Block_timestamp 。
所以总而言之,就是分布式网络上的交易先后顺序是不能通过一个简单的时间戳来搞定的。
比特币创世论文中明确的有时间戳服务器这部分,其中明确给出了如何实现一个分布式的时间戳服务器的方案。简单来说,比特币创世论文里面说的”时间戳“不是我们上面说的时间戳,而是可以错略认为是区块哈希。因为只有块哈希才能真正的保证区块的先后顺序,虽然来讲哈希不体现时间,不能算真正的时间戳。
还是要回到区块链的链这个字。经过 POW 算力竞争,每过大概十分钟之后,下一个区块会被创建出来,让整个区块链的长度加一。区块链是一个单向的链条,有了区块链之后当然就名明确的看到那个区块在前那个在后了。只要包含在前面区块的交易,就认为比之后的交易出现的早,而这个顺序跟交易真正的发起时间无关。同时区块顺序甚至也不一定跟区块的时间戳顺序一致,比特币区块链上允许出现在后面的区块的时间戳时间反而比之前的区块早。
所以最终的问题是,区块是如何连成链的呢?首先一个区块的哈希可以用来当这个区块的定位符,类似于可以用文件名找到文件,有了哈希就能找到对应的区块。同时,后一个区块中会包含前一个区块的哈希,所以拿到最新的区块,就可以找到上一个区块,如此反复就能找到区块链上的所有区块了。那么区块链的这条方向顺序都很明确的链,就是这么形成的。注意,实际中比特币的所谓的区块哈希跟我这里描述的有所区别,涉及到更多的细节,所以我们就不展开了,因为不影响后续内容的理解。
这样,只要拿到一个区块的哈希,就能知道这个区块在区块链上的排序位置,就能确定它和另一个区块哪个在前哪个在后。所以比特币中创世论文中所说的“时间戳服务器”中所说的“时间戳”,其实不是指区块时间戳,而是可以粗略的认为是区块哈希。
这节介绍了比特币作为一个去中心化网络,上面如何明确体现出交易顺序的。首先交易本身的实际发生时间是不被记录的,另外区块的时间戳其实也只是记录区块创建的大概时间,也不能作为判断交易先后顺序的依据。比特币上的所谓的时间戳服务器,其实就是它的整个 POW 系统,因为这个系统可以保证系统上每十分钟就创建一个区块。同时系统会未每一个区块计算出哈希,每个区块中都保存着之前区块的哈希,有了这些哈希作为定位符,区块链就是一条单向的先后顺序明确的链条了。每个区块自然也就有了明确的先后顺序,同时也就是意味着里面包含的交易也都有了明确的交易顺序,这就是比特币时间戳服务器的基本原理。