深入理解IPFS(一):初級到高階全指南
這篇文章是 “深入理解IPFS”系列文章的第一篇,該系列文章將幫助各位理解IPFS的基本概念,我們會盡量讓這個系列儘可能的不枯燥。
系列分為六個部分:
● 深入理解 IPFS(1/6):初級到高階指南:在這一部分中,我們將嘗試去解釋什麼是IPFS,為什麼需要它以及我們可以用它來做什麼。我們將簡要介紹IPFS的所有的底層元件(後面的部分將對此進行深入分析),瞭解它們是如何協同工作的。 如果你想要的是一個簡短的總結,而不想了解 “引擎蓋下面”有什麼,那麼這一部分就是為你準備的。
● 深入瞭解 IPFS(2/6):什麼是InterPlanetary Linked Data(IPLD)? :在本部分中,我們將更加深入研究基於內容可定址網路的資料模型。我們將探索 IPLD的細節和規格,逐漸熟悉IPLD並使用它。
● 深入瞭解 IPFS(3/6): 什麼是星際命名系統 (IPNS)?:在這一部分中,我們將深入研究分散式網路的命名系統。我們將研究它的使用規格以及工作原理,還將把它與今天的命名系統(即DNS)進行比較,列出IPNS與DNS的優缺點列表。
● 深入理解 IPFS(4/6):什麼是MultiFormats? 在這一部分中,我們將討論為什麼我們需要MultiFormats,它是如何工作的,以及您作為使用者/開發人員可以用它做什麼?
● 深入理解 IPFS(5/6):什麼是Libp2p? 在這一部分中,我們將研究IPFS的網路層,以及它對IPFS的巨大貢獻。我們將通過它的工作,規格和使用方法來解釋,以方便大家更清楚的瞭解它。
● 深入理解 IPFS(6/6):什麼是Filecoin? 在這一部分中,我們將討論IPFS的激勵層,Filecoin。我們研究了Filecoin的白皮書和實施規範,包括DSN Distributed Storage Network(分散式儲存網路)、複製證明、儲存證明、資料儲存市場和檢索市場以及基於Filecoin協議的智慧合約的實現。我們還討論了在白皮書中沒有提到的Filecoin協議中的一些缺陷,並提出了對Filecoin協議的一些改進。
希望您可以從本系列中學到很多關於 IPFS的知識。讓我們開始吧!
當你問某人關於最新的 “復仇者聯盟”電影時,他們可能不會說“在這個伺服器上的這個子域裡,然後在這個檔案路徑下,斜槓“漫威” 斜槓 “復仇者聯盟”點 mp4”之類的話。相反,他們會描述視訊的內容:“宇宙的一半被滅霸摧毀……”對於人類來說,這顯然是一種最直觀的思考方式,但這並不是我們今天在網路上訪問內容的方式。儘管如此,諸如IPFS之類的分散式協議還是使用了基於內容定址(使用檔案的內容標記和查詢內容)來查詢分散式網路上儲存的內容。在本文中,我們將探討一下整個IPFS是如何工作的,涉及到哪些不同的元件,以及它們是如何協同工作的。為此,我們將向IPFS新增一個檔案,然後研究向IPFS新增檔案時會發生些什麼。
讓我們首先向 IPFS新增一張照片。我們新增這個......
https://unsplash.com/photos/rW-I87aPY5Y
順便提一下,您必須在您的電腦系統上安裝 IPFS才能與我一起使用。可以從這裡安裝。安裝IPFS之後,必須啟動IPFS守護程序(該軟體與IPFS網路通訊,以便從網路中新增和檢索資料)。您可以通過以下方式啟動守護程序 ipfs daemon
當您將照片新增到 IPFS時,會發生以下情況:
在終端我得到了這個:
你可以在這裡看到最後的雜湊值:
但是我們沒有看到與中間 2個步驟(Raw和Digest)相關的任何內容。這一切都是發生在“引擎蓋下”的。
當我們新增影象時,我們將影象轉換為計算機可以理解的 Raw(原始)資料。現在,它具有內容定址性(我們在上面討論過),我們要想出一個方法,通過這個方法,我們可以將這個影象資料轉換成一個標籤,這個標籤則需要具有標識它的內容的唯一性。
這就是雜湊函式發揮作用的地方了。
雜湊函式將資料 (來自文字、照片、整本聖經等的任何資料)作為輸入,並給出一個輸出(Digest),其輸出必須是惟一的。如果我們改變這個影象中的一個畫素,那麼輸出將會不同。這是它的防篡改特性,使IPFS成為一個自我認證的檔案系統。因此,您把這張照片轉印給他人,他/她則可以輕鬆的檢查收到的照片是否被篡改過。
此外,您不能知道輸入是什麼 (在本例中是貓的照片),而只能看到它的輸出(Digest)。因此,這也確保了內容的安全性。
現在,我們將 Raw Data(原始影象資料)傳遞到SHA256雜湊函式中,並得到唯一的摘要(Digest)。現在,我們需要將這個摘要轉換為CID(內容識別符號)。當我們試圖取回影象時,IPFS將搜尋這個CID(內容識別符號)。為此,IPFS使用了一種稱為Multihash的技術。
要了解 Multihash的重要性,請考慮這種情況。
您將一個影象儲存在網際網路上,並且您擁有其 CID,您可以將其提供給任何想要獲取此影象的人。但是如果未來您發現SHA256損壞了(這意味著此過程不再具有防篡改和安全性)並且您希望使用SHA3(以確保防篡改和安全性),那該怎麼辦呢?這意味著要改變將照片轉換為CID的整個過程,而之前的CID將毫無用處......
在這種情況下,上面的問題似乎可能只是一個小問題,但您應該知道的是這些雜湊函式可以獲得數十億美元的資金。所有銀行,國家安全機構等都使用這些雜湊函式來確保其安全地執行。如果沒有它,即使是瀏覽器上每個站點地址旁邊看到的綠色鎖也無法執行。
為了解決這個問題, IPFS使用了多雜湊(Multihash)。Multihash允許我們自定義雜湊雜湊。因此,根據使用的雜湊函式不同,我們可以有多個版本的CID。我們將在本系列的第4部分中詳細討論Multihash,並深入研究Multiformat。
現在我們已經將照片新增到 IPFS中,但這還不是全部。現在的實際情況是這樣的:
大檔案被分塊,雜湊組織成 IPLD(Merkle DAG)
如果檔案大於 256kb,我們則將它們分解為更小的部分,以便所有部分都等於或小於256kb。我們可以看到照片塊使用的這個命令:
ipfs object get Qmd286K6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u
然後這給了我們 15個塊,每個塊小於256kb。首先將這些塊中的每一個都轉換為摘要(Digest),然後再轉換為CID。
{
"Links": [
{
"Name": "",
"Hash": "QmZ5RgT3jJhRNMEgLSEsez9uz1oDnNeAysLLxRco8jz5Be",
"Size": 262158
},
{
"Name": "",
"Hash": "QmUZvm5TertyZagJfoaw5E5DRvH6Ssu4Wsdfw69NHaNRTc",
"Size": 262158
},
{
"Name": "",
"Hash": "QmTA3tDxTZn5DGaDshGTu9XHon3kcRt17dgyoomwbJkxvJ",
"Size": 262158
},
{
"Name": "",
"Hash": "QmXRkS2AtimY2gujGJDXjSSkpt2Xmgog6FjtmEzt2PwcsA",
"Size": 262158
},
{
"Name": "",
"Hash": "QmVuqvYLEo76hJVE9c5h9KP2MbQuTxSFyntV22qdz6F1Dr",
"Size": 262158
},
{
"Name": "",
"Hash": "QmbsEhRqFwKAUoc6ivZyPa1vGUxFKBT4ciH79gVszPcFEG",
"Size": 262158
},
{
"Name": "",
"Hash": "QmegS44oDgNU2hnD3j8r1WH8xZ2RWfe3Z5eb6aJRHXwJsw",
"Size": 262158
},
{
"Name": "",
"Hash": "QmbC1ZyGUoxZrmTTjgmiB3KSRRXJFkhpnyKYkiVC6PUMzf",
"Size": 262158
},
{
"Name": "",
"Hash": "QmZvpEyzP7C8BABesRvpYWPec2HGuzgnTg4VSPiTpQWGpy",
"Size": 262158
},
{
"Name": "",
"Hash": "QmZhzU2QJF4rUpRSWZxjutWz22CpFELmcNXkGAB1GVb26H",
"Size": 262158
},
{
"Name": "",
"Hash": "QmZeXvgS1NTxtVv9AeHMpA9oGCRrnVTa9bSCSDgAt52iyT",
"Size": 262158
},
{
"Name": "",
"Hash": "QmPy1wpe1mACVrXRBtyxriT2T5AffZ1SUkE7xxnAHo4Dvs",
"Size": 262158
},
{
"Name": "",
"Hash": "QmcHbhgwAVddCyFVigt2DLSg8FGaQ1GLqkyy5M3U5DvTc6",
"Size": 262158
},
{
"Name": "",
"Hash": "QmNsx32qEiEcHRL1TFcy2bPvwqjHZGp62mbcVa9FUpY9Z5",
"Size": 262158
},
{
"Name": "",
"Hash": "QmVx2NfXEvHaS8uaRTYaF4ExeLaCSGpTSDhhYBEAembdbk",
"Size": 69716
}
],
"Data": "\b\u0002\u0018Ơ�\u0001 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 Ơ\u0004"
}
IPFS使用IPLD (IPLD使用Merkle DAG或稱作有向無環圖)去管理所有的塊並將其連結到基本的CID。
IPLD (objects)由2個元件組成:
● Data資料 - 大小小於256 kB的非結構化二進位制資料的blob (binary large object二進位制大物件)。
● Links連結 - 結構的陣列。指向其他IPFS物件的連結。
每一個 IPLD連結(在我們的例子中是上面提到的15個連結)都有3個部分:
● Name 名稱 - 連結的名稱
● Hash 雜湊 - 連結的IPFS物件的雜湊值
● Size大小 - 連結的IPFS物件的累積大小,包括跟隨其連結的大小
IPLD是建立在關聯資料的基礎上的,這是分散式網路社群中的人們已經討論了很長一段時間的事情了。這也是蒂姆·伯納斯-李(Tim Berners-Lee)多年來一直在做的事情,他的新公司Solid正在圍繞著它開展業務。
使用 IPLD還有其他好處。為了解釋這一點,讓我們建立一個名為photos的資料夾,並在其中新增2張照片(貓的照片與相同照片的副本)。
正如您所看到的,這兩張照片都具有相同的雜湊值(這證明我沒有更改影象副本中的任何內容)。這為 IPFS 添加了刪除重複資料屬性。因此,即使您的朋友將相同的貓照片新增到IPFS,他也不會複製影象。這節省了大量的儲存空間。
想象一下,如果我把這篇文章儲存在 IPFS上,它的每個字母都是分塊的,並且有一個惟一的CID,那麼這篇文章就可以由字母(大寫和小寫)、數字和一些特殊字元組合而成。我們將只儲存每個字母、數字和字元一次,並根據資料結構中的連結重新排列就可以了。
IPFS也有一個命名系統,稱為星際命名系統(IPNS)。為了理解它的重要性,讓我們假設您建立了一個網站,並將其託管在某個域名中。對於這個例子,我們將以我的網站為例: https://vaibhavsaini.com/
如果我想在 IPFS上託管它,簡單地在IPFS上新增網站資料夾就可以。為此,我已經使用wget下載了網站。如果你使用的是基於Linux的作業系統,比如Ubuntu或MAC,那麼你可以和我一起試試。
下載本網站 (或任何網站):
wget --mirror --convert-links --adjust-extension --page-requisites --no-parent https://vaibhavsaini.com
現在新增名為 vaibhavsaini.com 的IPFS資料夾:
ipfs add -r vaibhavsaini.com
你會得到如下內容:
我們可以看到,我們的網站現在託管在最後一個 CID(即資料夾的CID):
QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB
我們可以使用 http協議訪問該站點:
https://gateway.pinata.cloud/ipfs/QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB/
假設我想在網站上更改我的個人資料的圖片。正如我們上面已經瞭解到的,如果我們改變輸入的內容,我們得到的將是一個不同的 Digest,這意味著我最終的“CID”會有所不同。
這意味著每次更新我的網站時都必須要更新雜湊,擁有我之前網站連結的人(上述網址)都無法看到我的新網站。
這將會導致很嚴重的問題。
為解決這類問題, IPFS使用了星際命名系統(IPNS)。使用IPNS連結指向CID。如果我想更新我的網站CID,我只需將新的CID指向相應的IPNS連結就可以了(這類似於今天的DNS)。我們將在本系列的第3部分中深入探討IPNS。
但是現在,讓我們為我的網站生成一個 IPNS連結。
ipfs name publish QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB
這可能需要幾分鐘時間,最後你會得到這樣的輸出:
Published to Qmb1VVr5xjpXHCTcVm3KF3i88GLFXSetjcxL7PQJRviXSy: /ipfs/QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB
現在,如果我想新增新的 CID,我將使用相同的命令
ipfs name publish <my_new_CID>
使用此功能,您可以使用以下連結訪問我的網站的更新版本: https://gateway.pinata.cloud/ipns/Qmb1VVr5xjpXHCTcVm3KF3i88GLFXSetjcxL7PQJRviXSy
但是上面的連結地址人類仍然無法方便讀取。我們習慣於這樣的名字 :https://vaibhavsaini.com。 在本系列的第3部分中,我們將看到如何將IPNS連結到域名,這樣您就可以在https://vaibhavsaini.com上看到我的IPFS託管網站。
IPFS也是HTTP協議的潛在替代品 。但是為什麼我們要替換 HTTP?它似乎工作正常,對吧?我的意思是,你仍然能夠閱讀這篇文章並在Netflix上看電影,而所有的這些都是在使用HTTP協議。
即使它似乎對我們很好,它也有一些大問題。
假設您正坐在大教室裡上課,您的教授要求您訪問特定的網站。在座的每個學生都向該網站提出請求並給予回覆。這意味著相同的資料被單獨傳送給房間中的每個學生。如果有 100名學生,則有100個請求和100個回覆。這顯然不是最有效的做事方式。理想情況下,學生將能夠互相使用得到的資訊從而來更有效地檢索他們需要的資訊。
如果網路通訊線路中存在某些問題並且客戶端無法與伺服器連線,則 HTTP也會出現大問題。如果ISP發生中斷,某個國家/地區阻止了某些內容,或者內容只是被刪除或移動,就會發生這種情況。這些型別的斷開連結幾乎存在於HTTP網路任何的位置上。
基於位置的 HTTP定址模型鼓勵集中化。將我們所有的資料託付給少數幾個應用程式的確是很方便的,但正因為如此,網路上的大量資料變得骯髒不堪。這使得這些提供者對我們的資訊負有巨大的責任和權力。
這就是 Libp2p發揮作用的地方了。Libp2p用於IPFS網路上的資料通訊,並發現其他節點(計算機或智慧手機)。它的工作方式是,如果每臺計算機和智慧手機都執行IPFS軟體,那麼我們將成為像大型BitTorrent網路的一部分,每一個系統都可以充當客戶端和伺服器。因此,如果100名學生要求相同的網站,他們可以互相請求網站資料。這種系統如果大規模實施,則可以顯著提高上網速度。
好了,我們就講到這裡。如果你能堅持到這裡,那麼你應該得到鼓勵。做得好!
到目前為止,我們已經學到了很多關於 IPFS的知識。讓我們回顧一下:
● IPFS是基於內容可定址的。IPFS上的資料則是使用CID來進行識別。
● 這些 CID對於它引用的資料是具有惟一性的。
● IPFS使用雜湊函式作為其防篡改的屬性,這使得IPFS成為了一個自認證的檔案系統。
● IPFS使用Multihash,它允許對相同的資料使用不同版本的CID(但是這並不意味CID不是唯一的)。如果我們使用相同的雜湊函式,那麼我們將會得到相同的CID。我們將在本系列的第4部分中對此問題進行更多的討論。
● IPFS使用IPLD來管理和連結所有的資料塊。
● IPLD使用Merkle DAG(又稱有向無環圖)資料結構來連結資料塊。
● IPLD還向IPFS添加了重複資料刪除特性。
● IPFS使用IPNS將CID連結到固定的IPNS連結上,這種技術類似於今天的集中式Internet的DNS。
● IPFS使用Libp2p在IPFS網路上做資料通訊並發現其他節點(計算機和智慧手機),這樣可以顯著的提高您的上網速度。
下面是 IPFS堆疊的圖解表示:
原文作者:vasa
原文連結:https://hackernoon.com/understanding-ipfs-in-depth-1-5-a-beginner-to-advanced-guide-e937675a8c8a
翻譯:星際大陸海外團隊