IPFS家族(一)
IPFS這個項目其實很大,并不像大家想象的是一個東西,IPFS是由很多模塊組成,每一個模塊現(xiàn)在都已經(jīng)獨立成項目了,并且有自己的主頁。讓我們來簡單看一下IPFS家族成員。
協(xié)議實驗室的主頁:https://protocol.ai/projects/
在協(xié)議實驗室的主頁上面,可以找到目前的五個個項目:
- IPFS:http://ipfs.io
- Filecoin: http://filecoin.io
- libp2p: http://libp2p.io
- IPLD:http://ipld.io
- Multiformats:http://multiformats.io
(協(xié)議實驗室的是有多喜歡io的域名)
其中IPFS和FIlecoin我們已近很熟悉了,也是我們主角(男一號和女一號),今天主要介紹那些背后默默無聞的支持者。
IPFS的結構圖libp2p
IPFS團隊在開發(fā)IPFS協(xié)議的時候,采用的是高度模塊化的方式進行的。就像搭積木一樣,將各個功能獨立獨立起來進行。當然這也是現(xiàn)在軟件工程里面的基本要求,不過IPFS團隊在此基礎上更進一步,各個木塊之間幾乎完全解耦合。
libp2p是什么?
在過去的相當長時間里,開發(fā)者構建一個p2p網(wǎng)絡并不是一件容易的事情。復雜的網(wǎng)絡環(huán)境、各種各樣的通信協(xié)議和網(wǎng)絡設備的存在使得創(chuàng)建大規(guī)模的點對點網(wǎng)絡變得復雜并且困難。IPFS團隊將點對點(peer-to-peer)網(wǎng)絡的網(wǎng)絡層從IPFS工程里面分離出來,形成一個獨立的項目,這就是libp2p。該項目不僅可以供IPFS使用,也可以提供其它項目使用,作為一個p2p工程的底層協(xié)議存在。
之前的文章里面曾經(jīng)提到過IPFS的網(wǎng)絡連通性做的非常棒,在各種復雜的網(wǎng)絡環(huán)境下都能夠輕松應對,這與IPFS團隊在libp2p上面的精心設計是分不開的。
如果哪個團隊或者開發(fā)者想構建一個基于p2p網(wǎng)絡的項目,不妨參考一下或者直接使用libp2p作為底層協(xié)議,會減少很多很多的開發(fā)量(發(fā)現(xiàn)了什么?如今如火如荼的區(qū)塊鏈項目,有了libp2p,可以為大家節(jié)省很多工作量,當然,因為fork的存在,現(xiàn)在的項目大多數(shù)并不是從0開始的)。
下面我們來看看libp2p里面都有什么東東?
- Transports:傳輸層,TCP,uTP,QUIC,SCTP......
- Discovery:網(wǎng)絡發(fā)現(xiàn)層,mDNS,bootstrap,DNS,Kad......
- Peer Routing: 節(jié)點路由,mDNS, KadDHT......
- NAT Traversal: NAT穿越層......
- Content Routing: 內容尋址......
libp2p的主要功能是
- 發(fā)現(xiàn)節(jié)點
- 連接節(jié)點
- 發(fā)現(xiàn)數(shù)據(jù)
- 傳輸數(shù)據(jù)
它類似我們現(xiàn)實世界的快遞公司。它連接著千千萬萬個節(jié)點,除了負責分發(fā)數(shù)據(jù),還負責查找數(shù)據(jù)。它是一個大雜燴,綜合了各種協(xié)議、框架,讓它們一起和諧的工作。
當前實現(xiàn)版本:
- js
- go
IPLD
IPLD定義了基于內容尋址的統(tǒng)一數(shù)據(jù)結構類型。它是一個轉換器,可以把現(xiàn)有的異構的數(shù)據(jù)結構(基于內容尋址)統(tǒng)一成一種格式,方便不同系統(tǒng)之間的數(shù)據(jù)交換和互操作。
為什么要構建IPLD?
通過哈希進行內容尋址的技術已經(jīng)廣泛應用于各種分布式系統(tǒng)。從加密貨幣的區(qū)塊鏈到備份代碼的每一次提交,再到各種web內容,他們背后的邏輯幾乎是相同的, 然后由于數(shù)據(jù)結構的不兼容,造成了這些數(shù)據(jù)無法互相操作。IPLD作為中間層統(tǒng)一了這些異構的數(shù)據(jù)結構,使得不同的數(shù)據(jù)可以進行數(shù)據(jù)交換。
IPLD的組成:
- CID(Self-describing content-addressed identifiers for distributed systems):基于內容尋址的自我描述標識
- IPLD tree:基于 JSON、Protobuf和路徑導航的跨協(xié)議的數(shù)據(jù)模型
- IPLD Resolvers: IPLD轉換器,可以添加新的協(xié)議到IPLD里面
當前已實現(xiàn)的IPLD數(shù)據(jù)結構
- Git
- Bitcoin
- Ethereum
- IPFS
未來會有更多的數(shù)據(jù)結構添加進來,第三方的開發(fā)也可以把自己的數(shù)據(jù)結構提交到IPLD里面。截止到目前,IPLD在github上的關注度并不像是IPFS那么引人注目。不過相信隨著IPFS應用推進,IPLD項目也會也來越多的收到關注。至少它幾乎可以統(tǒng)一目前區(qū)塊鏈項目的絕大部分數(shù)據(jù)。作為一個中間層可以很方便的進行鏈之間的數(shù)據(jù)交換,IPFS團隊已經(jīng)幫大家造好了輪子。
Multiformats
該項目的是一系列協(xié)議的集合,它在現(xiàn)有協(xié)議基礎上對值(值:通常是具有某一項表達意義的)進行自我描述改造,即從值上就可以知道該值是如何產(chǎn)生的。聽起來是不是有點難以理解,別著急,下面咱們使用具體的例子來說明這是一個什么東西。
當前multiformats協(xié)議里面包含以下協(xié)議。
- 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
我們以第一個multihash為例子來說明什么是multiformats。通常情況下我們使用的哈希計算方法都是某一種實現(xiàn)方式,比如sha1,sha2-256等。哈希計算在我們的軟件工程里面幾乎隨處可見,特別是區(qū)塊鏈項目。multiformats將所有的哈希值計算統(tǒng)一成同樣的格式,這會為系統(tǒng)開發(fā)者帶來很多好處,比如加密函數(shù)升級等。
multihash:
升級后的哈希值的結構為:
<hash-func-type><digest-length><digest-value><哈希函數(shù)類型><摘要長度><摘要值>
我們有一個使用sha2-256函數(shù)生成的哈希值(如下),其長度為32(16進制0x20):
41dd7b6443542e75701aa98a0c235951a28a0d851b11564d20022ab11d2589a8規(guī)定sha2-256的代表數(shù)字為12(16進制)
于是我們得出來新的哈希值:
122041dd7b6443542e75701aa98a0c235951a28a0d851b11564d20022ab11d2589a8新的哈希值具有自我描述性質,它說明了自己是怎么來的。怎么樣,是不是一下子變得開朗起來。
小編把python版本的multihash實現(xiàn)擼了一遍,目前multihash總共實現(xiàn)了以下6種哈希函數(shù),建議以后的開發(fā)者使用這個升級版的哈希加密算法,好處多多:
- sha1
- sha2-256
- sha2-512
- sha3
- blake2b
- blake2s
其它幾個multi協(xié)議就不在一一介紹,感興趣的讀者可以到以下頁面學習
- https://multiformats.io/
- https://github.com/multiformats/multiformats
未完待續(xù)。。。。。。
本專欄的微信公眾號IPFS指南(ipfs_guide),致力于IPFS的知識的普及,如果你對IFPS、Filecoin,挖礦感興趣,敬請關注!
本專欄的文章允許轉載,但請注明:原文來自于知乎專欄:IPFS指南(IPFS指南)作者:飛向未來
總結
- 上一篇: IPFS: Merkle DAG数据结构
- 下一篇: IPFS家族(二)