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