传统关系型数据库在设计表时一般会有一个或多个时间戳(timestamp)字段,用来标记一行记录添加或修改时的时间。
基本上,这些时间戳是给应用内部使用的。当数据被共享给其他应用时,这些时间戳并没有多大意义,因为时间戳可以伪造。
在数据黑市上,一个数据掮客可以将一份银行VIP客户数据进行注水,掺入一半的假数据。
一家保险公司为了搅乱市场上竞争对手的视线,故意污染数据,将高净值用户放入骗保用户黑名单,将骗保用户放入高净值用户名单,然后让污染后的数据故意泄露出去。
如果每条数据都带有一个真实可信的时间戳(这条数据产生的真实时间点),这样的造假行为就比较难奏效,因为假数据的时间戳一般都是最近的。
以前我们很少关心数据的时间戳,很少去了解时间戳对数据的意义,一个原因也许是我们不知道如何用技术去实现这样的时间戳。
如果技术实现完全可行,那么这个时间戳对我们来说就有了全新的意义。
首先,我们有了真正可以信任的历史数据。
第二,这些数据因为可信变得更有价值,可以在应用之外被其他应用或者分析工具使用。
第三,我们可以基于这些可信的历史记录生成信用。
最后,我们真正进入一个信用社会。
想象一下,如果我们想在未来某天证明自己的数据是在今天产生的,可以在今天对今天的所有数据进行某种形式的哈希(比如默克尔树),最终得到一个哈希值,然后在第二天的《参考消息》上登一个广告,把哈希值发布出去。明天的《参考消息》就成了我们的时间戳。
如果明天我们想做同样的事,可以如法炮制,另外有一个关键点,那就是要记得把今天的哈希值也给哈希进去。这样每天的哈希值就包含了以前所有数据的哈希信息。
区块链在P2P网络上通过节点间的共识算法实现了一个分布式的时间戳服务。
区块链是在时间上有序的、由记录块(区块)组成的一根链条。一个区块包含两个部分:区块头(Block Header)和记录部分。区块中的所有记录通过默克尔树(Merkle Tree)组织起来,默克尔树根(Root)的哈希值做为本区块里所有记录的数字指纹被放入区块头。
区块头还包含以下字段:前一个区块头的哈希值(这是前一个区块的数字指纹,也可以看做是指向前一个区块的哈希指针),本区块的时间戳、高度(Hight,即从第一个区块开始数本区块是第几个块),以及一些其他信息。系统的共识算法保证了每过固定的一段时间(Bitcoin是大约10分钟),参与整个系统记账的节点会达成共识在区块链上添加下一个新的区块。
时间戳的这种设计,使得更改一条记录的困难程度按时间的指数倍增加,越老的记录越难更改。这是因为,如果改动某个区块里的一条记录,意味着该区块原来的默克尔树根失效了,需要改动区块头,该区块的数字指纹随之失效。又由于下一个区块的区块头包含这个哈希指针,这就意味着下一个区块也需要改动。如此直到最新的那个区块。
可见要想改动一个区块,必须同时改动该区块后面的所有区块。因为将一个区块放入区块链中需要消耗非常多的资源(资源种类依共识算法的不同而不同,可以是计算力,流逝的时间,拥有的权益等),随着后面添加的区块越来越多,要想改动某个区块几乎是不可能的。
对一个普通应用来说,如何实现这样一个时间戳服务呢?我们需要自己创建一个区块链吗?其实没必要,Bitcoin就是一个很好的时间戳服务,我们可以把哈希值写到Bitcoin的区块链中。这是一种存在证明(Proof of Existence)。Factom也提供类似的服务,它收集所有的哈希,每隔10分钟生成一个哈希值,写到Bitcoin的区块链中。
哪些数据需要有时间戳?必须是不能变更的数据,特别适合存档文件。需要现在就考虑实施时间戳吗?这个跟你的数据战略相关。在大数据时代,拥有高质量的数据就是拥有了价值。时间戳可以一定程度上保证数据的可信度,至少这些数据是经过“时间考验”的。