傳統(tǒng)關系型數(shù)據庫在設計表時一般會有一個或多個時間戳(timestamp)字段,用來標記一行記錄添加或修改時的時間。
基本上,這些時間戳是給應用內部使用的。當數(shù)據被共享給其他應用時,這些時間戳并沒有多大意義,因為時間戳可以偽造。
在數(shù)據黑市上,一個數(shù)據掮客可以將一份銀行VIP客戶數(shù)據進行注水,摻入一半的假數(shù)據。
一家保險公司為了攪亂市場上競爭對手的視線,故意污染數(shù)據,將高凈值用戶放入騙保用戶黑名單,將騙保用戶放入高凈值用戶名單,然后讓污染后的數(shù)據故意泄露出去。
如果每條數(shù)據都帶有一個真實可信的時間戳(這條數(shù)據產生的真實時間點),這樣的造假行為就比較難奏效,因為假數(shù)據的時間戳一般都是最近的。
以前我們很少關心數(shù)據的時間戳,很少去了解時間戳對數(shù)據的意義,一個原因也許是我們不知道如何用技術去實現(xiàn)這樣的時間戳。
如果技術實現(xiàn)完全可行,那么這個時間戳對我們來說就有了全新的意義。
首先,我們有了真正可以信任的歷史數(shù)據。
第二,這些數(shù)據因為可信變得更有價值,可以在應用之外被其他應用或者分析工具使用。
第三,我們可以基于這些可信的歷史記錄生成信用。
最后,我們真正進入一個信用社會。
想象一下,如果我們想在未來某天證明自己的數(shù)據是在今天產生的,可以在今天對今天的所有數(shù)據進行某種形式的哈希(比如默克爾樹),最終得到一個哈希值,然后在第二天的《參考消息》上登一個廣告,把哈希值發(fā)布出去。明天的《參考消息》就成了我們的時間戳。
如果明天我們想做同樣的事,可以如法炮制,另外有一個關鍵點,那就是要記得把今天的哈希值也給哈希進去。這樣每天的哈希值就包含了以前所有數(shù)據的哈希信息。
區(qū)塊鏈在P2P網絡上通過節(jié)點間的共識算法實現(xiàn)了一個分布式的時間戳服務。
區(qū)塊鏈是在時間上有序的、由記錄塊(區(qū)塊)組成的一根鏈條。一個區(qū)塊包含兩個部分:區(qū)塊頭(Block Header)和記錄部分。區(qū)塊中的所有記錄通過默克爾樹(Merkle Tree)組織起來,默克爾樹根(Root)的哈希值做為本區(qū)塊里所有記錄的數(shù)字指紋被放入區(qū)塊頭。
區(qū)塊頭還包含以下字段:前一個區(qū)塊頭的哈希值(這是前一個區(qū)塊的數(shù)字指紋,也可以看做是指向前一個區(qū)塊的哈希指針),本區(qū)塊的時間戳、高度(Hight,即從第一個區(qū)塊開始數(shù)本區(qū)塊是第幾個塊),以及一些其他信息。系統(tǒng)的共識算法保證了每過固定的一段時間(Bitcoin是大約10分鐘),參與整個系統(tǒng)記賬的節(jié)點會達成共識在區(qū)塊鏈上添加下一個新的區(qū)塊。
時間戳的這種設計,使得更改一條記錄的困難程度按時間的指數(shù)倍增加,越老的記錄越難更改。這是因為,如果改動某個區(qū)塊里的一條記錄,意味著該區(qū)塊原來的默克爾樹根失效了,需要改動區(qū)塊頭,該區(qū)塊的數(shù)字指紋隨之失效。又由于下一個區(qū)塊的區(qū)塊頭包含這個哈希指針,這就意味著下一個區(qū)塊也需要改動。如此直到最新的那個區(qū)塊。
可見要想改動一個區(qū)塊,必須同時改動該區(qū)塊后面的所有區(qū)塊。因為將一個區(qū)塊放入區(qū)塊鏈中需要消耗非常多的資源(資源種類依共識算法的不同而不同,可以是計算力,流逝的時間,擁有的權益等),隨著后面添加的區(qū)塊越來越多,要想改動某個區(qū)塊幾乎是不可能的。
對一個普通應用來說,如何實現(xiàn)這樣一個時間戳服務呢?我們需要自己創(chuàng)建一個區(qū)塊鏈嗎?其實沒必要,Bitcoin就是一個很好的時間戳服務,我們可以把哈希值寫到Bitcoin的區(qū)塊鏈中。這是一種存在證明(Proof of Existence)。Factom也提供類似的服務,它收集所有的哈希,每隔10分鐘生成一個哈希值,寫到Bitcoin的區(qū)塊鏈中。
哪些數(shù)據需要有時間戳?必須是不能變更的數(shù)據,特別適合存檔文件。需要現(xiàn)在就考慮實施時間戳嗎?這個跟你的數(shù)據戰(zhàn)略相關。在大數(shù)據時代,擁有高質量的數(shù)據就是擁有了價值。時間戳可以一定程度上保證數(shù)據的可信度,至少這些數(shù)據是經過“時間考驗”的。
來源:挖鏈網