什麼是IPFS?看完這篇文章你就懂了

買賣虛擬貨幣

ipfs本質上是一種內容可定址、版本化、點對點超媒體的分散式儲存、傳輸協議,目標是補充甚至取代過去使用的超文字媒體傳輸協議(HTTP)。

想象擁有ipfs協議的網際網路世界

ipfs網路裡的檔案,會被賦予一個雜湊值,是獨一無二的,根據檔案內容被計算出來的。這樣做為了檔案不會被重複儲存,大大降低儲存成本,減少儲存資源浪費。

ipfs網路可以防止自然災害對檔案的損壞,分佈全球不同地方的備份,緊急恢復功能。ipfs可以抵擋DDoS攻擊,甚至能抵擋量子計算的攻擊。

如果你儲存的檔案是不想別人看到的檔案,在存入ipfs之前對檔案進行加密即可,這樣即使別人擁有此檔案的雜湊值,還需要私鑰才能檢視資料。

ipfs的加密性,永久性儲存,會滋生一些灰色產業進來,例如釋出各種無法管制的言論,盜版猖獗等問題。

ipfs能做些什麼

   個人,公司檔案可以存到上面。

資料儲存。它能夠極大的降低資料儲存的成本,提升資料下載速度。

掛載個人同步的資料夾,可以自動進行版本管理,自動備份。也就意味著未來我們將擁有無限空間的網盤,不用擔心資料丟失,不用擔心隱私洩露(非對稱加密)。

   帶版本控制的軟體包管理系統。  

   虛擬機器的根檔案系統。

ipfs作為虛擬機器的引導檔案系統:線上作業系統。

作為資料庫:應用可以直接操作ipfs的Merkle DAG資料結構,並且可以使用ipfs的版本控制,快取。試想一下我們的資料庫直接存在ipfs的檔案系統是什麼體驗嗎? 自動備份,永不丟失,安全加密,無限空間,高速連線,想想就美好。

加密通訊平臺,誰都別想竊聽訊息通訊了。

作為加密CDN,作為web的CDN,CDN功能全包了。

永久網路,不存在不能訪問的連結,跟404說再見。

ipfs是開放的,它為所有的區塊鏈準備好了資料儲存結構,可以連結到不同的區塊鏈專案,這就是為什麼那麼多的白皮書提到要和ipfs連結,ipfs將作為區塊鏈的基礎設施存在。

ipfs在目前專案上的小試牛刀

   又名沙:基於以太坊和ipfs的社交網路

亞歷山大:去中心化的內容釋出平臺

Arbore:朋友之間的檔案共享系統,相信很快就可以拋棄某度的雲盤了

   dtube:利用ipfs作為儲存的影片分享網站

   git-ipfs-rehost:可以把github上的專案儲存到ipfs上

星際維基:建立在ipfs上的wiki(土耳其封鎖了維基,藉助於ipfs,現在已經恢復了訪問)

   ipfs-search:基於ifp來說的搜尋引擎

   ipfs-share:基於ifp來說的檔案分享

ipfs.pics:基於ifp來說的圖片分享網站

軌道:基於ifp來說的分散式聊天工具

Partyshare:一個簡單的檔案共享系統

computes.io:基於ipfs的分散式計算機(這個牛,把世界上的計算資源收集起來,構建一個巨大的分散式計算機)

OpenBazaar:openbazaar是一個去中心化的淘寶,口號是“買賣自由/自由買賣”,問題是一旦使用者停止執行軟體,商店就下線了,藉助於ipfs,openbazaar2.0打造一個離線商店。

Ubuntu:著名的linux發行版Ubuntu本正在計算把發行版本轉移到ipfs上來,目前正在討論方案。火狐瀏覽器:支援ipfs在內的分散式協議

ipfs工作原理

每個檔案及其其包含的所有資料塊,都會轉換為一個雜湊字串,稱為雜湊指紋。

每個節點維護一張DHT(分散式雜湊表),包含相應資料塊與目標節點的對應對映關係。整個雜湊表被組織成二叉樹,平均查詢聯絡節點的複雜度是O(log2N)。例如要查詢10000萬節點只需20跳。

基於內容定址而非域名定址。只需要透過檔案或資料塊的雜湊值,ipfs便可自動在全網節點中找到擁有這些資料塊的節點,並從節點上拉去資料。

ipfs使用一個叫IPNS的分散式命名系統,將難於記憶的資料雜湊值對映為易於記憶的字串。這可以類比於域名與IP地址的對映關係。

ipfs技術細節

    域名定址和內容定址

HTTP協議使用的域名定址,最終會對映到最底層,找到某個域名所對應的IP地址下的某個主機,以及某個檔案目錄的某個檔案。它不關心是否存在相同的檔案,但內容定址會透過唯一的標識去訪問,並且提前檢驗這個標識是否已經被儲存過。如果被儲存過,直接從其它節點讀取它,不需要重複儲存,一定意義上節約了空間。

   ipfs架構

ipfs至少有八層子協議棧,從上至下為身份、網路、路由、交換、物件、檔案、命名、應用,每個協議棧各司其職,又互相搭配。

身份層和路由層可以一起解釋。對等節點身份資訊的生成以及路由規則是透過Kademlia協議生成制定,KAD協議實質是構建了一個分散式鬆散Hash表,簡稱DHT,每個加入這個DHT網路的人都要生成自己的身份資訊,然後才能透過這個身份資訊去負責儲存這個網路裡的資源資訊和其他成員的聯絡資訊。

網路層比較核心,使用的LibP2P可以支援任意傳輸層協議。NAT技術能讓內網中的裝置共用同一個外網IP,我們都體驗過的家庭路由器就是這個原理。

交換層,是類似迅雷這樣的BT工具。ipfs團隊把BitTorrent進行了創新,叫作Bitswap,它增加了信用和帳單體系來激勵節點去分享,猜測FileCoin有很大概率是基於Bitswap,使用者在Bitswap裡增加資料會增加信用分,分享得越多信用分越高。如果使用者只去檢索資料而不存資料,信用分會越來越低,其它節點會在嵌入連線時優先選擇信用分高的。

物件層和檔案層適合結合來談,它們管理的是ipfs上80%的資料結構,大部分資料物件都是以MerkleDag的結構存在,這為內容定址和去重提供了便利。檔案層是一個新的資料結構,和DAG並列,採用Git一樣的資料結構來支援版本快照。

命名層具有自我驗證的特性(當其他使用者獲取該物件時,使用指紋公鑰進行驗籤,即驗證所用的公鑰是否與NodeId匹配,這驗證了使用者釋出物件的真實性,同時也獲取到了可變狀態),並且加入了IPNS這個巧妙的設計來使得加密後的DAG物件名可定義,增強可閱讀性。

最後是應用層,ipfs核心價值就在於上面執行的應用程式,我們可以利用它類似CDN的功能,在成本很低的頻寬下,去獲得想要的資料,從而提升整個應用程式的效率。

ipfs的模組化設計

   ipfs

   Filecoin

libp2p

IPLD

Multiformats

image

libp2p

在過去的相當長時間裡,開發者構建一個p2p網路並不是一件容易的事情。複雜的網路環境、各種各樣的通訊協議和網路裝置的存在使得建立大規模的點對點網路變得複雜並且困難。ipfs團隊將點對點(peer-to-peer)網路的網路層從ipfs工程裡面分離出來,形成一個獨立的專案,這就是libp2p。該專案不僅可以供ipfs使用,也可以提供其它專案使用,作為一個p2p工程的底層協議存在。

libp2p的主要功能是

   發現節點

連線節點

發現資料

傳輸資料

lPLD

IPLD定義了基於內容定址的統一資料結構型別。它是一個轉換器,可以把現有的異構的資料結構(基於內容定址)統一成一種格式,方便不同系統之間的資料交換和互操作。IPLD的組成:

CID(Self-describing content-addressed identifiers for distributed systems):基於內容定址的自我描述標識

IPLD tree:基於JSON、Protobuf和路徑導航的跨協議的資料模型

IPLD Resolvers:IPLD轉換器,可以新增新的協議到IPLD裡面

Multiformats

該專案的是一系列協議的集合,它在現有協議基礎上對值(值:通常是具有某一項表達意義的)進行自我描述改造,即從值上就可以知道該值是如何產生的。當前multiformats協議裡面包含以下協議:

   multihash - self-describing hashes

multiaddr - self-describing network addresses

multibase - self-describing base encodings

multicodec - self-describing serialization

multistream - self-describing stream network protocols

multigram (WIP) - self-describing packet network protocols

ipfs設計

ipfs是一個分散式檔案系統,它綜合了以前的對等系統的成功想法,包括DHT,BitTorrent,Git和SFS。ipfs的貢獻是簡化,發展和將成熟的技術連線成一個單一的內聚系統,大於其部分的總和。ipfs提供了編寫和部署應用程式的新平臺,以及一個新的分發系統版本化大資料。ipfs甚至可以演進網路本身。ipfs是點對點的;沒有節點是特權的。ipfs節點將ipfs物件儲存在本地儲存中。節點彼此連線並傳輸物件。這些物件表示檔案和其他資料結構。ipfs協議分為一組負責不同功能的子協議:

1.身份- 管理節點身份生成和驗證

2.網路- 管理與其他對等體的連線,使用各種底層網路協議。可配置的。

3.路由- 維護資訊以定位特定的對等體和物件。相應本地和遠端查詢。預設為DHT,但可更換。

4.交換- 一種支援有效塊分配的新型塊交易協議(BitSwap)。模擬市場,弱化資料複製。貿易策略可替換。

5.物件- 具有連結的內容定址不可更改物件的Merkle DAG。用於表示任意資料結構,例如檔案層次和通訊系統。

6.檔案- 由git啟發的版本化檔案系統層次結構。

    7.命名- 自我認證的可變名稱系統。

身份

節點由NodeId標識,這是使用S / Kademlia的靜態加密難題[1]建立的公鑰的密碼雜湊。節點儲存其公私鑰(用密碼加密)。使用者可以在每次啟動時自由地設定一個“新”節點身份,儘管這會損失積累的網路利益。激勵節點保持不變。

首次連線時,對等體交換公鑰,並檢查:hash(other.PublicKey)等於other.NodeId。如果沒有,則連線被終止

網路

ipfs節點與數百個其他節點進行定期通訊網路中的節點,可能跨越廣域網路。ipfs網路堆疊功能:

   傳輸層:ipfs可以使用任何傳輸協議。

可靠性:如果底層網路不提供可靠性,ipfs可使用uTP(LEDBAT)或SCTP來提供可靠性。

可連線性:ipfs還可以使用ICE NAT穿牆打洞技術。

完整性:可以使用雜湊校驗和來檢查郵件的完整性。

可驗證性:可以使用傳送者的公鑰使用HMAC來檢查訊息的真實性。

路由

ipfs節點需要一個路由系統, 這個路由系統可用於查詢:

   其他同伴的網路地址

   專門用於服務特定物件的對等節點

ipfs使用基於S / Kademlia和Coral的DSHT。在物件大小和使用模式方面,ipfs 類似於Coral 和Mainline,因此,ipfs DHT根據其大小對儲存的值進行區分。小的值(等於或小於1KB)直接儲存在DHT上。對於更大的值,DHT只儲存值索引,這個索引就是一個對等節點的NodeId, 該對等節點可以提供對該型別的值的具體服務。DSHT的介面如下:

   type ipfsRouting interface {

FindPeer(node NodeId) // 獲取特定NodeId的網路地址。

SetValue(key []bytes, value []bytes) // 往DHT儲存一個小的後設資料。

   GetValue(key []bytes) // 從DHT獲取後設資料。

ProvideValue(key Multihash) // 宣告這個節點可一個提供一個大的資料。

FindValuePeers(key Multihash, min int) // 獲取服務於該大資料的節點。}

塊交換- BitSwap協議

ipfs 中的BitSwap協議受到BitTorrent 的啟發,透過對等節點間交換資料塊來分發資料的。像BT一樣, 每個對等節點在下載的同時不斷向其他對等節點上傳已下載的資料。和BT協議不同的是,BitSwap 不侷限於一個torrent檔案中的資料塊。BitSwap 協議中存在一個永久的市場。這個市場包括各個節點想要獲取的所有塊資料。而不管這些塊是哪些如.torrent檔案中的一部分。這些快資料可能來自檔案系統中完全不相關的檔案。這個市場是由所有的節點組成的。雖然易貨系統的概念意味著可以建立虛擬貨幣,但這將需要一個全域性分類賬本來跟蹤貨幣的所有權和轉移。這可以實施為BitSwap策略。

在基本情況下,BitSwap節點必須以塊的形式彼此提供直接的值。只有當跨節點的塊的分佈是互補的時候,各取所需的時候,這才會工作的很好。通常情況並非如此,在某些情況下,節點必須為自己的塊而工作。在節點沒有其對等節點所需的(或根本沒有的)情況下,它會更低的優先順序去尋找對等節點想要的塊。這會激勵節點去快取和傳播稀有片段, 即使節點對這些片段不感興趣。

BitSwap信用

這個協議必須帶有激勵機制, 去激勵節點去seed 其他節點所需要的塊,而它們本身是不需要這些塊的。因此,BitSwap的節點很積極去給對端節點傳送塊,期待獲得報酬。但必須防止水蛭攻擊(空負載節點從不共享塊),一個簡單的類似信用的系統解決了這些問題:

對等節點間會追蹤他們的平衡(透過位元組認證的方式)。

隨著債務增加而概率降低,對等者概率的向債務人傳送塊。

BitSwap的策略

BitSwap 對等節點採用很多不同的策略,這些策略對整個資料塊的交換執行力產生了不同的巨大影響。BitSwap 對等體可以類似地實現一系列的策略(良好和惡意)。對於功能的選擇,應該瞄準:

   為整個交易和節點最大化交易能力。

為了防止空負載節點利用和損害交易。

高效抵制未知策略。

對可信任的對等節點更寬容。

當節點負債比例超過節點已建立信貸的兩倍,傳送到負債節點的概率就會急速下降。負債比是信任的衡量標準:對於之前成功的互換過很多資料的節點會寬容債務,而對不信任不瞭解的節點會嚴格很多。

給與那些創造很多節點的攻擊者(sybill 攻擊)一個障礙。

保護了之前成功交易節點之間的關係,即使這個節點暫時無法提供資料。

最終阻塞那些關係已經惡化的節點之間的通訊,直到他們被再次證明。

BitSwap賬本

BitSwap節點儲存了一個記錄與所有其他節點之間交易的賬本。這個可以讓節點追蹤歷史記錄以及避免被篡改。當啟用了一個連結,BitSwap節點就會互換它們賬本資訊。如果這些賬本資訊並不完全相同,分類賬本將會重新初始化, 那些應計信貸和債務會丟失。惡意節點會有意去失去“這些“賬本, 從而期望清除自己的債務。節點是不太可能在失去了應計信託的情況下還能累積足夠的債務去授權認證。夥伴節點可以自由的將其視為不當行為, 拒絕交易。

Merkle DAG

DHT和BitSwap允許ipfs構造一個龐大的點對點系統用來快速穩定的分發和儲存。最主要的是,ipfs建造了一個Merkle DAG,一個無迴路有向圖,物件之間的links都是hash加密嵌入在源目標中。這是Git資料結構的一種推廣。

   Merkle DAG擁有如下功能:

內容定址:使用多重雜湊來唯一識別一個資料塊的內容,包括links。

防篡改:可以方便的檢查雜湊值來確認資料是否被篡改。

去重:由於內容相同的資料塊雜湊是相同的,可以很容易去掉重複的資料,節省儲存空間。

ipfs透過Merkle DAG讓應用完全控制物件的資料結構,應用可以隨意定義自己的data型別和結構,甚至可以是一些ipfs系統無法理解的資料結構,靈活度非常的大。

檔案

ipfs在Merkle DAG上還為模型化版本檔案系統定義了一組物件。這個物件模型與Git比較相似:

   Block:一個可變大小的資料塊

List:塊或者其他連結串列的集合

Tree:塊,連結串列,或者其他樹的集合

Commit:樹在版本歷史記錄中的一個快照

檔案物件:BLOB

blob物件代表一個檔案且包含一個可定址的資料單元,ipfs的blobs就像Git的blobs或者檔案系統資料塊。它們儲存使用者的資料。需要留意的是ipfs檔案可以使用lists或者blobs來表示。Blobs沒有links。

檔案物件: LIST

List物件代表著由幾個ipfs的blobs連線成的大檔案或者重複資料刪除檔案。Lists包含著有序的blob序列或list物件。從某種程度上而言,ipfs的list函式就像一個間接塊的檔案系統。

檔案物件:TREE

ipfs中的tree物件與Git中相似,它代表著一個目錄,一個名字到雜湊值的對映。

檔案物件:COMMIT

ipfs中的commit物件代表任何物件在版本歷史記錄中的一個快照。與Git中類似,但是它能夠表示任何型別的物件。它同樣link著發起物件。

IPNS:命名以及易變狀態

目前為止,ipfs桟形成了一個對等塊交換組成一個內容可定址的DAG物件。這提供了釋出和獲取不可改變的物件。這甚至可以跟蹤這些物件的版本歷史記錄。但是,這裡有一個關鍵成分遺漏了:易變的命名。沒有這個,傳送ipfs的links,所有新內容的通訊肯定都會有所偏差。現在所需就是能有某些方法可以獲取相同路徑的的易變狀態。

自我認證認檔案系統-SFS

使用SFS中的命名方案,給我們提供了一個種可以構建自我認證名稱的方法,在一個加密指定的全域性名稱空間中,這是可變的。ipfs的方案如下:

   在ipfs中:NodeId = hash(node.PubKey)

給每個使用者分配一個可變的名稱空間,在此路徑下:/ipns/

一個使用者可以在此路徑下釋出一個用自己私鑰簽名的物件,比如說:

/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/當其他使用者獲取物件時,他們可以檢測簽名是否與公鑰和NodeId匹配。

這個驗證了使用者釋出物件的真實性,達到了可變狀態的獲取。

提出了兩個引人注目的實現:分散式信任鏈,和平等共享的全域性名稱空間。SFS引入了一種自我建構技術—註冊檔案:定址遠端檔案系統使用以下格式:

/sfs/:Location:代表的是服務網路地方HostID = hash(public_key || Location)

因此SFS檔案系統的名字認證了它的服務,使用者可以透過服務提供的公鑰來驗證,協商一個共享的私鑰,保證所有的通訊。所有的SFS例項都共享了一個全域性的名稱空間,這個名稱空間的名稱分配是加密的,不被任何中心化的body控制。

人類友好名稱

IPNS的確是一個分配和在分配名稱的好方法,但是對使用者卻不是十分友好的,因為它使用很長的雜湊值作為名稱,眾所周知這樣的名稱很難被記住。IPNS足夠應付URLs,但對於很多線下的傳輸工作就沒有這麼好用了。因此,ipfs使用下面的技術來增加IPNS的使用者友好度。

對等節點Links被SFS所鼓舞,使用者可以直接將其他使用者的物件link到自己的物件上(命令空間,家目錄等等)。這有一個好處就是建立了一個可信任的Web(也支援老的真實性認證模型):

   Alice links 到Bob上

ipfs link //friends/bob /

   Eve links 到Alice上

ipfs link /<eve-pk-hash/friends/alice /

# Eve 也可以訪問Bob

/<eve-pk-hash/friends/alice/friends/bob

# 訪問Verisign認證域

//foo.com

   DNS TXT IPNS 記錄

如果/ipns/是一個有效的域名稱,ipfs會在DNS TXT記錄中查詢關鍵的ipns。ipfs會將查詢到的值翻譯為一個物件的雜湊值或者另一個ipns的路徑:

# DNS TXT 記錄

ipfs.benet.ai. TXT "ipfs=XLF2ipQ4jD3U ..."

# 表現為符號連結

ln -s /ipns/XLF2ipQ4jD3U /ipns/fs.benet.ai

Filecoin協議是如何執行的?

分散式雜湊表(DHT)

分散式雜湊表被廣泛用於協調和維護關於對等系統的後設資料。比如,MainlineDHT是一個去中心化雜湊表,他可追蹤查詢所有的對等節點。

Kademlia DHT

透過大量網路進行高效查詢:查詢平均聯絡人O(log2N)節點。(例如,20跳10萬個節點的網路)

低協調開銷:最佳化數量的控制訊息傳送到其他節點。

   抵抗各種攻擊,喜歡長壽節點。

   在對等應用中廣泛使用。

Coral DSHT

雖然一些對等檔案系統直接在DHT中儲存資料塊,這種“資料儲存在不需要的節點會亂費儲存和貸款”。Coral DSHT擴充套件了Kademlia三個特別重要的方式:

Kademlia在ids為“最近”(使用XOR-distance)的關鍵節點中儲存值,不考慮應用程式資料的區域性性,忽略“遠”可能已經擁有資料的節點,並強制“最近”節點儲存它,無論它們是否需要,這浪費了大量的儲存和頻寬。相反,Coral儲存了地址,該地址的對等節點可以提供相應的資料塊。

Coral將DHT API從get_value(key)換成了get_any_values(key)(DSHT中的“sloppy”)中。這仍然是因為Coral使用者只需要一個(工作)的對等體,而不是完整的列表。作為回報,Coral可以僅將子集分配到“最近”的節點,避免熱點(當金鑰變得流行時,過載所有最近的節點)。

另外,Coral根據區域和大小組織了一個稱為群集的獨立DSHT層次結構。這使得節點首先查詢其區域中的對等體,“查詢附近的資料而不查詢遠端節點”[5]並大大減少查詢的延遲。

S/Kademlia DHT

S/Kademlia擴充套件了Kademlia,用於防止惡意的攻擊,有如下兩方面的方法:

S/Kad 提供了方案來保證NodeId的生成已經防止Sybill攻擊。它需要節點產生PKI公私鑰對。從中匯出他們的身份,並彼此間簽名。一個方案使用POW工作量證明,使得生成Sybills成本高昂。

S/Kad 節點在不相交的路徑上查詢直, 即使網路中存在大量的不誠實節點,也能確保誠實節點可以互相連結。即使網路中存在一半的不誠實節點,S/Kad 也能達到85%的成功率。

塊交換- BitTorrent

BitTorrent是一個廣泛成功應用的點對點共享檔案系統,它可以在存在不信任的對等節點(群集)的協作網路中分發各自的檔案資料片。從BitTorrent和它的生態系統的關鍵特徵,ipfs得到啟示如下:

BitTorrent的資料交換協議使用了一種bit-for-bat的激勵策略,可以獎勵對其他方面做貢獻的節點,懲罰只榨取對方資源的節點。

BitTorrent對等體跟蹤檔案的可用性,優先傳送稀有片段。這減輕了seeds節點的負擔, 讓non-seeds節點有能力互相交易。

對於一些剝削頻寬共享策略,BitTorrent的標準tit-for-tat策略是非常脆弱的。然而,PropShare是一種不同的對等頻寬分配策略, 可以更好的抵制剝削戰略, 提高群集的表現。

版本控制系統-Git

版本控制系統提供了對隨時間變化的檔案進行建模的設施,並有效地分發不同的版本。流行版本控制系統Git提供了強大的Merkle DAG物件模型,以分散式友好的方式捕獲對檔案系統樹的更改。

不可更改的物件表示檔案(blob),目錄(樹)和更改(提交)。

   透過加密hash物件的內容,讓物件可定址。

連結到其他物件是嵌入的,形成一個Merkle DAG。這提供了很多有用的完整和work-flow屬性。

很多版本後設資料(分支,標示等等)都只是指標引用,因此建立和更新的代價都小。

   版本改變只是更新引用或者新增物件。

分散式版本改變對其他使用者而言只是轉移物件和更新遠端引用。

   Filecoin協議裡有兩個概念:

1、儲存市場

2、檢索市場

普通使用者在ipfs網路儲存資料也可能是免費的,只是這些費用轉嫁到那些基於ipfs協議的應用開發商上,他們會用另外一種方式薅你身上的羊的毛。

Filecoin的共識機制(儲存證明PoSt)

Filecoin的共識機制相對環保,淘寶店主(礦工)發完貨(完成儲存),買家是要確認收貨(確認礦工完成儲存),這裡的“確認礦工完成儲存”,就是Filecoin的共識機制(儲存證明,PoSt),這個“確認礦工完成儲存”會一直存在於Filecoin網路中,使用者可以隨時檢視。

Filecoin把礦工在網路中的當前儲存資料相對於整個網路的儲存比例轉化為礦工投票權,利用儲存證明(PoSt)來產生共識,不用像比特幣那樣浪費計算資源和能源,並且能激勵礦工投入更多的硬碟為網路做貢獻。

#硬碟挖礦#  #硬碟狗社羣#

什麼是IPFS?看完這篇文章你就懂了

ipfs本質上是一種內容可定址、版本化、點對點超媒體的分散式儲存、傳輸協議,目標是補充甚至取代過去使用的超文字媒體傳輸協議(HTTP)。

想象擁有ipfs協議的網際網路世界

ipfs網路裡的檔案,會被賦予一個雜湊值,是獨一無二的,根據檔案內容被計算出來的。這樣做為了檔案不會被重複儲存,大大降低儲存成本,減少儲存資源浪費。

ipfs網路可以防止自然災害對檔案的損壞,分佈全球不同地方的備份,緊急恢復功能。ipfs可以抵擋DDoS攻擊,甚至能抵擋量子計算的攻擊。

如果你儲存的檔案是不想別人看到的檔案,在存入ipfs之前對檔案進行加密即可,這樣即使別人擁有此檔案的雜湊值,還需要私鑰才能檢視資料。

ipfs的加密性,永久性儲存,會滋生一些灰色產業進來,例如釋出各種無法管制的言論,盜版猖獗等問題。

ipfs能做些什麼

   個人,公司檔案可以存到上面。

資料儲存。它能夠極大的降低資料儲存的成本,提升資料下載速度。

掛載個人同步的資料夾,可以自動進行版本管理,自動備份。也就意味著未來我們將擁有無限空間的網盤,不用擔心資料丟失,不用擔心隱私洩露(非對稱加密)。

   帶版本控制的軟體包管理系統。  

   虛擬機器的根檔案系統。

ipfs作為虛擬機器的引導檔案系統:線上作業系統。

作為資料庫:應用可以直接操作ipfs的Merkle DAG資料結構,並且可以使用ipfs的版本控制,快取。試想一下我們的資料庫直接存在ipfs的檔案系統是什麼體驗嗎? 自動備份,永不丟失,安全加密,無限空間,高速連線,想想就美好。

加密通訊平臺,誰都別想竊聽訊息通訊了。

作為加密CDN,作為web的CDN,CDN功能全包了。

永久網路,不存在不能訪問的連結,跟404說再見。

ipfs是開放的,它為所有的區塊鏈準備好了資料儲存結構,可以連結到不同的區塊鏈專案,這就是為什麼那麼多的白皮書提到要和ipfs連結,ipfs將作為區塊鏈的基礎設施存在。

ipfs在目前專案上的小試牛刀

   又名沙:基於以太坊和ipfs的社交網路

亞歷山大:去中心化的內容釋出平臺

Arbore:朋友之間的檔案共享系統,相信很快就可以拋棄某度的雲盤了

   dtube:利用ipfs作為儲存的影片分享網站

   git-ipfs-rehost:可以把github上的專案儲存到ipfs上

星際維基:建立在ipfs上的wiki(土耳其封鎖了維基,藉助於ipfs,現在已經恢復了訪問)

   ipfs-search:基於ifp來說的搜尋引擎

   ipfs-share:基於ifp來說的檔案分享

ipfs.pics:基於ifp來說的圖片分享網站

軌道:基於ifp來說的分散式聊天工具

Partyshare:一個簡單的檔案共享系統

computes.io:基於ipfs的分散式計算機(這個牛,把世界上的計算資源收集起來,構建一個巨大的分散式計算機)

OpenBazaar:openbazaar是一個去中心化的淘寶,口號是“買賣自由/自由買賣”,問題是一旦使用者停止執行軟體,商店就下線了,藉助於ipfs,openbazaar2.0打造一個離線商店。

Ubuntu:著名的linux發行版Ubuntu本正在計算把發行版本轉移到ipfs上來,目前正在討論方案。火狐瀏覽器:支援ipfs在內的分散式協議

ipfs工作原理

每個檔案及其其包含的所有資料塊,都會轉換為一個雜湊字串,稱為雜湊指紋。

每個節點維護一張DHT(分散式雜湊表),包含相應資料塊與目標節點的對應對映關係。整個雜湊表被組織成二叉樹,平均查詢聯絡節點的複雜度是O(log2N)。例如要查詢10000萬節點只需20跳。

基於內容定址而非域名定址。只需要透過檔案或資料塊的雜湊值,ipfs便可自動在全網節點中找到擁有這些資料塊的節點,並從節點上拉去資料。

ipfs使用一個叫IPNS的分散式命名系統,將難於記憶的資料雜湊值對映為易於記憶的字串。這可以類比於域名與IP地址的對映關係。

ipfs技術細節

    域名定址和內容定址

HTTP協議使用的域名定址,最終會對映到最底層,找到某個域名所對應的IP地址下的某個主機,以及某個檔案目錄的某個檔案。它不關心是否存在相同的檔案,但內容定址會透過唯一的標識去訪問,並且提前檢驗這個標識是否已經被儲存過。如果被儲存過,直接從其它節點讀取它,不需要重複儲存,一定意義上節約了空間。

   ipfs架構

ipfs至少有八層子協議棧,從上至下為身份、網路、路由、交換、物件、檔案、命名、應用,每個協議棧各司其職,又互相搭配。

身份層和路由層可以一起解釋。對等節點身份資訊的生成以及路由規則是透過Kademlia協議生成制定,KAD協議實質是構建了一個分散式鬆散Hash表,簡稱DHT,每個加入這個DHT網路的人都要生成自己的身份資訊,然後才能透過這個身份資訊去負責儲存這個網路裡的資源資訊和其他成員的聯絡資訊。

網路層比較核心,使用的LibP2P可以支援任意傳輸層協議。NAT技術能讓內網中的裝置共用同一個外網IP,我們都體驗過的家庭路由器就是這個原理。

交換層,是類似迅雷這樣的BT工具。ipfs團隊把BitTorrent進行了創新,叫作Bitswap,它增加了信用和帳單體系來激勵節點去分享,猜測FileCoin有很大概率是基於Bitswap,使用者在Bitswap裡增加資料會增加信用分,分享得越多信用分越高。如果使用者只去檢索資料而不存資料,信用分會越來越低,其它節點會在嵌入連線時優先選擇信用分高的。

物件層和檔案層適合結合來談,它們管理的是ipfs上80%的資料結構,大部分資料物件都是以MerkleDag的結構存在,這為內容定址和去重提供了便利。檔案層是一個新的資料結構,和DAG並列,採用Git一樣的資料結構來支援版本快照。

命名層具有自我驗證的特性(當其他使用者獲取該物件時,使用指紋公鑰進行驗籤,即驗證所用的公鑰是否與NodeId匹配,這驗證了使用者釋出物件的真實性,同時也獲取到了可變狀態),並且加入了IPNS這個巧妙的設計來使得加密後的DAG物件名可定義,增強可閱讀性。

最後是應用層,ipfs核心價值就在於上面執行的應用程式,我們可以利用它類似CDN的功能,在成本很低的頻寬下,去獲得想要的資料,從而提升整個應用程式的效率。

ipfs的模組化設計

   ipfs

   Filecoin

libp2p

IPLD

Multiformats

image

libp2p

在過去的相當長時間裡,開發者構建一個p2p網路並不是一件容易的事情。複雜的網路環境、各種各樣的通訊協議和網路裝置的存在使得建立大規模的點對點網路變得複雜並且困難。ipfs團隊將點對點(peer-to-peer)網路的網路層從ipfs工程裡面分離出來,形成一個獨立的專案,這就是libp2p。該專案不僅可以供ipfs使用,也可以提供其它專案使用,作為一個p2p工程的底層協議存在。

libp2p的主要功能是

   發現節點

連線節點

發現資料

傳輸資料

lPLD

IPLD定義了基於內容定址的統一資料結構型別。它是一個轉換器,可以把現有的異構的資料結構(基於內容定址)統一成一種格式,方便不同系統之間的資料交換和互操作。IPLD的組成:

CID(Self-describing content-addressed identifiers for distributed systems):基於內容定址的自我描述標識

IPLD tree:基於JSON、Protobuf和路徑導航的跨協議的資料模型

IPLD Resolvers:IPLD轉換器,可以新增新的協議到IPLD裡面

Multiformats

該專案的是一系列協議的集合,它在現有協議基礎上對值(值:通常是具有某一項表達意義的)進行自我描述改造,即從值上就可以知道該值是如何產生的。當前multiformats協議裡面包含以下協議:

   multihash - self-describing hashes

multiaddr - self-describing network addresses

multibase - self-describing base encodings

multicodec - self-describing serialization

multistream - self-describing stream network protocols

multigram (WIP) - self-describing packet network protocols

ipfs設計

ipfs是一個分散式檔案系統,它綜合了以前的對等系統的成功想法,包括DHT,BitTorrent,Git和SFS。ipfs的貢獻是簡化,發展和將成熟的技術連線成一個單一的內聚系統,大於其部分的總和。ipfs提供了編寫和部署應用程式的新平臺,以及一個新的分發系統版本化大資料。ipfs甚至可以演進網路本身。ipfs是點對點的;沒有節點是特權的。ipfs節點將ipfs物件儲存在本地儲存中。節點彼此連線並傳輸物件。這些物件表示檔案和其他資料結構。ipfs協議分為一組負責不同功能的子協議:

1.身份- 管理節點身份生成和驗證

2.網路- 管理與其他對等體的連線,使用各種底層網路協議。可配置的。

3.路由- 維護資訊以定位特定的對等體和物件。相應本地和遠端查詢。預設為DHT,但可更換。

4.交換- 一種支援有效塊分配的新型塊交易協議(BitSwap)。模擬市場,弱化資料複製。貿易策略可替換。

5.物件- 具有連結的內容定址不可更改物件的Merkle DAG。用於表示任意資料結構,例如檔案層次和通訊系統。

6.檔案- 由git啟發的版本化檔案系統層次結構。

    7.命名- 自我認證的可變名稱系統。

身份

節點由NodeId標識,這是使用S / Kademlia的靜態加密難題[1]建立的公鑰的密碼雜湊。節點儲存其公私鑰(用密碼加密)。使用者可以在每次啟動時自由地設定一個“新”節點身份,儘管這會損失積累的網路利益。激勵節點保持不變。

首次連線時,對等體交換公鑰,並檢查:hash(other.PublicKey)等於other.NodeId。如果沒有,則連線被終止

網路

ipfs節點與數百個其他節點進行定期通訊網路中的節點,可能跨越廣域網路。ipfs網路堆疊功能:

   傳輸層:ipfs可以使用任何傳輸協議。

可靠性:如果底層網路不提供可靠性,ipfs可使用uTP(LEDBAT)或SCTP來提供可靠性。

可連線性:ipfs還可以使用ICE NAT穿牆打洞技術。

完整性:可以使用雜湊校驗和來檢查郵件的完整性。

可驗證性:可以使用傳送者的公鑰使用HMAC來檢查訊息的真實性。

路由

ipfs節點需要一個路由系統, 這個路由系統可用於查詢:

   其他同伴的網路地址

   專門用於服務特定物件的對等節點

ipfs使用基於S / Kademlia和Coral的DSHT。在物件大小和使用模式方面,ipfs 類似於Coral 和Mainline,因此,ipfs DHT根據其大小對儲存的值進行區分。小的值(等於或小於1KB)直接儲存在DHT上。對於更大的值,DHT只儲存值索引,這個索引就是一個對等節點的NodeId, 該對等節點可以提供對該型別的值的具體服務。DSHT的介面如下:

   type ipfsRouting interface {

FindPeer(node NodeId) // 獲取特定NodeId的網路地址。

SetValue(key []bytes, value []bytes) // 往DHT儲存一個小的後設資料。

   GetValue(key []bytes) // 從DHT獲取後設資料。

ProvideValue(key Multihash) // 宣告這個節點可一個提供一個大的資料。

FindValuePeers(key Multihash, min int) // 獲取服務於該大資料的節點。}

塊交換- BitSwap協議

ipfs 中的BitSwap協議受到BitTorrent 的啟發,透過對等節點間交換資料塊來分發資料的。像BT一樣, 每個對等節點在下載的同時不斷向其他對等節點上傳已下載的資料。和BT協議不同的是,BitSwap 不侷限於一個torrent檔案中的資料塊。BitSwap 協議中存在一個永久的市場。這個市場包括各個節點想要獲取的所有塊資料。而不管這些塊是哪些如.torrent檔案中的一部分。這些快資料可能來自檔案系統中完全不相關的檔案。這個市場是由所有的節點組成的。雖然易貨系統的概念意味著可以建立虛擬貨幣,但這將需要一個全域性分類賬本來跟蹤貨幣的所有權和轉移。這可以實施為BitSwap策略。

在基本情況下,BitSwap節點必須以塊的形式彼此提供直接的值。只有當跨節點的塊的分佈是互補的時候,各取所需的時候,這才會工作的很好。通常情況並非如此,在某些情況下,節點必須為自己的塊而工作。在節點沒有其對等節點所需的(或根本沒有的)情況下,它會更低的優先順序去尋找對等節點想要的塊。這會激勵節點去快取和傳播稀有片段, 即使節點對這些片段不感興趣。

BitSwap信用

這個協議必須帶有激勵機制, 去激勵節點去seed 其他節點所需要的塊,而它們本身是不需要這些塊的。因此,BitSwap的節點很積極去給對端節點傳送塊,期待獲得報酬。但必須防止水蛭攻擊(空負載節點從不共享塊),一個簡單的類似信用的系統解決了這些問題:

對等節點間會追蹤他們的平衡(透過位元組認證的方式)。

隨著債務增加而概率降低,對等者概率的向債務人傳送塊。

BitSwap的策略

BitSwap 對等節點採用很多不同的策略,這些策略對整個資料塊的交換執行力產生了不同的巨大影響。BitSwap 對等體可以類似地實現一系列的策略(良好和惡意)。對於功能的選擇,應該瞄準:

   為整個交易和節點最大化交易能力。

為了防止空負載節點利用和損害交易。

高效抵制未知策略。

對可信任的對等節點更寬容。

當節點負債比例超過節點已建立信貸的兩倍,傳送到負債節點的概率就會急速下降。負債比是信任的衡量標準:對於之前成功的互換過很多資料的節點會寬容債務,而對不信任不瞭解的節點會嚴格很多。

給與那些創造很多節點的攻擊者(sybill 攻擊)一個障礙。

保護了之前成功交易節點之間的關係,即使這個節點暫時無法提供資料。

最終阻塞那些關係已經惡化的節點之間的通訊,直到他們被再次證明。

BitSwap賬本

BitSwap節點儲存了一個記錄與所有其他節點之間交易的賬本。這個可以讓節點追蹤歷史記錄以及避免被篡改。當啟用了一個連結,BitSwap節點就會互換它們賬本資訊。如果這些賬本資訊並不完全相同,分類賬本將會重新初始化, 那些應計信貸和債務會丟失。惡意節點會有意去失去“這些“賬本, 從而期望清除自己的債務。節點是不太可能在失去了應計信託的情況下還能累積足夠的債務去授權認證。夥伴節點可以自由的將其視為不當行為, 拒絕交易。

Merkle DAG

DHT和BitSwap允許ipfs構造一個龐大的點對點系統用來快速穩定的分發和儲存。最主要的是,ipfs建造了一個Merkle DAG,一個無迴路有向圖,物件之間的links都是hash加密嵌入在源目標中。這是Git資料結構的一種推廣。

   Merkle DAG擁有如下功能:

內容定址:使用多重雜湊來唯一識別一個資料塊的內容,包括links。

防篡改:可以方便的檢查雜湊值來確認資料是否被篡改。

去重:由於內容相同的資料塊雜湊是相同的,可以很容易去掉重複的資料,節省儲存空間。

ipfs透過Merkle DAG讓應用完全控制物件的資料結構,應用可以隨意定義自己的data型別和結構,甚至可以是一些ipfs系統無法理解的資料結構,靈活度非常的大。

檔案

ipfs在Merkle DAG上還為模型化版本檔案系統定義了一組物件。這個物件模型與Git比較相似:

   Block:一個可變大小的資料塊

List:塊或者其他連結串列的集合

Tree:塊,連結串列,或者其他樹的集合

Commit:樹在版本歷史記錄中的一個快照

檔案物件:BLOB

blob物件代表一個檔案且包含一個可定址的資料單元,ipfs的blobs就像Git的blobs或者檔案系統資料塊。它們儲存使用者的資料。需要留意的是ipfs檔案可以使用lists或者blobs來表示。Blobs沒有links。

檔案物件: LIST

List物件代表著由幾個ipfs的blobs連線成的大檔案或者重複資料刪除檔案。Lists包含著有序的blob序列或list物件。從某種程度上而言,ipfs的list函式就像一個間接塊的檔案系統。

檔案物件:TREE

ipfs中的tree物件與Git中相似,它代表著一個目錄,一個名字到雜湊值的對映。

檔案物件:COMMIT

ipfs中的commit物件代表任何物件在版本歷史記錄中的一個快照。與Git中類似,但是它能夠表示任何型別的物件。它同樣link著發起物件。

IPNS:命名以及易變狀態

目前為止,ipfs桟形成了一個對等塊交換組成一個內容可定址的DAG物件。這提供了釋出和獲取不可改變的物件。這甚至可以跟蹤這些物件的版本歷史記錄。但是,這裡有一個關鍵成分遺漏了:易變的命名。沒有這個,傳送ipfs的links,所有新內容的通訊肯定都會有所偏差。現在所需就是能有某些方法可以獲取相同路徑的的易變狀態。

自我認證認檔案系統-SFS

使用SFS中的命名方案,給我們提供了一個種可以構建自我認證名稱的方法,在一個加密指定的全域性名稱空間中,這是可變的。ipfs的方案如下:

   在ipfs中:NodeId = hash(node.PubKey)

給每個使用者分配一個可變的名稱空間,在此路徑下:/ipns/

一個使用者可以在此路徑下釋出一個用自己私鑰簽名的物件,比如說:

/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/當其他使用者獲取物件時,他們可以檢測簽名是否與公鑰和NodeId匹配。

這個驗證了使用者釋出物件的真實性,達到了可變狀態的獲取。

提出了兩個引人注目的實現:分散式信任鏈,和平等共享的全域性名稱空間。SFS引入了一種自我建構技術—註冊檔案:定址遠端檔案系統使用以下格式:

/sfs/:Location:代表的是服務網路地方HostID = hash(public_key || Location)

因此SFS檔案系統的名字認證了它的服務,使用者可以透過服務提供的公鑰來驗證,協商一個共享的私鑰,保證所有的通訊。所有的SFS例項都共享了一個全域性的名稱空間,這個名稱空間的名稱分配是加密的,不被任何中心化的body控制。

人類友好名稱

IPNS的確是一個分配和在分配名稱的好方法,但是對使用者卻不是十分友好的,因為它使用很長的雜湊值作為名稱,眾所周知這樣的名稱很難被記住。IPNS足夠應付URLs,但對於很多線下的傳輸工作就沒有這麼好用了。因此,ipfs使用下面的技術來增加IPNS的使用者友好度。

對等節點Links被SFS所鼓舞,使用者可以直接將其他使用者的物件link到自己的物件上(命令空間,家目錄等等)。這有一個好處就是建立了一個可信任的Web(也支援老的真實性認證模型):

   Alice links 到Bob上

ipfs link //friends/bob /

   Eve links 到Alice上

ipfs link /<eve-pk-hash/friends/alice /

# Eve 也可以訪問Bob

/<eve-pk-hash/friends/alice/friends/bob

# 訪問Verisign認證域

//foo.com

   DNS TXT IPNS 記錄

如果/ipns/是一個有效的域名稱,ipfs會在DNS TXT記錄中查詢關鍵的ipns。ipfs會將查詢到的值翻譯為一個物件的雜湊值或者另一個ipns的路徑:

# DNS TXT 記錄

ipfs.benet.ai. TXT "ipfs=XLF2ipQ4jD3U ..."

# 表現為符號連結

ln -s /ipns/XLF2ipQ4jD3U /ipns/fs.benet.ai

Filecoin協議是如何執行的?

分散式雜湊表(DHT)

分散式雜湊表被廣泛用於協調和維護關於對等系統的後設資料。比如,MainlineDHT是一個去中心化雜湊表,他可追蹤查詢所有的對等節點。

Kademlia DHT

透過大量網路進行高效查詢:查詢平均聯絡人O(log2N)節點。(例如,20跳10萬個節點的網路)

低協調開銷:最佳化數量的控制訊息傳送到其他節點。

   抵抗各種攻擊,喜歡長壽節點。

   在對等應用中廣泛使用。

Coral DSHT

雖然一些對等檔案系統直接在DHT中儲存資料塊,這種“資料儲存在不需要的節點會亂費儲存和貸款”。Coral DSHT擴充套件了Kademlia三個特別重要的方式:

Kademlia在ids為“最近”(使用XOR-distance)的關鍵節點中儲存值,不考慮應用程式資料的區域性性,忽略“遠”可能已經擁有資料的節點,並強制“最近”節點儲存它,無論它們是否需要,這浪費了大量的儲存和頻寬。相反,Coral儲存了地址,該地址的對等節點可以提供相應的資料塊。

Coral將DHT API從get_value(key)換成了get_any_values(key)(DSHT中的“sloppy”)中。這仍然是因為Coral使用者只需要一個(工作)的對等體,而不是完整的列表。作為回報,Coral可以僅將子集分配到“最近”的節點,避免熱點(當金鑰變得流行時,過載所有最近的節點)。

另外,Coral根據區域和大小組織了一個稱為群集的獨立DSHT層次結構。這使得節點首先查詢其區域中的對等體,“查詢附近的資料而不查詢遠端節點”[5]並大大減少查詢的延遲。

S/Kademlia DHT

S/Kademlia擴充套件了Kademlia,用於防止惡意的攻擊,有如下兩方面的方法:

S/Kad 提供了方案來保證NodeId的生成已經防止Sybill攻擊。它需要節點產生PKI公私鑰對。從中匯出他們的身份,並彼此間簽名。一個方案使用POW工作量證明,使得生成Sybills成本高昂。

S/Kad 節點在不相交的路徑上查詢直, 即使網路中存在大量的不誠實節點,也能確保誠實節點可以互相連結。即使網路中存在一半的不誠實節點,S/Kad 也能達到85%的成功率。

塊交換- BitTorrent

BitTorrent是一個廣泛成功應用的點對點共享檔案系統,它可以在存在不信任的對等節點(群集)的協作網路中分發各自的檔案資料片。從BitTorrent和它的生態系統的關鍵特徵,ipfs得到啟示如下:

BitTorrent的資料交換協議使用了一種bit-for-bat的激勵策略,可以獎勵對其他方面做貢獻的節點,懲罰只榨取對方資源的節點。

BitTorrent對等體跟蹤檔案的可用性,優先傳送稀有片段。這減輕了seeds節點的負擔, 讓non-seeds節點有能力互相交易。

對於一些剝削頻寬共享策略,BitTorrent的標準tit-for-tat策略是非常脆弱的。然而,PropShare是一種不同的對等頻寬分配策略, 可以更好的抵制剝削戰略, 提高群集的表現。

版本控制系統-Git

版本控制系統提供了對隨時間變化的檔案進行建模的設施,並有效地分發不同的版本。流行版本控制系統Git提供了強大的Merkle DAG物件模型,以分散式友好的方式捕獲對檔案系統樹的更改。

不可更改的物件表示檔案(blob),目錄(樹)和更改(提交)。

   透過加密hash物件的內容,讓物件可定址。

連結到其他物件是嵌入的,形成一個Merkle DAG。這提供了很多有用的完整和work-flow屬性。

很多版本後設資料(分支,標示等等)都只是指標引用,因此建立和更新的代價都小。

   版本改變只是更新引用或者新增物件。

分散式版本改變對其他使用者而言只是轉移物件和更新遠端引用。

   Filecoin協議裡有兩個概念:

1、儲存市場

2、檢索市場

普通使用者在ipfs網路儲存資料也可能是免費的,只是這些費用轉嫁到那些基於ipfs協議的應用開發商上,他們會用另外一種方式薅你身上的羊的毛。

Filecoin的共識機制(儲存證明PoSt)

Filecoin的共識機制相對環保,淘寶店主(礦工)發完貨(完成儲存),買家是要確認收貨(確認礦工完成儲存),這裡的“確認礦工完成儲存”,就是Filecoin的共識機制(儲存證明,PoSt),這個“確認礦工完成儲存”會一直存在於Filecoin網路中,使用者可以隨時檢視。

Filecoin把礦工在網路中的當前儲存資料相對於整個網路的儲存比例轉化為礦工投票權,利用儲存證明(PoSt)來產生共識,不用像比特幣那樣浪費計算資源和能源,並且能激勵礦工投入更多的硬碟為網路做貢獻。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;