比特币白皮书图解
时间戳服务器
时间戳服务器

之前我们介绍了如何通过数字签名来保证只有币的持有者才能进行转账,但是还不能避免双花。我有一个币,首先签署交易把这个币给了 A ,然后签署另外一个交易,把币给了 B ,这就是双花。解决双花问题才是比特币论文的核心,主要分两步:第一步是给交易排序,第二步是防止账本被篡改。本节我们只是解决这个问题的第一步,通过时间戳服务器来给交易排序,对应白皮书的第三部分《时间戳服务器》。

时间戳的本意

时间戳,英文叫 timestamp , 最早指一个物理的橡胶戳,扣到文件上表示这个文件的发布要早于时间戳的时间。但是这里我们聊的其实是数字时间戳,常见的一种形式就是 Unix 时间戳,表示方法是从1970年的一月一日到当前时刻的秒数。后面我们就把数字时间戳都简称为时间戳。

网上进行交易的时候,时间戳是非常重要的。比如我的一个比特币,我先用私钥签署一下,把它转给了 A ,紧接着又再签署一下,把它转给了 B 。同一个比特币花了两次,到底哪一次有效呢?当然可以很容易的规定比较早的那次有效。可是问题就在这里,如何确认哪个交易发生的比较早呢?

比特币出现之前,人们就会在网上频繁交易,时间戳服务器是很常见的。网上去搜一下,会发现有很多公司在推销自己的时间戳服务器。这类公司一般都是政府颁发过证书的。我把我的数据发给他们,他们就会给我扣上一个时间戳,这个是有法律效力的哦。

总之,时间戳是一个表示时间的字符串,本身没啥学问,但是关键在于保证时间戳的权威性。传统的时间服务器都是采用了基于信任的中心化处理方案,由政府和公司信誉做背书。比特币要实现的是一套”去信任“的系统,就像白皮书《简介》部分提到的

What is needed is an electronic payment system based on cryptographic proof instead of trust 我们需要的是一个基于密码学证据而非信任的电子支付系统。

比特币网络上的时间问题

回到比特币网络的情况。在一个去中心化的网络上,确定交易的先后循序是非常有挑战的事情。

首先,不能根据交易时间戳来确定。因为交易在网上的扩散是有延迟的,其他节点也不能判断交易时间戳有没有造假。所以,实际交易数据中干脆就没有包含时间戳。另外,节点制作区块的时候会优先选择手续费比较高的交易来进行处理,先发出的交易不一定会被先处理。手续费的详细情况后续小节中咱们再讲。

同时,交易的先后顺序也不能根据区块的时间戳来确定。区块是有时间戳的,比特币规定区块时间戳的误差允许在两小时范围之内,所以是一个非常模糊的时间,只是为了方便大家知道里面的各个交易的一个大概发出的时间而已。区块顺序甚至也不一定跟区块的时间戳顺序一致,允许出现在后的区块的时间戳时间反而比之前的区块早。这个话题的详情可以参考比特币官方 wiki 中时间戳相关的页面,https://en.bitcoin.it/wiki/Block_timestamp

所以总而言之,就是分布式网络上的交易先后顺序是不能通过时间戳来搞定的。

比特币的时间戳服务器

白皮书《时间戳服务器》这部分介绍了如何实现一个去中心化的时间戳服务器。但是比特币采用的方案中,既没有时间戳也没有服务器,只是功能跟传统的时间戳服务器类似,所以这部分才起了这个名字,大家不要被误导。

还是要回到区块链的链这个字。每过大概十分钟之后,下一个区块会被创建出来,让整个区块链的长度加一。区块链是一个单向的链条,有了区块链之后就名明确的看到那个区块在前那个在后了。只要包含在前面区块的交易,就认为比之后区块的交易出现的早,而这个顺序跟交易真正的发起时间无关。

只要区块连成了链,交易的先后顺序就明确了。如果攻击者,构建了两个交易,把一个币进行了双花,那么首先,这两个交易不可能同时被打包进一个区块,因为节点在打包区块的时候会发现交易是冲突的。如果两个交易被打包进了两个区块,二者的顺序也就明确了。实际中第二个交易在打包的时候也会通不过验证,根本进不了第二个区块。之前我们提过,区块之所以能成链,是因为后一个区块中包含了前一个区块的 ID ,通过白皮书这部分的图可以看到,这个 ID 其实就是区块哈希。白皮书上说

Each timestamp includes the previous timestamp in its hash, forming a chain,with each additional timestamp reinforcing the ones before it. 每一个时间戳都在自己的 hash 中都包含了之前的时间戳,形成了一条链。每个新增时间戳都可以强化之前的时间戳。

注意,这里说的时间戳不是传统意义上的时间戳,而是指区块。由于新区块中包含老区块的哈希,所以攻击者篡改了老区块,那么老区块之后的新区块也就找不到他了。所以攻击者想要篡改区块链,就意味着他要把之后的所有的新区块都要重新生成一遍,而后续小节中会介绍 POW 共识机制,到时候可以看到每个区块生成的都是很难的,所以说每个新加的区块,都为老区块提供了多一重的安全保证。

总之,比特币的时间戳服务器是通过生成一条区块链来实现的。

总结

这节我们只是讲解了如何通过时间戳服务器来给交易的排序。要真正防止双花,还需要保证攻击者不能撤销已经发出的交易,换句话说就是要保证区块链是不可篡改的,这个问题我们会在下一节 POW 共识中展开讲解。

参考: