03.04 區塊鏈讓比特幣成為數字黃金,IPFS又是如何運行,將成就誰呢?

IPFS是一個p2p網絡,先來看看BitTorrent的p2p網絡是如何工作的?

想要bt下載一個文件,首先你需要一個種子文件torrent,種子文件包含至少一個 Tracker(一臺服務器地址)信息和文件的分割記錄信息。

BT軟件解析種子文件torrent,從裡面找出來tracker,告訴tracker我要下載這個文件。tracker同時返回給你現在其它正在下載的節點信息,這個時候你的節點就正式加入了p2p下載網絡,根據tracker返回的信息直接跟其它節點建立聯繫,開始數據傳輸。

這種情況下Tracker成為了溝通p2p網絡的關鍵一環,如果tracker服務器全部關閉的話,p2p網絡就被關閉了。

那麼是不是說如果沒有了Tracker,p2p就不能實現了?

顯然不是的,後來有了DHT(分佈式哈希表),DHT技術的出現使得沒有tracker也能進行p2p網絡下載,用過電驢的讀者應該都不陌生,電驢裡面有一個選項,可以允許選擇KAD(DHT的一種)網絡進行搜索。這樣一來p2p網絡的適應性更強了,可以大大減輕tracker的負擔。

以上就是傳統的P2P軟件大概工作方式。


電驢的KAD網絡

IPFS的p2p網絡使用的是DHT技術

什麼是DHT ( Distributed Hash Tables ) ?

DHT是一個分佈式系統, 它提供了一個類似哈希表一樣的查詢服務: 鍵值對存儲在DHT中, 任何參與的節點都可以有效的檢索給定鍵對應的值. 鍵值對的映射由網絡中所有的節點維護, 每個節點負責一小部分路由和數據存儲. 這樣即使有節點加入或者離開, 對整個網絡的影響都很小, 於是DHT可以擴展到非常龐大的節點(上千萬)。

DHT廣泛應用於各種點對點系統, 用來存儲節點的元數據。比如:BTC系統使用 MainlineDHT來維護節點。

DHT具有以下性質:

離散型(Autonomy and decentralization): 構成系統的節點之間都是對等的, 沒有中央控制機制進行協調;

伸縮性(Scalability): 不論系統有多少節點, 都要求高效工作;

容錯性(Fault tolerance): 不斷有節點加入和離開, 不會影響整個系統的工作;

來自於: https://en.wikipedia.org/wiki/Distributed_hash_table

簡單介紹跟IPFS有關的三種DHT技術

Kademlia DHT

1.高效查詢:查詢的平均複雜度是 log2(n),例如:10,000,000個節點只需要20次查詢

2.低開銷:優化了發往其它節點的控制消息的數量

3.可以抵禦各種攻擊

4.廣泛應用於各種點對點系統,包括:Guntella和BitTorrent,可以構建超過2千萬個節點的網絡

Coral DSHT


Coral繼承了Kademlia並且做了一些改造 ( 它認為直接在DHT上存儲數據是浪費存儲和帶寬) 。

S/Kademlia DHT

S/Kademlia DHT同樣是繼承了Kademlia,並且做了一些改進,系統可以防止惡意攻擊,例如女巫攻擊。

IPFS的路由系統

ipfs系統的節點查找有兩個需求:

  1. 第一找到其他節點地址
  2. 第二找到存儲有特定數據的節點

IPFS綜合了S/Kademlia 、Coral和Mainline技術(能折騰吧,不過這種對技術的追求精神值得我們給ipfs團隊鮮花和鼓掌)。

Kademlia協議的工作方式比較複雜, 有興趣瞭解的可以單獨去查詢一下, 本文不在進行更深入的討論. KAD可以很高效進行路由查詢服務。

IPFS DHT的數據存儲是根據數據的大小進行的:

小於1KB的數據直接存儲到DHT上面

大於1KB的數據在DHT中存儲的是節點ID

節點加入

IPFS是基於DHT技術的,所以在IPFS網絡裡面是沒有tracker存在的。那麼一個新的節點創建後是如何加入網絡的呢?

新創建的節點必須知道至少一個已經在網絡上的節點地址,連上那個節點,就可以加入網絡了,所以ipfs系統提供了bootstrap命令來完成這個工作(通常情況不需要自己來做這樣的造作,除非有一些特殊需求,例如:指定自己比較近的啟動節點,搭建IPFS私有網絡等)。

ipfs bootstrap list 列出來啟動節點

ipfs bootstrap add [<peer>] 添加啟動節點/<peer>

ipfs bootstrap rm [<peer>] 刪除啟動節點/<peer>


上圖是小編節點的bootstrap節點

通過命令行help可以查看命令的使用詳情


localhost:~ tt$ ipfs bootstrap --help

USAGE

ipfs bootstrap - Show or edit the list of bootstrap peers.

SYNOPSIS

ipfs bootstrap

DESCRIPTION

Running 'ipfs bootstrap' with no arguments will run 'ipfs bootstrap list'

SECURITY WARNING:

The bootstrap command manipulates the "bootstrap list", which contains

the addresses of bootstrap nodes. These are the *trusted peers* from

which to learn about other peers in the network. Only edit this list

if you understand the risks of adding or removing nodes from this list.

SUBCOMMANDS

ipfs bootstrap add [<peer>]... - Add peers to the bootstrap list./<peer>

ipfs bootstrap list - Show peers in the bootstrap list.

ipfs bootstrap rm [<peer>]... - Remove peers from the bootstrap list./<peer>

Use 'ipfs bootstrap <subcmd> --help' for more information about each command./<subcmd>

小編在寫這篇問寫這篇文章的時候,還發現了一個小bug,當使用


ipfs bootstrap rm

刪掉所有的啟動節點之後,忘了添加自己的啟動節點,發現節點無法連接到ipfs網絡了,成了孤立節點,而且沒有任何提醒。於是小編去報了一個bug,經過跟開發們的討論給標記成了feature,未來如果出現這種情況,節點啟動的時候會給出提醒,不至於讓我們莫名其妙找不到問題。

文中涉及到的名詞比較多,很多技術細節並沒有說的很詳細,如果感興趣的讀者可以自行Google,也歡迎跟礦哥交流,最近越來越多的技術愛好者跟礦哥交流可以基於ipfs做些什麼事情,非常開心看到越來越多的國內的開發者關注這個項目了。


分享到:


相關文章: