
這篇文章是“深入理解IPFS”系列文章,該系列文章將幫助各位理解IPFS的基本概念,我們會盡量讓這個系列盡可能的不枯燥。
系列分為六個部分:
● 深入理解IPFS(1/6):初級到高級指南:在這一部分中,我們將嘗試去解釋什么是IPFS,為什么需要它以及我們可以用它來做什么。我們將簡要介紹IPFS的所有的底層組件(后面的部分將對此進行深入分析),了解它們是如何協(xié)同工作的。如果你想要的是一個簡短的總結,而不想了解“引擎蓋下面”有什么,那么這一部分就是為你準備的。
● 深入了解IPFS(2/6):什么是InterPlanetary Linked Data(IPLD)?:在本部分中,我們將更加深入研究基于內容可尋址網(wǎng)絡的數(shù)據(jù)模型。我們將探索IPLD的細節(jié)和規(guī)格,逐漸熟悉IPLD并使用它。
● 深入了解IPFS(3/6): 什么是星際命名系統(tǒng)(IPNS)?:在這一部分中,我們將深入研究分布式網(wǎng)絡的命名系統(tǒng)。我們將研究它的使用規(guī)格以及工作原理,還將把它與今天的命名系統(tǒng)(即DNS)進行比較,列出IPNS與DNS的優(yōu)缺點列表。
●深入理解IPFS(4/6):什么是MultiFormats? 在這一部分中,我們將討論為什么我們需要MultiFormats,它是如何工作的,以及您作為用戶/開發(fā)人員可以用它做什么?
● 深入理解IPFS(5/6):什么是Libp2p? 在這一部分中,我們將研究IPFS的網(wǎng)絡層,以及它對IPFS的巨大貢獻。我們將通過它的工作,規(guī)格和使用方法來解釋,以方便大家更清楚的了解它。

● 深入理解IPFS(6/6):什么是Filecoin? 在這一部分中,我們將討論IPFS的激勵層,Filecoin。我們研究了Filecoin的白皮書和實施規(guī)范,包括DSN Distributed Storage Network(分布式存儲網(wǎng)絡)、復制證明、存儲證明、數(shù)據(jù)存儲市場和檢索市場以及基于Filecoin協(xié)議的智能合約的實現(xiàn)。我們還討論了在白皮書中沒有提到的Filecoin協(xié)議中的一些缺陷,并提出了對Filecoin協(xié)議的一些改進。
希望您可以從本系列中學到很多關于IPFS的知識。讓我們開始吧!
當你問某人關于最新的“復仇者聯(lián)盟”電影時,他們可能不會說“在這個服務器上的這個子域里,然后在這個文件路徑下,斜杠“漫威” 斜杠 “復仇者聯(lián)盟”點 mp4”之類的話。相反,他們會描述視頻的內容:“宇宙的一半被滅霸摧毀……”對于人類來說,這顯然是一種最直觀的思考方式,但這并不是我們今天在網(wǎng)絡上訪問內容的方式。盡管如此,諸如IPFS之類的分布式

協(xié)議還是使用了基于內容尋址(使用文件的內容標記和查找內容)來查找分布式網(wǎng)絡上存儲的內容。
在本文中,我們請英國愛丁堡赫瑞瓦特大學 工程造價碩士周雪松帶我們一起探討一下整個IPFS是如何工作的,涉及到哪些不同的組件,以及它們是如何協(xié)同工作的。為此,我們將向IPFS添加一個文件,然后研究向IPFS添加文件時會發(fā)生些什么。
讓我們首先向IPFS添加一張照片。我們添加這個......
https://unsplash.com/photos/rW-I87aPY5Y
順便提一下,您必須在您的電腦系統(tǒng)上安裝IPFS才能與我一起使用。可以從這里安裝。安裝IPFS之后,必須啟動IPFS守護進程(該軟件與IPFS網(wǎng)絡通信,以便從網(wǎng)絡中添加和檢索數(shù)據(jù))。您可以通過以下方式啟動守護進程 ipfs daemon。
當您將照片添加到IPFS時,會發(fā)生以下情況:

在終端我得到了這個:

你可以在這里看到最后的哈希值:
但是我們沒有看到與中間2個步驟(Raw和Digest)相關的任何內容。這一切都是發(fā)生在“引擎蓋下”的。
當我們添加圖像時,我們將圖像轉換為計算機可以理解的Raw(原始)數(shù)據(jù),F(xiàn)在,它具有內容尋址性(我們在上面討論過),我們要想出一個方法,通過這個方法,我們可以將這個圖像數(shù)據(jù)轉換成一個標簽,這個標簽則需要具有標識它的內容的唯一性。
這就是哈希函數(shù)發(fā)揮作用的地方了。
哈希函數(shù)將數(shù)據(jù)(來自文本、照片、整本圣經(jīng)等的任何數(shù)據(jù))作為輸入,并給出一個輸出(Digest),其輸出必須是惟一的。如果我們改變這個圖像中的一個像素,那么輸出將會不同。這是它的防篡改特性,使IPFS成為一個自我認證的文件系統(tǒng)。因此,您把這張照片轉印給他人,他/她則可以輕松的檢查收到的照片是否被篡改過。
此外,您不能知道輸入是什么(在本例中是貓的照片),而只能看到它的輸出(Digest)。因此,這也確保了內容的安全性。
現(xiàn)在,我們將Raw Data(原始圖像數(shù)據(jù))傳遞到SHA256散列函數(shù)中,并得到唯一的摘要(Digest),F(xiàn)在,我們需要將這個摘要轉換為CID(內容標識符)。當我們試圖取回圖像時,IPFS將搜索這個CID(內容標識符)。為此,IPFS使用了一種稱為Multihash的技術。
要了解Multihash的重要性,請考慮這種情況。
您將一個圖像存儲在互聯(lián)網(wǎng)上,并且您擁有其CID,您可以將其提供給任何想要獲取此圖像的人。但是如果未來您發(fā)現(xiàn)SHA256損壞了(這意味著此過程不再具有防篡改和安全性)并且您希望使用SHA3(以確保防篡改和安全性),那該怎么辦呢?這意味著要改變將照片轉換為CID的整個過程,而之前的CID將毫無用處......
在這種情況下,上面的問題似乎可能只是一個小問題,但您應該知道的是這些哈希函數(shù)可以獲得數(shù)十億美元的資金。所有銀行,國家安全機構等都使用這些哈希函數(shù)來確保其安全地運行。如果沒有它,即使是瀏覽器上每個站點地址旁邊看到的綠色鎖也無法運行。
為了解決這個問題,IPFS使用了多哈希(Multihash)。Multihash允許我們自定義哈希散列。因此,根據(jù)使用的哈希函數(shù)不同,我們可以有多個版本的CID。我們將在本系列的第4部分中詳細討論Multihash,并深入研究Multiformat。

現(xiàn)在我們已經(jīng)將照片添加到IPFS中,但這還不是全部,F(xiàn)在的實際情況是這樣的:
大文件被分塊,散列組織成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": "bu0002u0018Ơ�u0001 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 ��u0010 Ơu0004"
}
IPFS使用IPLD (IPLD使用Merkle DAG或稱作有向無環(huán)圖)去管理所有的塊并將其鏈接到基本的CID。
IPLD (objects)由2個組件組成:
●Data數(shù)據(jù) - 大小小于256 kB的非結構化二進制數(shù)據(jù)的blob (binary large object二進制大對象)。
●Links鏈接 - 結構的數(shù)組。指向其他IPFS對象的鏈接。
每一個IPLD鏈接(在我們的例子中是上面提到的15個鏈接)都有3個部分:
●Name 名稱 -鏈接的名稱。
●Hash 哈希 -鏈接的IPFS對象的哈希值。
●Size大小 - 鏈接的IPFS對象的累積大小,包括跟隨其鏈接的大小。
IPLD是建立在關聯(lián)數(shù)據(jù)的基礎上的,這是分布式網(wǎng)絡社區(qū)中的人們已經(jīng)討論了很長一段時間的事情了。這也是蒂姆·伯納斯-李(Tim Berners-Lee)多年來一直在做的事情,他的新公司Solid正在圍繞著它開展業(yè)務。
使用IPLD還有其他好處。為了解釋這一點,讓我們創(chuàng)建一個名為photos的文件夾,并在其中添加2張照片(貓的照片與相同照片的副本)。

正如您所看到的,這兩張照片都具有相同的哈希值(這證明我沒有更改圖像副本中的任何內容)。這為IPFS 添加了刪除重復數(shù)據(jù)屬性。因此,即使您的朋友將相同的貓照片添加IPFS,他也不會復制圖像。這節(jié)省了大量的存儲空間。
想象一下,如果我把這篇文章存儲在IPFS上,它的每個字母都是分塊的,并且有一個惟一的CID,那么這篇文章就可以由字母(大寫和小寫)、數(shù)字和一些特殊字符組合而成。我們將只存儲每個字母、數(shù)字和字符一次,并根據(jù)數(shù)據(jù)結構中的鏈接重新排列就可以了。
IPFS也有一個命名系統(tǒng),稱為星際命名系統(tǒng)(IPNS)。為了理解它的重要性,讓我們假設您創(chuàng)建了一個網(wǎng)站,并將其托管在某個域名中。對于這個例子,我們將以我的網(wǎng)站為例:
https://vaibhavsaini.com/
如果我想在IPFS上托管它,簡單地在IPFS上添加網(wǎng)站文件夾就可以。為此,我已經(jīng)使用wget下載了網(wǎng)站。如果你使用的是基于Linux的操作系統(tǒng),比如Ubuntu或MAC,那么你可以和我一起試試。
下載本網(wǎng)站(或任何網(wǎng)站):
wget --mirror --convert-links --adjust-extension --page-requisites --no-parenthttps://vaibhavsaini.com
現(xiàn)在添加名為vaibhavsaini.com 的IPFS文件夾:
ipfs add -r vaibhavsaini.com
你會得到如下內容:

我們可以看到,我們的網(wǎng)站現(xiàn)在托管在最后一個CID(即文件夾的CID):
QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB
我們可以使用http協(xié)議訪問該站點:
https://gateway.pinata.cloud/ipfs/QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB/
假設我想在網(wǎng)站上更改我的個人資料的圖片。正如我們上面已經(jīng)了解到的,如果我們改變輸入的內容,我們得到的將是一個不同的Digest,這意味著我最終的“CID”會有所不同。
這意味著每次更新我的網(wǎng)站時都必須要更新哈希,擁有我之前網(wǎng)站鏈接的人(上述網(wǎng)址)都無法看到我的新網(wǎng)站。
這將會導致很嚴重的問題。
為解決這類問題,IPFS使用了星際命名系統(tǒng)(IPNS)。使用IPNS鏈接指向CID。如果我想更新我的網(wǎng)站CID,我只需將新的CID指向相應的IPNS鏈接就可以了(這類似于今天的DNS)。我們將在本系列的第3部分中深入探討IPNS。
但是現(xiàn)在,讓我們?yōu)槲业木W(wǎng)站生成一個IPNS鏈接。
ipfs name publish QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB
這可能需要幾分鐘時間,最后你會得到這樣的輸出:
Published to Qmb1VVr5xjpXHCTcVm3KF3i88GLFXSetjcxL7PQJRviXSy: /ipfs/QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB
現(xiàn)在,如果我想添加新的CID,我將使用相同的命令
ipfs name publish
使用此功能,您可以使用以下鏈接訪問我的網(wǎng)站的更新版本:
https://gateway.pinata.cloud/ipns/Qmb1VVr5xjpXHCTcVm3KF3i88GLFXSetjcxL7PQJRviXSy
但是上面的鏈接地址人類仍然無法方便讀取。我們習慣于這樣的名字:
https://vaibhavsaini.com
在本系列的第3部分中,我們將看到如何將IPNS鏈接到域名,這樣您就可以在
https://vaibhavsaini.com
上看到我的IPFS托管網(wǎng)站。
IPFS也是HTTP協(xié)議的潛在替代品。但是為什么我們要替換HTTP?它似乎工作正常,對吧?我的意思是,你仍然能夠閱讀這篇文章并在Netflix上看電影,而所有的這些都是在使用HTTP協(xié)議。
即使它似乎對我們很好,它也有一些大問題。
假設您正坐在大教室里上課,您的教授要求您訪問特定的網(wǎng)站。在座的每個學生都向該網(wǎng)站提出請求并給予回復。這意味著相同的數(shù)據(jù)被單獨發(fā)送給房間中的每個學生。如果有100名學生,則有100個請求和100個回復。這顯然不是最有效的做事方式。理想情況下,學生將能夠互相使用得到的信息從而來更有效地檢索他們需要的信息。
如果網(wǎng)絡通信線路中存在某些問題并且客戶端無法與服務器連接,則HTTP也會出現(xiàn)大問題。如果ISP發(fā)生中斷,某個國家/地區(qū)阻止了某些內容,或者內容只是被刪除或移動,就會發(fā)生這種情況。這些類型的斷開鏈接幾乎存在于HTTP網(wǎng)絡任何的位置上。
基于位置的HTTP尋址模型鼓勵集中化。將我們所有的數(shù)據(jù)托付給少數(shù)幾個應用程序的確是很方便的,但正因為如此,網(wǎng)絡上的大量數(shù)據(jù)變得骯臟不堪。這使得這些提供者對我們的信息負有巨大的責任和權力。
這就是Libp2p發(fā)揮作用的地方了。Libp2p用于IPFS網(wǎng)絡上的數(shù)據(jù)通信,并發(fā)現(xiàn)其他節(jié)點(計算機或智能手機)。它的工作方式是,如果每臺計算機和智能手機都運行IPFS軟件,那么我們將成為像大型BitTorrent網(wǎng)絡的一部分,每一個系統(tǒng)都可以充當客戶端和服務器。因此,如果100名學生要求相同的網(wǎng)站,他們可以互相請求網(wǎng)站數(shù)據(jù)。這種系統(tǒng)如果大規(guī)模實施,則可以顯著提高上網(wǎng)速度。
好了,我們就講到這里。如果你能堅持到這里,那么你應該得到鼓勵。做得好!
到目前為止,我們已經(jīng)學到了很多關于IPFS的知識。讓我們回顧一下:
● IPFS是基于內容可尋址的。IPFS上的數(shù)據(jù)則是使用CID來進行識別。
● 這些CID對于它引用的數(shù)據(jù)是具有惟一性的。
● IPFS使用哈希函數(shù)作為其防篡改的屬性,這使得IPFS成為了一個自認證的文件系統(tǒng)。
● IPFS使用Multihash,它允許對相同的數(shù)據(jù)使用不同版本的CID(但是這并不意味CID不是唯一的)。如果我們使用相同的哈希函數(shù),那么我們將會得到相同的CID。我們將在本系列的第4部分中對此問題進行更多的討論。
● IPFS使用IPLD來管理和鏈接所有的數(shù)據(jù)塊。
● IPLD使用Merkle DAG(又稱有向無環(huán)圖)數(shù)據(jù)結構來鏈接數(shù)據(jù)塊。
● IPLD還向IPFS添加了重復數(shù)據(jù)刪除特性。
● IPFS使用IPNS將CID鏈接到固定的IPNS鏈接上,這種技術類似于今天的集中式Internet的DNS。
● IPFS使用Libp2p在IPFS網(wǎng)絡上做數(shù)據(jù)通信并發(fā)現(xiàn)其他節(jié)點(計算機和智能手機),這樣可以顯著的提高您的上網(wǎng)速度。

下面是IPFS堆棧的圖解表示:

作者介紹
Vaibhav是TowardsBlockchain的聯(lián)合創(chuàng)始人。麻省理工學院劍橋創(chuàng)新中心孵化啟動者。他是高級區(qū)塊鏈開發(fā)人員,曾參與多個區(qū)塊鏈平臺,包括以太坊,Quorum,EOS,Nano,Hashgraph,IOTA等。
(新媒體責編:syhz0808)
聲明:
1、凡本網(wǎng)注明“人民交通雜志”/人民交通網(wǎng),所有自采新聞(含圖片),如需授權轉載應在授權范圍內使用,并注明來源。
2、部分內容轉自其他媒體,轉載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責。
3、如因作品內容、版權和其他問題需要同本網(wǎng)聯(lián)系的,請在30日內進行。電話:010-67683008
人民交通24小時值班手機:17801261553 商務合作:010-67683008轉602 E-mail:zzs@rmjtzz.com
Copyright 人民交通雜志 All Rights Reserved 版權所有 復制必究 百度統(tǒng)計 地址:北京市豐臺區(qū)南三環(huán)東路6號A座四層
增值電信業(yè)務經(jīng)營許可證號:京B2-20201704 本刊法律顧問:北京京師(蘭州)律師事務所 李大偉
京公網(wǎng)安備 11010602130064號 京ICP備18014261號-2 廣播電視節(jié)目制作經(jīng)營許可證:(京)字第16597號