區塊鏈存證的技術實現

衆所周知,區塊鏈具有時間戳特性和不可篡改特性,這兩個特性就用於數據的存證,這是區塊鏈誕生除了CryptoCurrency之外,人們最容易想到的應用。區塊鏈存證的技術原理很簡單,在用戶簽名和發送交易前,用戶將要存證的數據(如果數據量小,而且不用擔心隱私問題,可以直接存儲正文,如果數據量大,則計算該數據的Hash)附加到交易中,然後再進行簽名廣播。記賬節點在驗證了交易的合法性後,將該交易打包到區塊中,並在區塊中附加上時間戳信息。

存證的區塊鏈寫入

目前主流的區塊鏈都具有將數據附加到交易中的特性。以比特幣爲例,其支持在Output中使用OP_RETURN來存放數據,不過由於比特幣網絡比較擁堵,所以比特幣網絡接受OP_RETURN存放的數據很有限,最多存放40個字節,後來又有版本調整,改成了80字節,總之是非常非常小,不過用於存放一個Hash值32字節還是足夠了。以太坊是在交易中支持inputdata字段,如果以太坊交易的接受地址是外部地址,那麼inputdata就是用於存證的數據內容,該數據內容就可以很長,而不是80字節的限制,可以是一整篇文章、公開信等。PalletOne的交易是由不同類型的Message組成,PaymentPayload負責Token的流轉,DataPayload負責數據存放。當我們需要在PalletOne存證時,只需要創建具有PaymentPayload和DataPayload的交易,然後進行簽名,廣播。

使用區塊鏈進行數據存證,我們可以得到以下幾點共識:

  1. 在存證所在區塊的時間戳之前,該數據已經存在(區塊的時間戳特性)
  2. 拿到數據的內容,可以判斷該數據在存證後是否更改(Hash函數的特性)
  3. 存證數據是由持有某私鑰的人存證的,該人不可抵賴,別人也不可冒充(區塊鏈的不可篡改和數字簽名的特性)

雖然區塊鏈存證具有以上的優勢,但是比特幣、以太坊等畢竟不是爲數據存證而設計的鏈,所以在存證上只有一個字段,對索引、擴展、引用的支持都沒有,需要第三方應用來實現。

存證安全性的加強

基於區塊鏈的存證,主要是利用了區塊鏈的不可篡改特性和時間戳特性,但是我們怎麼能保證區塊鏈的不可篡改和時間戳是正確的呢?

區塊鏈的二次存證

如果存證數據是保存在一個私有鏈、聯盟鏈或者是DPOS公鏈上,那麼從理論上來說,該區塊鏈沒有完全的去中心化,一旦聯合作惡,仍然有篡改歷史數據的可能。而以POW爲共識算法的比特幣、以太坊網絡則更去中心化,更難以篡改歷史數據。所以,爲了進一步加強存證所在鏈的安全性,我們可以定期將該區塊鏈的最新區塊Hash,在比特幣或者以太坊進行存證,由他們來證明本存證鏈沒有被篡改,從而證明該鏈上的所有存證數據沒有被聯合作惡篡改,Factom就是採用了類似的方式保證了本鏈的數據沒有被篡改的。以下圖右下角是Factom進行比特幣網絡的二次存證的示例:

clipboard

可信時間戳

區塊鏈的時間戳是指在每個區塊頭上,記賬節點在產塊時,寫入的一個時間值。這個時間值並不要求十分精確,只要在一定的範圍內,其他節點也是可以接受的。以比特幣爲例,大約每10分鐘產一個塊,而且比特幣網絡十分擁堵,所以要用比特幣進行存證,而費用給的不是很高的話,可能幾個小時,甚至幾天都不被打包。從發起存證交易到被最終打包花了幾天的時間,時間戳的誤差範圍就太大了。

對於要求更精確時間的存證,我們一方面使用高性能的公鏈或者聯盟鏈,另一方面可以國家認可的可信時間服務,比如:https://www.tsa.cn/ 等。我們並不需要對每個存證都請求時間戳服務,我們可以根據存證所需要精確到的時間範圍,每幾分鐘、幾小時請求一次可信時間服務,獲得簽名的證書,並將證書包含到區塊中即可。

以下是WoSign的時間戳服務示意圖:

clipboard

存證的索引

首先我們說索引,加入我有一張照片,我記得之前在區塊上進行了存證,也就是將這張照片文件的hash放到了區塊鏈上,但是我並不記得是什麼時候放的了,那麼我怎麼查詢這張照片的存證結果呢?因爲比特幣和以太坊在底層數據結構上不支持,所以只有靠第三方的區塊鏈瀏覽器,或者寫個工具掃描全賬本,將所有存證數據放入數據庫建立索引,然後依靠數據庫索引來實現存證數據的查詢。

而PalletOne上進行存證數據則不需要依賴第三方工具,PalletOne在存證數據所使用的DataPayload進行了專門的存證設計,其結構如下:

type DataPayload struct {
    MainData  []byte `json:"main_data"`
    ExtraData []byte `json:"extra_data"`
    Reference []byte `json:"reference"`
}

我們只需要將需要存證的照片Hash放到MainData中,簽名並廣播交易。當一個全賬本在收到一個新區塊,並存儲到本地賬本時,會解析其中包含的DataPayload.MainData,並建立MainData與TxHash的索引。而TxHash本身也具有和UnitHeader之間的索引,所以我們只需要知道MainData,就可以很快的查詢到該存證所在的交易Hash,所在的單元Hash、高度、時間戳等。而通過交易Hash作爲Key,又可以查詢到交易本身(包括存證人、存證花費的Token、其他交易信息等)。

存證的擴展

在實際存證的過程中,大多數情況下,我們不可能只存儲一個Hash就完了,而是希望將該Hash所對應的文件的特徵、描述、標籤等作爲附加信息也存證起來。比如我們在做照片的版權存證時,我們在MainData中存入照片的Hash,在ExtraData中以json格式存入了照片的名字、作者、拍攝時間、拍攝地點以及其他的描述信息,這些信息不用太長,但也對照片起到了很好的描述作用。擴展信息由於是非標準化的,存證不同的內容,其ExtraData的格式和內容也千差萬別,所以並不需要建立通用的索引。

存證的引用

除了常見的對最終結果的存證,對一個數據的多個版本進行存證也是常見的需求。比如我們有個多人協同寫作的文檔,每個人都可以在別人完成的文檔的基礎上進行進一步的修改和完善,而每一次修改的發佈就是一個版本,我們可以將該文檔的所有版本每次在發佈時都存證起來。對文檔的多個版本進行存證,就要求每次存證時,指定一個引用關係,比如我們必須指定本次存證的上一個版本Hash是什麼,如果沒有指定就可以認爲是該文檔的第一個版本,這是一種鏈式引用關係。當然我們也可以使用另一種引用方法,即第一個版本存證時沒有引用關係,接下來所有版本的存證,都指定引用爲第一個版本的Hash;因爲區塊鏈本身提供了時間戳服務,所以我們可以通過時間戳對所有後續版本進行排序,而確定先後順序。Reference字段不僅僅可以和其他存證建立引用關係,也可以和TokenID建立引用關係,我們甚至可以進一步擴展Reference字段的內容,形成引用的DAG結構,以適配更復雜的應用場景。

存證與通證的結合——溯源

對區塊鏈和比特幣有點了解的都知道,UTXO是比特幣的記賬模型,在一筆交易中採用input和output來表示比特幣的流轉情況,每個input指向另一個output。而UTXO這種鏈式模型,就天然適合於溯源的底層模型。

如果我們要對某個物品進行溯源跟蹤,那麼首先要給該物品進行唯一標識,可以給該物品貼上全球唯一的二維碼/條形碼,然後在區塊鏈系統中,我們有一個與該物品唯一標識對應的Token被創造出來。接下來只要該物品流轉到下一個環節,那麼區塊鏈系統中也對該Token進行一次轉賬,交給下一個人。

既然這裏涉及到Token的轉賬交易,那麼就可以在這次轉賬交易中將DataPayload也附加上去,爲溯源增加更多信息。

以基於PalletOne區塊鏈爲基礎的“藝溯鏈”爲例,該區塊鏈應用主要是實現了對藝術品、工藝品的溯源。比如玉雕的溯源。當一個玉雕大師(工作室)完成了一個玉雕作品時,玉雕大師會爲作品拍照,測量、填寫材質、尺寸、重量等信息,並以此信息創建一個唯一的Token。創建後的Token是在玉雕大師的地址賬戶下,當玉雕要投放市場時,玉雕大師將玉雕交到門店,同時將Token轉移給門店的地址。門店如果希望對玉雕進行鑑定,可以將Token自己轉移給自己,同時在本次交易中,把鑑定證書的照片Hash,證書鏈接等作爲DataPayload添加到Token的交易中。最終消費者在購買玉雕時,可以查詢該玉雕對應Token的流轉歷史和存證信息,並在購買玉雕後,由商家將玉雕的Token轉移到用戶的地址賬戶名下。這樣可以增加消費者對玉雕作品的信任。

總結

基於區塊鏈的存證,可以使用比特幣網絡的二次存證實現存證鏈的不可篡改的可信。配合國家認可的可信時間戳服務,對區塊的時間戳進行可信證明,保證了從法律層面認可區塊鏈的存證時間戳。將存證數據分爲可索引的MainData,可附加更多數據的ExtraData和可以建立引用關係的ReferenceData,可以實現大部分企業級的存證需求。存證數據和Token的UTXO模型結合,以及非同質化通證的支持,可以實現溯源功能的原生支持。

在溯源的技術實現上,雖然和UTXO結合,使用非同質化Token的方式進行溯源具有底層優勢,但是對於大批量的商品並不合適。比如藥品的溯源,如果我們爲每一盒藥都創建一個對應的Token,那麼在藥品出廠,一卡車一卡車的運到經銷商時,相當於要做幾萬幾十萬個Token的轉賬,這種大批量的Token轉移,每一個都需要單獨簽名和驗籤,嚴重製約了溯源的併發數,所以Token化的溯源更適合藝術品、珠寶等高價值,但量不大的場景。

如果針對單純的存證場景,在聯盟鏈中,Token和Gas就不是必須的了,如果每次存證都需要Token的轉移或者Gas的消耗,則嚴重影響併發。所以聯盟鏈的存證,是可以去掉對Token的依賴,用戶發起的交易只需要包含2條Message:DataPayload和SignaturePayload即可。當然在公鏈場景下,Gas仍然是必須的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章