Table of Contents

ISCN 如何實現 IPFS 的檔案版本管理功能

Table of Contents

IPFS 沒有為解決檔案版本問題度身訂造一套方案。IPNS 及 DNS link 雖然能將就使用,但沒提供版本追溯的基本功能。這塊功能拼圖正好由 ISCN 充填。

IPFS 的內容指紋是檔案的獨特記號,可用來判斷兩個檔案是否完全相同。假如檔案被改動了,那怕只是增刪一個像素,內容指紋哈希 (hash) 也會完全不同。這特性讓用戶能簡單驗證內容是否原版,有否被竄改過。這是 IPFS 的重要特色。

舉例,以下兩串內容指紋指向的兩個檔案內容只相差一個空格,指紋卻完全不同。

原版本: QmQPzjhk9Eqy7vJWhaheyg4NiBxAz51WXUTsx92STBTs1j

新版本(多一個空格): QmTQ6xEFKFSvRTxncf46CvYQf1rnRnfduKM7VepKyGo3LR

然而這帶來一個問題。假設有人把某條重要的影片備份了到 IPFS 網絡,某天他找到同一條影片的高清版,想把它更新到 IPFS。由於新版本影片產生了另一個內容指紋,而 IPFS 上檔案的網址是以內容指紋構成的,於是不同的檔案版本便產生了不同的網址。

每次檔案更新版本後,網址也會跟著改變,這有礙資訊的流傳,因為訪問者很難追縱著新版本的網址是什麼。

IPFS 提供了一個基本方案解決以上問題: IPNS (InterPlanetary Name Service)。

IPNS 未能完全滿足檔案版本管理需求

IPNS 的功能是以一串固定的公開鑰匙 (public key) 地址指向可變的內容指紋版本。當檔案的版本更新了,檔案擁有者可改變 IPNS 地址指向新版本的內容指紋,令用戶訪問時直接取得新版本的檔案。IPNS public key 地址跟內容指紋同樣是一串哈希 (hash),外貌都是一串人類不能讀懂的亂碼字串,例如:

k51qzi5uqu5di0d9ghx9d6u6b9cs537mzf74iw95ry9w6c65ptcmg0p92w21rm

用戶可以 IPNS 協議直接訪問,例如:

ipns://k51qzi5uqu5di0d9ghx9d6u6b9cs537mzf74iw95ry9w6c65ptcmg0p92w21rm

或通過 IPFS 公共節點訪問,例如:

https://gateway.pinata.cloud/ipns/k51qzi5uqu5di0d9ghx9d6u6b9cs537mzf74iw95ry9w6c65ptcmg0p92w21rm

ISCN 如何實現 IPFS 的檔案版本管理功能
以 IPNS 地址取得最新版本的 IPFS 檔案

以上方法令用戶只需記著同一個地址便可訪問到最新版本的檔案,然而卻未能完全解決檔案版本管理的需求,因除了獲得最新版本的檔案外,還有其他重要的版本功能需求。

假設現在有一份重要如香港《基本法》的法律文件在 IPFS 上發佈了,訪問者雖能通過固定的 IPNS 地址訪問到最新版本,卻無法得知過往每一個舊版本的改動,會產生什麼問題呢?市民無從得知政府過往的承諾是怎樣,無法比較過往版本來了解歷史脈落,甚至連具體修改了什麼的資訊也欠奉。

由此可見,用戶期待的版本控制功能遠比只能取得新版本的基本 name service 功能要複雜得多,因為 IPNS 的設計本不是針對版本管理需求的。

完整的版本管理功能需求,可參考軟件開發人員常用的 GitHub 服務。GitHub 的檔案版本管理功能十分齊全,對非程式碼的一般資料來說可能是殺雞用牛刀,然而我們卻可從中抽取不少有用的洞見。例如:

  • 每個版本都有獨一號碼以茲識別
  • 包含修改記錄詳情,包括修改時間、修改內容、修改原因等
  • 資料追溯功能: 可取得任何一個舊版本的完整資料

為 IPFS 檔建立「版本資料庫」

管理檔案版本的直觀方法,是建立一個檔案的索引資料庫,記錄每個檔案的版本號及各種跟版本修改有關的資訊。版本的資料結構可以很基本,即每一檔案版本對應一筆記錄,內有該版本指向的檔案內容指紋,而同一內容的所有版本都分享同一個內容名稱,功用一如 IPNS,方便用戶搜尋。

ISCN 如何實現 IPFS 的檔案版本管理功能

這種內容版本資料結構其實早已在很多領域沿用,例如書籍的 ISBN 便以相似的方法處理再版記錄。現況卻是包括版本資訊在內的各種內容元數據正以各種不同的格式儲存在不互通的數據庫中,窒礙資訊流通;而且資料由少數機構或個人負責管理,會有被竄改的風險。這便是為何版本資訊應建立於區塊鏈的關鍵原因。

ISCN:版本資料去中心化由公眾管理

ISCN 是建立於 LikeCoin chain 區塊鏈上,記錄包括檔案版本資訊等元數據的功能。ISCN 中有關版本管理的資料結構很簡單:

  • iscn:Record:每一內容都可註冊一個 ISCN ID
  • iscn:RecordVersion:由系統管理的版本號
  • iscn:ContentFingerprints:內容指紋,可以是 IPFS/IPNS hash 或任何網址
  • iscn:recordParentIPLD:指向上一版本的 ISCN 記錄,讓用戶能追溯舊版本檔案的資料
ISCN 如何實現 IPFS 的檔案版本管理功能
在 iscn.io 上定義的 ISCN 數據結構

有別於把版本資訊儲存在封閉的數據庫,ISCN 把檔案版本元數據儲存在 LikeCoin chain 的區塊鏈上。鏈上資料公開透明且不可竄改,代表任何改動必留下痕跡。這對有公共意義的內容尤其重要,例如政府檔案、新聞報導、歷史記錄等。

把版本資訊寫在鏈上,等於把這基本的內容資訊管理方式由百花齊放但互不相通的應用層,下移到所有應用都能共享的協議層,有助建立內容孤島之間的橋樑。

由於區塊鏈由分散的通證持份者管理,一旦出現版本的爭議時,可藉流動民主的機制直接或授權社群代表處理。

以 ISCN 來處理 IPFS 的檔案版本,可完美解決以上提及過的版本管理問題。ISCN 的設計且不限於處理 IPFS 檔,也可用在其他分佈式檔案系統如 Arweave,或任何傳統的中心化數據庫。

ISCN 如何實現 IPFS 的檔案版本管理功能