如何使用 IPFS 來存儲和託管 NFT (教程)

可以長久保存並防止篡改,這是 NFT 核心價值之一。不幸的是,目前許多面向消費者的 NFT 由於設計上的根本性漏洞,並沒有這些屬性。常常看到一些 NFT 號稱的“在區塊鏈上永存”,但實際上經常因爲成本和區塊鏈存儲能力的限制,存儲的只有所有權記錄和關聯 NFT 的元數據。

很多時候,這些鏈接是脆弱的 (https://www.vice.com/en/article/pkdj79/peoples-expensive-nfts-keep-vanishing-this-is-why),用 HTTP 協議將用戶引向特定位置,而非該資產本身。這意味着鏈接指向的內容可能在以後失效或者改變,造成原資產的丟失(只剩所有權記錄是無價值的)。

IPFS 可以解決這個問題,使用 IPFS 的 NFT 將享有優勢。但只有遵從既有規範才能較好讓數據得以永久保存並可訪問。隨着 NFT 的迅速流行,現在是一個好時機,讓我們重溫下在 IPFS 上存儲和鏈接 NFT 數據的最佳實踐。在本文中,我們將探討兩個近期熱度話題:內容尋址和數據完整性。在 IPFS 文檔網站上,有新的章節使用 IPFS 存儲 NFT 數據的最佳實踐 (https://docs.ipfs.io/how-to/best-practices-for-nft-data/),可幫您瞭解更多細節。

內容尋址

IPFS 內容標識符 (https://docs.ipfs.io/guides/concepts/cid/)(CID) 在精準標識內容方面是極其強大和靈活的,無論該內容存於何處,以何種方式存儲。爲了最大限度地利用這些優點,開發者在鏈接 IPFS 數據時應遵循以下建議和慣例。

鏈接概述

本文並非對 CID 的全面解釋(對此,已經有極佳的資料 (https://docs.ipfs.io/how-to/address-ipfs-on-web/#dweb-addressing-in-brief))。但本文旨在讓讀者瞭解以下幾點:

CID

CID 是自描述的,是對任意內容唯一對應的標識。

例子:bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi

CID 應該用在您的應用代碼中,以及其他明確是在使用 IPFS 的場景下。

我們建議在磁盤上將 CID 轉爲 IPFS URI 存儲,特別是在元數據或者區塊鏈記錄這種寫入後不再更改的記錄中。給 CID 加上 ipfs:// 的 URI 格式,增加了上下文信息,讓用戶和自動化的工具更容易找到所鏈接的內容。

IPFS URI

統一資源標識符 URI(https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) 用於在協議中指定某特定內容。協議是由 URI 格式決定的(作爲前綴附加到 URI 上,還加上 ://)。IPFS 的 URI 格式是 ipfs。有時 URI 可以在最後附加路徑。

例子:

ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi

ipfs://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4

IPFS URI 是指向文件或者目錄的標準 IPFS 鏈接。當從智能合約鏈接到 IPFS 數據時,IPFS URI 表明該數據應該通過 IPFS 系統獲取。

當在 NFT 的結構化元數據中對 IPFS 上的圖像及其他媒體資源做鏈接時,也應該使用 IPFS URI。

HTTP Gateway URL

HTTP gateway(https://docs.ipfs.io/how-to/address-ipfs-on-web/#http-gateways) 幫助無法原生解析 IPFS URI 的舊版瀏覽器進行兼容。這種鏈接只應在應用程序的界面中使用,而不應該存入區塊鏈或 NFT 的元數據中。

例子:https://dweb.link/ipfs/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi

需注意到,HTTP gateway_又將內容分發中心化_,是中間人攻擊的可能載體並帶來潛在的單點失效—— 如果 gateway 運營方下線或者失聯,鏈接將失效。而內置 IPFS 支持的瀏覽器(通過 IPFS Companion(https://docs.ipfs.io/install/ipfs-companion/) 瀏覽器擴展,或原生支持,如 Brave(https://brave.com/ipfs-support/))可以避免這些問題,因爲它們可以_自動_從此類鏈接中提取 CID,並根據用戶設置從 IPFS 加載數據。

不同場景中的尋址

在不同場景下,開發者應根據具體情況使用合適的鏈接設置方式。

鏈上

NFT 智能合約上對一個 NFT 對應的資源和元數據應該使用 IPFS URI。

例子:ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json

我們建議在生成 NFT 之前先生成 IPFS URI,並將 URI 完整存於鏈上。對傳入一個 URI 的智能合約接口,這種方式最簡單。而且 ipfs:// 的 URI 格式讓應用知曉此數據位於 IPFS 上。

元數據

在 NFT 的元數據中,應使用 IPFS URI,這是在文本中鏈接 IPFS 資源最明確,且長期可靠的方式。

下面是一個鏈向 NFT 媒體資產的 IPFS URI 的例子:ipfs://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4。

開發者可以用公共 HTTP gateway(https://docs.ipfs.io/how-to/address-ipfs-on-web/#http-gateways) 來獲得兼容性。

同時應該避免其他鏈接到內容的方式(如非 IPFS HTTP gateway 的 URL)。普通的 HTTP 鏈接至多隻能作爲內容的臨時鏡像,因爲鏈接的內容很容易被改變。在區塊鏈上,數據是永久存儲而無法篡改的,所以在鏈上使用 HTTP 是脆弱的,有失效風險。

相比之下,IPFS URI 是永久有效的,可被安全地作爲數據的規範鏈接。通過使用 IPFS URI 作爲“真理之源”鏈接,應用程序更容易使用多種不同的存儲方案,或在未來切換不同的 gateway,只要生成新的 gateway 鏈接。這比起將特定 gateway 鏈接“硬編碼”到區塊鏈的永久記錄中更靈活。

應用

在面向用戶的應用程序中,開發者應通過以下兩種方式鏈接 IPFS 內容。

1. IPFS URI

2. HTTP gateway URL

直到更多的瀏覽器原生支持 IPFS URI。請注意,這兩種鏈接都是容易從原始 CID 或 IPFS URI 生成的。

下面是一個 HTTP gateway URL 指向公共的 dweb.link:

https://dweb.link/ipfs/bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4

也可以使用 CID 作爲子域名,而不是放在 URL 路徑裏:

https://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta.ipfs.dweb.link/nft.mp4

這兩個例子都對應這個標準 IPFS URI:ipfs://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4。

數據完整性

關於 NFT 資產的一個重要的點在於其完整性 —— 包括資產本身和所有相關數據。IPFS 使用 CID 來保護 NFT 數據的完整性,確保自鏈接創建以來沒有篡改。

開發者應遵守以下建議,讓 IPFS 內置的數據驗證功能發揮最大效用。

鏈接資產元數據

元數據是 NFT 價值構成的有機部分。因此,爲保全資產的價值,在 IPFS 上存儲資產時也應存儲元數據,並確保兩者都可獲取。

實現該目標的首選方法如下:

1. 創建兩個新目錄(一個用於資產,一個用於元數據)

2. 將資產添加到其目錄中

3. 將資產的目錄添加到 IPFS 中,記錄其 CID

4. 在相應目錄創建元數據,使用步驟 3 中的 CID 創建 IPFS URI。該 URI 應該包含目錄的 CID 和資產文件名

5. 將元數據的目錄添加到 IPFS 中,記錄其 CID。

6. 使用步驟 5 中的 CID 爲元數據創建 IPFS URI,將該 URI 存儲在鏈上,加入所有權記錄

該流程既能讓開發者將文件名加入鏈接中(方便用戶交互),又確保元數據和資產可被獨立應用。

  • 元數據將在以下位置被訪問:ipfs://{元數據目錄的 CID}/ 元數據文件名

  • 資產可以通過以下地址訪問:ipfs://{資產目錄的 CID}/ 資產文件名

下面是 JSON 元數據例子,包含鏈接到圖像文件的 IPFS URI:

如何使用 IPFS 來存儲和託管 NFT (教程)

該圖片可使用 IPFS URI ipfs://bafybeidfjqmasnpu6z7gvn7l6wthdcyzxh5uystkky3xvutddbapchbopi/no-time-to-explain.jpeg` 訪問。在界面上,您的應用可以創建一個 gateway URL 方便用戶使用 HTTP 獲取該圖片,例如 https://dweb.link/ipfs/bafybeidfjqmasnpu6z7gvn7l6wthdcyzxh5uystkky3xvutddbapchbopi/no-time-to-explain.jpeg

一旦元數據創建完成,作爲 JSON 文件在 IPFS 上存儲後,其 CID 可用來創建如 ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json 的 URI。該 URI 可存入智能合約中。

整個過程的實戰案例,可在 IPFS 文檔網站上如何在 IPFS 上發行 NFT(https://docs.ipfs.io/how-to/mint-nfts-with-ipfs/#a-short-introduction-to-nfts) 查看。文檔使用 javascript 詳細演示了整個過程。

高可用

使用如 IPFS 這樣的去中心化網絡來提供內容的主要原因之一是爲了防範鏈接失效 (https://en.wikipedia.org/wiki/Link_rot)。這是通過讓網絡中別的節點共同運營數據鏡像服務來實現的。但對數據可用性有高要求的開發者不應該依賴於別的節點的利他性。爲了確保鏈接的內容可用,開發者應該 pinning(https://docs.ipfs.io/concepts/persistence/) 內容的 CID 在自己的存儲節點上,並與願意幫忙的節點一起存儲分發該內容。如果願意的話,開發者也可以使用 pinning 服務 (https://docs.ipfs.io/how-to/work-with-pinning-services/) 來代爲運營。

如果您也對 Filecoin 感興趣,歡迎瞭解更多內容:

如何使用 IPFS 來存儲和託管 NFT (教程)