IPFS詳解


論文

Kademlia DHT

Kademlia DHT是一種分布式哈希算法。

假設現在所有的文件被分布式存儲在不同的機器上,如果我們想要查詢a的位置,應該去哪個機器上查詢?

一種思路就是所有的節點都存儲所有文件存放的位置。但這樣的弊端是顯而易見的:

一方面如果有一個新的文件加入到系統中,那么需要把它的位置廣播給所有的節點,開銷很大。另一方面,一但有一個節點被攻破,那么攻擊者就可以的得知所有的文件存儲的位置,不安全。

Kademlia DHT的思想很巧妙。首先每個存儲節點都有一個NodeId(160位2進制),如果文件a的hash計算出來為10000100(這里簡寫了,實際肯定比這復雜),那么要求a文件存儲在NodeId最接近hash的k個節點處比如 10000100,1000101......

那么如何找到這些節點的路由呢?

Kademlia DHT要求每個節點存儲部分節點的路由信息,同時按照節點hash的異或值分層存儲,換句話說,就是按與自己的距離分層存儲,假設該節點的id為00000100那么 他會把存儲的節點NodeId前160位與自己相同的放在一層,前159位與自己相同的放在一層......所以每個節點都維護了一個160層的路由信息。

現在它收到一個查詢請求,查詢hash為1000100的文件在哪,先看看是不是在自己這,發現沒有,計算距離為00000100^10000100=10000000,也就是說前8層不同,那他就去第八層隨機找一個節點,把查詢請求發送給他,以此類推,每次查詢都是將距離減半

查詢平均o(logN)的時間復雜度

Coral DSHT

DSHT是基於DHT,只不過它又將節點按照往返時延分為L0,L1,L2三層,L2的往返時延最低,L0最高,在進行DHT查找時,會優先查找L2的節點,找不到再往下查找L1,L0的節點,DSHT算法的時間復雜度與DHT相同,但實際運行效率卻大大提高,但是節點加入/刪除時的系統維護成本較高

S/Kademlia DHT

S/Kademlia DHT主要是解決DHT的安全問題

DHT安全問題

按照受到攻擊的結構來看,攻擊主要分為兩類,第1類攻擊是針對路由表控制網絡中部分節點;第2類則是惡意消耗占用節點的資源。前者包括日蝕攻擊、女巫攻擊、流失攻擊(Churn attack)和對抗路由攻擊。

(1)日蝕攻擊

如果一個節點在網絡中能夠自由選擇它的ID,如果被攻擊者某個K桶不滿,或者有節點死掉了,那么攻擊者就可以進入自己想攻擊節點的K桶中

(2)女巫攻擊

在開放的對等網絡里,攻擊者可以假冒多個ID,用少數網絡節點控制多個虛假身份。KAD網絡難以控制節點的數量,那么攻擊者偽造大量虛假節點身份,就能控制部分網絡。通常情況下可以通過消耗一定的系統和計算資源提高女巫攻擊者的成本。當然,這也只能改善並不能杜絕。

(3)流失攻擊

攻擊者擁有網絡的一些節點,即惡意節點,這可能會在網絡中引發大量流量流失,從而導致網絡穩定性降低。

(4)對抗路由攻擊

惡意節點在收到查詢指令后,不是按照KAD的要求返回距離Key最接近的網絡節點,而是轉移給同伙節點。同伙節點也做同樣的操作,而不返回給查詢節點所需要的信息,那么這樣一來查詢就會失效。我們發現,整個過程中必須將查詢信息傳遞給惡意節點,這一攻擊才能發動。那么我們可以在查詢時,設計算法並行地查詢,並且每一條查詢路徑不相交。這樣一來,只要並行查詢的路徑中有一條不碰到惡意節點,查詢就能成功了。

S/Kademlia DHT

S/K協議就是做出了上述的幾個改進:為了避免日蝕攻擊和女巫攻擊,S/K需要節點不能自由選擇節點ID,不能大批量生成ID,同時不能竊取和偽裝其他節點的ID。這一方法可以通過非對稱加密確保節點身份不被竊取,我們可以設置一定的計算量障礙,強迫節點進行一定的哈希運算來確保不能自由選擇和批量生產ID。

為了避免對抗路由攻擊,我們需要並行查找不相交的路徑。

(1)安全的節點分配策略

S/K節點ID分配策略方案有3個要求:節點不能自由選擇其ID;不能生成多個ID;不能偽裝和竊取其他節點的ID。

為了實現這些要求,S/K設置了如下方法增加攻擊的難度。每個節點在接入前必須解決兩個密碼學問題,靜態問題是:產生一對公鑰和私鑰,並且將公鑰做兩次哈希運算后,具有c1個前導零。那么公鑰的一次哈希值,就是這個節點的NodeID。動態問題是:不斷生成一個隨機數X,將X與NodeID求XOR后再求哈希,哈希值要求有c2個前導零。靜態問題保證節點不再能自由選擇節點ID了,而動態問題則提高了大量生成ID的成本。那么女巫攻擊和日蝕攻擊將難以進行。

為確保節點身份不被竊取,節點需要對發出的消息進行簽名。考慮安全性,可以選擇只對IP地址和端口進行弱簽名;或者對整個消息進行簽名,以保證消息的完整性。在其他節點接收到消息時,首先驗證簽名的合法性,然后檢查節點ID是否滿足上述兩個難題的要求。我們發現,對於網絡其他節點驗證信息的合法性,它的時間復雜度僅有(1);但是對於攻擊者,為了生成這樣一個合法的攻擊信息,其時間復雜度是(2c1+2c2)。合理選取c1和c2,就能有效避免這3種攻擊方式了。

(2)不相交路徑查找算法

在KAD協議中,我們進行一次查詢時,會訪問節點中的個K-Bucket中的節點,這個K-Bucket是距離我們需要查詢的Key最近的。收到回復后,我們再進一步對返回的節點信息排序,選擇前個節點繼續迭代進行請求。很明顯,這樣做的缺點是,一旦返回的其他節點信息是一組惡意節點,那么這個查詢很可能就會失敗了。

為解決這個問題,S/K提出的方案如下:每次查詢選擇k個節點,放入d個不同的Bucket中。這d個Bucket並行查找,Bucket內部查找方式和KAD協議完全相同。這樣一來,d條查找路徑就能做到不相交。對於任意一個Bucket,有失效的可能,但是只要d個Bucket中有一條查詢到了所需要的信息,這個過程就完成了。

通過不相交路徑查找,能解決對抗路由攻擊。S/K協議將Kademlia協議改進后,針對常見的攻擊,其安全性能大大提高了。

BitTorrent

BitTorrent 協議是架構於 TCP/IP 協議之上的一個 P2P 文件傳輸協議,處於 TCP/IP 結構的應用層。BitTorrent 協議本身也包含了很多具體的內容協議和擴展協議,並在不斷擴充中。如果有多個下載者並發的下載同一個文件,則每個下載者也同時為其它下載者上傳文件,這樣,文件源可以支持大量的用戶進行下載,而只帶來適當的負載的增長。

BitTorrent 協議把提供下載的文件虛擬分成大小相等的塊,塊大小必須為 2k 的整數次方(由於是虛擬分塊,硬盤上並不產生各個塊文件),並把每個塊的索引信息和 Hash 驗證碼寫入 .torrent 文件(即種子文件,也簡稱為“種子”)中,作為被下載文件的“索引”。 下載者要下載文件內容,需要先得到相應的 .torrent 文件,然后使用 BT 客戶端軟件進行下載。

下載時,BT 客戶端首先解析 .torrent 文件得到 Tracker 地址,然后連接 Tracker 服務器。Tracker 服務器回應下載者的請求,提供下載者其他下載者(包括發布者)的 IP。或者,BT客戶端也可解析 .torrent 文件得到 nodes 路由表,然后連接路由表中的有效節點,由網絡節點提供下載者其他下載者的 IP。

下載者再連接其他下載者,根據 .torrent 文件,兩者分別對方告知自己已經有的塊,然后交換對方沒有的數據。此時不需要其他服務器參或者其他網絡節點的參與,分散了單個線路上的數據流量,因此減輕了服務器負擔。下載者每得到一個塊,需要算出下載塊的 Hash 驗證碼與 .torrent 文件中的對比,
如果一樣則說明塊正確,不一樣則需要重新下載這個塊。

因此,下載的人越多,提供的帶寬也越多,種子也會越來越多,下載速度就越快。

IPFS

IPFS是以上技術的融合。

介紹點不同的。

IPFS與BitTorrent相似也是每個文件被分為不同的塊,但與BitTorrent不同的是,節點間不止交換自己需要的塊,也就是說每個節點不止下載自己需要的文件的塊,也會下載別的文件的塊,節點優先下載自己需要的塊,然后是其他節點需要的塊,這也就鼓勵每個節點緩存比較稀有的塊。

同時在IPFS中有一個“信用分”機制。如果一個節點只下載不分享,那么它的信用分就很低,節點在建立連接時,會優先與信用分高的節點建立連接。

BitSwap節點會記錄下來和其他節點通信的賬單(數據收發),可以保持節點間數據交換的歷史和防止篡改。當兩個節點之間建立連接的時候,BitSwap會相互交換賬單信息,如果賬單不匹配,則清除重新記賬。惡意節點可能會故意“丟失”賬單,以希望清除掉自己的債務。其它交互節點會把這些都記下來,如果總是發生,節點就會被拒絕。

每個文件在IPFS都是通過Mekle DAG(可以簡單理解成Mekle tree,但沒有樹的那么多限制)存儲的,這也就保證了文件的任意一部分的不可篡改性。同時Mekle DAG可以很方便的實現版本控制,由於文件在Mekle DAG中是分Mekle節點存儲的,如果文件某個部分改變了,我們只需要復制並且更新該Mekle節點以及上層節點即可。

同時允許每個父節點保存子節點的索引,那么我們只需要給定文件的索引(Mekle DAG的根哈希),就很容易拼接出整個文件

SFS命名方案:每個節點的NodeId=hash(public_key),同時每個節點有一個命名空間/ipns/ ,當這個節點上傳文件時需要把文件+自己的私鑰簽名發送到這個地址上,那么其他用戶就可以檢驗是不是這個用戶發布的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM