深入聊聊 Web3 世界中的協(xié)議和硬盤:IPFS
在 Web2.0 的世界里,協(xié)議通常是 HTTP,資源加速通常是 CDN,對象存儲通常是 OSS。
在 Web3.0 的世界里,有很多技術(shù)都可以替代這三項技術(shù),并且把事情做的更好。而其中最優(yōu)秀的項目之一,是一個集成了協(xié)議、資源加速和存儲于一身的技術(shù):IPFS。
本文將會介紹 IPFS 是什么,以及它的運行原理。
IPFS 的白皮書在 2014 年 7 月發(fā)布,其中提到了很多技術(shù)方案的暢想。它的理念和傳統(tǒng)的 Web2.0 中 HTTP、CDN 和 OSS 截然不同。
在介紹 IPFS 之前,先來回顧一下 HTTP、CDN 和 OSS 的優(yōu)勢和弊端。
為什么 HTTP、CDN、OSS 這些技術(shù)在 Web3 的世界里玩不轉(zhuǎn)了?
HTTP 的優(yōu)勢與弊端
這里指的 HTTP 是 HTTP1.1 和 HTTP2.0。
它的優(yōu)勢是處理小文件的傳輸。
但是現(xiàn)代互聯(lián)網(wǎng)的數(shù)據(jù)傳輸存在 5 點挑戰(zhàn):
- 托管和分發(fā)的數(shù)據(jù)量已經(jīng)達(dá)到 PB 級別。
- 跨組織的大數(shù)據(jù)計算。
- 分發(fā)海量高清視頻。
- 海量數(shù)據(jù)的鏈接和版本管理。
- 防止重要文件丟失。
將以上總結(jié)為:海量數(shù)據(jù),無處不在。
而這些,都是 HTTP 難以應(yīng)對的。所以隨著互聯(lián)網(wǎng)持續(xù)不斷的發(fā)展,HTTP 遲早會退出歷史的舞臺。
CDN 的優(yōu)勢與弊端
CDN 主要目的是為了加速靜態(tài)資源的訪問速度,這也是它主要的優(yōu)勢。其次可以抵抗 DDOS 攻擊,維護(hù)也比較方便。
但缺點很明顯,搭建 CDN 服務(wù)器的過程比較復(fù)雜,成本也高,所以一般都會買服務(wù)端的 CDN,但價格也不算低。
OSS 的優(yōu)勢與弊端
這里指的 OSS 是云服務(wù)商的 OSS 服務(wù)。
OSS 的優(yōu)勢就是高可靠、易擴展、速度快、邊緣計算。在此之上可能還會有鏡像、備份、安全、脫敏等一系列高級功能??偨Y(jié)來說就兩個字:省心。
缺點也很明顯,價格非常貴。但是所有 OSS 服務(wù)商都把低成本也算做它的優(yōu)勢之一。事實上在數(shù)據(jù)量少的情況下感受不出來,可一旦數(shù)據(jù)量激增后,高昂的價格實在讓人無力接受,這一點我有深刻的體會。
當(dāng)然 OSS 貴的真正原因不是存儲成本高,而是帶寬成本高。
現(xiàn)代互聯(lián)網(wǎng)的問題
上述的問題都屬于技術(shù)的范疇,除此之外,還有一個根本性的問題?,F(xiàn)代互聯(lián)網(wǎng)模式的問題。
技術(shù)問題、成本問題、效率問題
因為現(xiàn)代互聯(lián)網(wǎng)都是中心化的模式。這種模式成本極高,需要構(gòu)建中心化大規(guī)模的服務(wù)器集群,而且在高峰期容易出現(xiàn)服務(wù)阻塞延遲、低谷期大量資源限制浪費等問題,效率很低。這種模式很依靠中心化服務(wù)商的存儲和帶寬。盡管有了彈性計算等技術(shù)可以緩解這種情況,但解決不了根本模式的問題。
IPFS 可以共享存儲和帶寬,這樣可以更高效利用資源,降低成本。
IPFS 可以有效地去重文件、消除冗余。
數(shù)據(jù)所有權(quán)問題
現(xiàn)代的互聯(lián)網(wǎng)很容易丟失數(shù)據(jù)。因為數(shù)據(jù)都是在中心化的服務(wù)器集群上,服務(wù)商擁有數(shù)據(jù)的管理權(quán)利。盡管大型服務(wù)商都有數(shù)據(jù)備份和容災(zāi)方案。但是偶爾還是會發(fā)生意外。最重要的是,服務(wù)商可以以任何理由刪除我們的數(shù)據(jù),比如說你的數(shù)據(jù)不合法,說你違反平臺規(guī)定。作為一個普通人,是很難和服務(wù)商對抗的,一些重要的數(shù)據(jù)就這么不知不覺間消失了。
IPFS 可以永久保存數(shù)據(jù)。
嚴(yán)重依賴主干網(wǎng)
現(xiàn)代互聯(lián)網(wǎng)嚴(yán)重依賴主干網(wǎng),一旦主干網(wǎng)發(fā)生故障,就會發(fā)生大規(guī)模服務(wù)中斷和延遲。
IPFS 不依賴主干網(wǎng),即使網(wǎng)絡(luò)不發(fā)達(dá)的地區(qū),IPFS 一樣有很好的表現(xiàn)。
審查機制問題
由于現(xiàn)代互聯(lián)網(wǎng)應(yīng)用都是中心化網(wǎng)絡(luò),也就導(dǎo)致統(tǒng)治者可以讓整個國家的人民都無法訪問某個網(wǎng)站或者 App,在國內(nèi)這種做法也稱為墻。
IPFS 是 IP 是分布式的,幾乎無法被墻。
生態(tài)問題
雖然服務(wù)商支付了大額的費用幫我們搭建服務(wù)器集群為我們提供產(chǎn)品。但是羊毛出在羊身上。它們會通過會員費、廣告費等一些列手段收走我們的錢。甚至為了獲利,喪失底線,濫用用戶隱私,不斷越界,做虛假廣告,惡意彈窗廣告,限制網(wǎng)速擠牙膏,甚至出賣我們的數(shù)據(jù),收取公關(guān)費用刪帖封號等。
除了上面這些問題外,互聯(lián)網(wǎng)安全也是一個令人頭痛的問題。比如各種反人類的驗證碼。
在過去我們沒有選擇,雖然難以忍受,但也只能忍氣吞聲,用著互聯(lián)網(wǎng)在互聯(lián)網(wǎng)上罵互聯(lián)網(wǎng)。但是現(xiàn)在不一樣了,我們有更好的選擇。在 IPFS 世界里,這些問題統(tǒng)統(tǒng)不復(fù)存在。
愛奇藝之前推出過一個小品,笑不活了,用來諷刺現(xiàn)代互聯(lián)網(wǎng)。有人把它搬運到了知乎,感興趣的話可以去看一下:www.zhihu.com/zvideo/1433…。
這是一些我們不想看到的結(jié)果:
IPFS 是什么?
IPFS 有很多定義。
從它的論文來定義,IPFS 是一個按照內(nèi)容索引的、版本化的、點對點的文件系統(tǒng)。
從技術(shù)的角度來定義,IPFS 是一個長滿默克爾樹(merkle-trees)的森林。
從商業(yè)的角度來定義,IPFS 是一個點對點的超文本協(xié)議。
它會讓互聯(lián)網(wǎng)更快、更安全、更開放。
IPFS 介紹
IPFS 是一個縮寫,全稱 Inter Planetary File System,星際文件系統(tǒng)。
它是點對點的星際文件系統(tǒng),從這種角度上來說,它對標(biāo)的是整個互聯(lián)網(wǎng),而不是某個協(xié)議,或者某個文件存儲系統(tǒng)。它更像單一的 BitTorrent 集群(swarm)。
IPFS 作者介紹
作者是 Juan Benet,按照中國人的習(xí)慣音譯為胡安。美國人,1988 年出生,畢業(yè)于斯坦福大學(xué),是一個不折不扣的技術(shù)牛人。
胡安也是 Protocol Labs(協(xié)議實驗室)、IPFS 和 Filecoin 的創(chuàng)始人。
2014 年他創(chuàng)建了 Protocol Labs,同年啟動了 IPFS 項目。
Protocol Labs 是 IPFS 和 Filecoin 的官方組織,它的目標(biāo)是如何構(gòu)建下一代互聯(lián)網(wǎng)。
在 4 年后,也就是 2018 年,他入選了財富雜志的 40 under 40 名單。
IPFS 基于哪些技術(shù)?
IPFS 的核心技術(shù)
IPFS 的核心原則是將所有數(shù)據(jù)作為同一默克爾有向無環(huán)圖(Merkle DAG)的一部分來建模。
它采用但不限于以下技術(shù):
- 基于分布式哈希表 DHT 進(jìn)行內(nèi)容尋址。
- 基于 Git 模型進(jìn)行對象管理。
- 基于默克爾對象關(guān)聯(lián)。
- 基于點對點技術(shù)。
- 基于全球化命名空間 IPNS。
通過以上的各種技術(shù),解決了海量數(shù)據(jù)、高并發(fā)、大吞吐量、文件丟失等一系列問題。
而它做的事情,總結(jié)來說只有三點:規(guī)定了如何上傳文件、如何檢索文件、如何下載文件。
你可能會問,這些技術(shù)大多不都是過去 P2P 領(lǐng)域的技術(shù)嗎?沒錯,IPFS 就是一個 P2P 集大成者,它沒有憑空創(chuàng)造很多技術(shù)或者概念,而是站在了巨人的肩膀上。
為什么是點對點?
現(xiàn)代互聯(lián)網(wǎng)資源,都需要一個 http 地址才能獲取,所以我們?yōu)g覽器的收藏夾里存儲了大量的網(wǎng)址。這種模式就是基于位置的尋址模式。
但仔細(xì)想想,其實我們只在乎資源的內(nèi)容是不是我們想要的,而不在乎資源在哪里。
我們需要的資源,一定也會有其他人需要。如果我們附近有人的電腦上下載了這份資源,我們只需要從這個人的電腦上直接下載就可以了,沒必要再去這份文件的源頭上面獲取。這種模式就是基于內(nèi)容的尋址模式。
點對點的傳輸模式是以上的基礎(chǔ)。
IPFS 的運行原理
我們在 IPFS 上傳文件,需要經(jīng)過如下幾個步驟。
- IPFS 首先會把文件以 256 kb 為一個單位分成若干個小數(shù)據(jù)塊,然后分別打上哈希指紋。哈希指紋是一個唯一的字符串,能和數(shù)據(jù)塊一一對應(yīng)。
- 然后 IPFS 將每兩個小數(shù)據(jù)塊的哈希值再進(jìn)行哈希運算,得到一個新的哈希。它會重復(fù)這個過程,直到將所有的數(shù)據(jù)塊的哈希值全部計算成一個哈希值為止。最終的這個哈希值,就是根哈希(Root Hash),也叫做 CID(Content Identifier)。這個過程就是構(gòu)建 Merkle DAG 的過程,也就是 IPFS 的核心原則。
- IPFS 會去除重復(fù)文件。因為每個文件都會對應(yīng)一個哈希值,哈希值一致就意味著是重復(fù)的文件。IPFS 會去除重復(fù)的文件,不過每個節(jié)點都可以保留這個節(jié)點的備份。
- 每個 IPFS 都會存儲它所需要的數(shù)據(jù),用 DHT 來記錄每個節(jié)點存儲了哪些數(shù)據(jù)。DHT 是內(nèi)容 ID(CID)和用戶 ID(PeerID)的映射。IPFS 會向其他所有在線節(jié)點發(fā)送我們的文件信息,但不是真實的文件,而是一個結(jié)構(gòu)。包含了 CID 和 PeerID。每個節(jié)點都會更新自己的哈希表。所以這個過程非???。就像是程序中的復(fù)制變量地址,而不是復(fù)制實際的變量內(nèi)存空間類似。
- 當(dāng)我們需要獲取某個文件時,會通過文件的哈希值去尋找這個文件在哪些人的電腦上,然后從這些人的電腦進(jìn)行下載。如果我們需要的文件存儲在 100 個人的電腦上,而現(xiàn)在這 100 個人同時在線,那么我們可以同時和這 100 個人進(jìn)行傳輸文件,最后再組合成完整的文件。這樣的下載速度理論上會比從一個人那兒下載快 100 倍。這也就是 IPFS 主要的工作邏輯。
數(shù)據(jù)塊的的數(shù)據(jù)結(jié)構(gòu)大致如下:
data:包含不超過 256 kb 的數(shù)據(jù)。
links:連接到其他數(shù)據(jù)塊。
如果某個文件非常大,那么就會首先把它的內(nèi)容生成 N 個數(shù)據(jù)塊,再從它們上層創(chuàng)建一個數(shù)據(jù)塊,links 指向其他所有數(shù)據(jù)塊。
IPFS 為什么需要 Git?
一旦文件的內(nèi)容發(fā)生了變化,那么原來的哈希值就會失效。所以 IPFS 的文件內(nèi)容是不可變的。
但是如果我們需要更新文件的內(nèi)容怎么辦?
為了追蹤文件的更新,IPFS 引入了版本控制模型,和 Git 基本上是一致的。
我們第一次將文件上傳到 IPFS 時。IPFS 會創(chuàng)建一個 Commit 對象。它的結(jié)構(gòu)大致如下:
- parent:指向上一個 commit,第一次 commit 指向 none。
- object:文件內(nèi)容。
如果我們需要更新文件內(nèi)容,首先把新的文件上傳到 IPFS。
IPFS 會為我們創(chuàng)建新的 Commit 對象,它的 commit 會指向上一個 commit 對象。
這樣我們就可以追蹤文件內(nèi)容的變化了。
IPFS 無法確保始終有資源
如果擁有某個資源的全部節(jié)點全部下線,那么這個資源將會永遠(yuǎn)無法下載。就像 BT 下載時沒有種子。
為了解決這個問題,我們需要有對應(yīng)的方案。
IPFS 有兩個方案。
- 通過激勵機制鼓勵節(jié)點多存儲文件,并且長期在線分享。
- 主動分發(fā)文件,保證始終有在線備份。
而這個激勵機制就是 Filecoin,關(guān)于 Filecoin 我們后面再聊。
IPFS 和區(qū)塊鏈?zhǔn)鞘裁搓P(guān)系?
嚴(yán)格來說兩者沒有關(guān)系,IPFS 并沒有使用任何區(qū)塊鏈技術(shù)。不過區(qū)塊鏈行業(yè)的人依然都知道 IPFS 這個東西,原因是 IPFS 團隊的另一個產(chǎn)品 Filecoin 和區(qū)塊鏈有關(guān)系。
IPFS 和 Filecoin 的關(guān)系
Filecoin 是一個區(qū)塊鏈應(yīng)用,可以簡單理解為一種數(shù)字貨幣。
兩者沒有直接的關(guān)系,只是一個團隊的兩個產(chǎn)品。
不過 IPFS 會為 Filecoin 提供底層支持,F(xiàn)ilecoin 也會為 IPFS 注入更多活力。
我們在 IPFS 的運行原理中講到,我們最終是在其他用戶的電腦上下載的文件,而從其他用戶電腦下載是需要一定網(wǎng)絡(luò)成本的。為了鼓勵大家都給其他人分享資源,IPFS 有一種激勵模型,叫做 BitSwap。
如果我們的電腦有很多空閑的存儲空間,可以通過 Filecoin 存儲資源,分享給別人。而我們給別人分享,會得到 Filecoin 的獎勵。
IPFS 為什么叫 IPFS?
IPFS 叫做星際文件系統(tǒng)。這個名字可不僅僅是因為炫酷、未來感或者科幻感。而是它真的很適合在星際之間傳輸數(shù)據(jù)。
胡安的野心也并不僅僅是取代互聯(lián)網(wǎng)那么簡單。伊隆馬斯克在想辦法讓人類遷移火星,但肯定不會一下子讓全體地球人都移居火星。在未來很可能會存在部分人在地球,部分人在火星的情況。
如果在火星獲取地球的一個網(wǎng)頁,延遲非常久,發(fā)射一次信號需要 4-24 分鐘。一個來回就需要 8-48 分鐘。這種延遲非常難以忍受??墒且坏┯腥我庖粋€火星上的人獲取到了這個網(wǎng)頁,那么其他火星人就可以通過獲取這個人電腦的網(wǎng)頁來避免這個延遲。
所以 IPFS 是一個名副其實的宇宙級傳輸協(xié)議。
IPFS 怎么用?
IPFS 的官網(wǎng)是 ipfs.tech/。
在官網(wǎng)的中間有安裝方式。IPFS 的安裝方式有兩種,桌面客戶端和 CLI。
我們選擇下載桌面客戶端。
我們主要是通過這個客戶端來參與到 IPFS 網(wǎng)絡(luò)中的。
左側(cè)有五個菜單,我分別介紹下它們的作用。
Status
這個頁面是一些總攬數(shù)據(jù),包含了托管數(shù)據(jù)大小、在線節(jié)點、節(jié)點 ID、代理版本、UI 版本、實時帶寬等信息。
Files
在這里可以上傳和刪除文件。
點擊 import 按鈕,可以選擇上傳的文件或者文件夾。
它的上傳速度非???,但是實際上并沒有進(jìn)行文件上傳的操作,它只是把文件進(jìn)行了哈希運算,并且把 CID 和 PID 分發(fā)到當(dāng)前所有在線的節(jié)點中。
上傳完成之后,我們會得到一個 CID。點擊文件的右側(cè)三個點,選擇 Copy CID,就可以將這個 CID 分享給其他 IPFS 用戶了。
其他用戶拿到 CID 后,可以在 IPFS 的客戶端頂部的搜索框中進(jìn)行搜索。
如果能夠搜索到,就可以進(jìn)行預(yù)覽或者下載了。
另外瀏覽器中也可以使用 IPFS 協(xié)議。直接在瀏覽器中輸入 ipfs://{cid},就可以直接打開文件資源。不過這需要在本地啟動 IPFS 客戶端。
如果未來 IPFS 發(fā)展非常順利的話,這項功能可能會被內(nèi)置到瀏覽器中,而不再需要單獨啟動客戶端。
Explore
在這里可以進(jìn)行 CID 搜索,獲取尋址 IPLD 節(jié)點、文件對象、CID 信息等。
Peers
在這里可以看到其他的節(jié)點的信息。
包括節(jié)點所在物理地址、延遲、節(jié)點 ID、傳輸協(xié)議、連接協(xié)議等。
節(jié)點越多,我們的體驗就會越好。
Settings
在這里可以修改分享鏈接的網(wǎng)關(guān)、固定服務(wù)、語言、IPFS JSON 配置等內(nèi)容。
IPFS 的缺點和 Pin 服務(wù)
聊了那么多 IPFS 的優(yōu)點,IPFS 似乎是一個無限趨向完美的技術(shù)。
但它真的是完美無瑕嗎?并不是。IPFS 也有所有 P2P 應(yīng)用都有的一個缺點,那就是如果持有某個文件的所有的節(jié)點全部下線,我們將再也無法下載到這個文件。
這個問題也很好解決,如果我們想要某個文件永遠(yuǎn)都可以被下載,那么就把這個文件存儲在我們本地的 IPFS 系統(tǒng)中,并且我們本地的 IPFS 永遠(yuǎn)在線就可以了。
但是很明顯,讓電腦 24 小時開機的話,那和服務(wù)器沒什么區(qū)別了。
這種事兒在 Web2.0 里面不都是租用某個云服務(wù)去做嗎?Web3 里面同樣有人干這事兒。
這種服務(wù)被稱為 Pin 服務(wù),也就是固定的意思。
Pin 服務(wù)的作用是將某個文件固定在 IPFS 系統(tǒng)中。
Pinata 是一個專門為 NFT 提供 IPFS Pin 服務(wù)的平臺,它也是目前 IPFS 生態(tài)中做的最大的 Pin 服務(wù)平臺之一。
但是 Pinata 并不是免費的,類似的平臺也都這樣,通過某種規(guī)則進(jìn)行收費,有點像 Web2.0 時代的網(wǎng)盤。
有人認(rèn)為這種方案并不是長期可行的方案,因為當(dāng)固定的文件體積非常大了之后,Pinata 的價格也會非常昂貴,目前最高的價格是每月 1000 美元。
其實不難總結(jié),目前的互聯(lián)網(wǎng)世界里,不存在 100% 免費、絕對去中心化、絕對有保證的永久存儲。
如果真的要實現(xiàn)這種設(shè)想,那么需要每個人擁有一個 7*24 小時在線開機的網(wǎng)絡(luò)存儲設(shè)備。有點像某些科幻小說中構(gòu)想的那樣,人類在出生時就會在體內(nèi)植入某個設(shè)備。甚至人類可以改寫基因,讓嬰兒從母體中自行發(fā)育出這種設(shè)備,就像是我們的某個器官一樣,只不過它可以存儲數(shù)據(jù),連接到其他人。
我可以斷言,這個時代終將來臨。而步入這個時代的速度,將會取決于能源、網(wǎng)絡(luò)、磁盤、計算等一系列科技領(lǐng)域的發(fā)展程度。