區塊鏈
挖礦,比特幣,EOS,以太坊

IPFS白皮書解析(2)

206

作者丨Mark Pors?翻譯丨IP君
IPFS堆棧可視化如下:?
或者更詳細的說明:
我借用了Juan Benet(IPFS的BDFL)的演示文稿中的兩張圖片?在白皮書中,IPFS的設計或多或少地會使用到這些層,自下而上:?IPFS協議分為一堆子協議,負責不同的功能:

1.?標識?– 管理節點標識生成和驗證。2.?網絡 – 管理與其他對等方的連接,使用各種底層網絡協議。可配置的。3.?路由 – 維護信息以定位特定的對等體和對象。響應本地和遠程查詢。默認為DHT,但可以交換。4.?交換?– 一種新的塊交換協議(BitSwap),用于管理有效的塊分發。以市場為模型,弱刺激數據復制。可切換的貿易策略。交易策略可交換。5.?對象 -一個包含了鏈接的不可變對象的Merkle DAG。用于表示任意數據結構,例如文件層次結構和通信系統。6.?文件 – 受Git啟發的版本化文件系統層次結構。7.?命名 – 自我認證的可變名稱系統。

以下是我對這些子協議的替代命名:
1.?標識:標識這些節點2.?網絡:與其他節點交談3.?路由:宣布并查找內容4.?交換:發送和接收5.?對象:組織數據6.?文件:uh?7.?命名:添加可變性?接下來,就讓我們仔細分析這些,看看是否能增加我們對IPFS的理解!

標識:標識這些節點
IPFS是一個P2P網絡的客戶端;沒有中央服務器。這些客戶端是網絡的節點,需要一種被其他節點識別的方法。如果你給節點1 2 3編號,那么任何人都可以添加一個具有現有ID的節點并聲明為該節點。為了防止這種情況發生,需要一些加密技術。IPFS是這樣做的:?

1.生成PKI密鑰對(公鑰+私鑰)2.哈希的公鑰3.生成的哈希是NodeId

所有這些都是在節點的初始階段完成的:

ipfs init?> the resulting keys are stored in?~/.ipfs/configand returns the NodeId.

當兩個節點開始通信時會發生以下情況:

1.交換公鑰2.檢查:?hash(other.PublicKey) == other.NodeId3.如果是,那么我們已經確定了另一個節點,并且可以請求數據對象4.如果否,我們斷開與“假”節點的連接

白皮書中未指定實際的Hash算法,請閱讀此處的說明:

IPFS不將系統鎖定為一組特定的函數選擇,而是支持自描述值。哈希摘要值以多哈希格式存儲,其中包含一個簡短的頭,指定使用的哈希函數,以及以字節為單位的摘要長度。??例子:??\ \ \?這使得系統可以(a)為用例選擇最佳的功能(例如,更強的安全性和更快的性能),以及(b)隨著功能選擇的改變而演進。自描述值允許兼容地使用不同的參數選擇。

這些多哈希是自描述哈希的整個系列的一部分,它非常棒,有興趣可以看:?https://github.com/multiformats/multiformats

 

網絡:與其他節點交談
總結如下:IPFS在任何網絡之上工作(參見上圖)。?這里有趣的是連接到節點的網絡尋址。IPFS使用multiaddr格式。當你啟動一個節點時,你可以看到它在運行:?

Swarm listening on /ip4/127.0.0.1/tcp/4001Swarm listening on /ip4/172.17.0.1/tcp/4001Swarm listening on /ip4/185.24.123.123/tcp/4001Swarm listening on /ip6/2a02:1234:9:0:21a:4aff:fed4:da32/tcp/4001Swarm listening on /ip6/::1/tcp/4001API server listening on /ip4/127.0.0.1/tcp/5001Gateway (read-only) server listening on /ip4/0.0.0.0/tcp/8080

 

路由:宣布并查找內容
路由層基于DHT,如上一章節中所討論的,其目的是:

1.宣布該節點有一些數據(block如下一章所述)2.找到哪些節點有一些特定的數據(通過參考塊的multihash)3.如果數據足夠小(= <1KB),DHT將數據存儲為其值。

命令行接口和API不會像白皮書中指定的那樣,公開完整的路由接口。工作內容:

# tell the DHT we have this specific content:$ ipfs dht provide QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG?# ask for peers who have the content:$ ipfs dht findprovs QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGQmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6QmczCvhy6unZEVC5ukR3BC3BPxYie4jBeRApTUKq97ZnEoQmPM3WzZ3q1SR3pzXuGPHD7e6z3eWEWCnAvrNw7Wegyc8oQmPKSqtkDmYsSxQbqNkZG1AmVnZSFyv5WF7fFE2YebNBFGQmPMJ3HLLLBtW53R2YixhVHmVb3pkR2bHni3qbqq23vBSvQmPNHJJphV1TB6Z99L6r9Y7bKaCBUQ67X17hicnEmsgWDJQmPNhiqGg81o2Perk2i7VNvvVuuLLUMKDxMNwVauP8r5YvQmPQJRgP3Vxi52Ho7HfnYdiCRJTRM1TXwgEnyjcwcLuKfbQmNNxr1ZoyPbwNe2CvYz1CVyvSNWsE8WNwDWQ9t9BDjnj5QmNT744VjtRFpDYB25EVLx7ha1zAVDKsd3qFjxfQLjPEXqQmNWwGRWTYeut6qvKDhJBuEJZnbqMPMfuF81MPvHvPBX89QmNZM5NmzZNPkvH2kPXDYNAB1cAeBNfxLyM9B1crgt3VeJQmNZRDzSJybdf4rmt972SH4U9TF6sEK8q2NSEJpEt7SkTpQmNZdBUV9QXytVcPjcYM8i9AG22G2qwjZmh4ZwpJs9KvXiQmNbSJ9okrwMphfjudiXVeE7QWkJiEe4JHHiKT8L4Pv7z5QmNdqMkVqLTsJWj7Ja3oKwLNWcAYUkRjSZPg22B7rvKFMrQmNfyHTzAetJGBFTRkXXHe5om13Qj4LLjd9SDwJ87T6vCKQmNmrRTP5sJMUkobujpVXzzjpLACBTzf9weND6prUjdstWQmNkGG9EZrq699KnjbENARLUg3HwRBC7nkojnmYY8joBXLQmP6CHbxjvu5dxdJLGNmDZATdu3TizkRZ6cD9TUQsn4oxY?# Get all multiaddr’s for a peer$ ipfs dht findpeer QmYebHWdWStasXWZQiXuFacckKC33HTbicXPkdSi5Yfpz6/ip4/192.168.1.14/tcp/4001/ip6/::1/tcp/4001/ip4/127.0.0.1/tcp/4001/ip4/1.2.3.4/tcp/37665

ipfs put和ipfs只適用于API中的ipns記錄。也許在DHT上存儲小數據還沒有實現?
交換:發送和接收
數據被分解成塊,交換層負責分配這些塊。它看起來像BitTorrent,但是它不同,所以協議有它自己的名字:BitSwap。
主要的不同之處在于,在BitTorrent塊與尋找相同文件塊(torrent swarm)的對等塊進行交易時,在BitSwap塊中交換交叉文件。所以有一大群的IPFS數據。
BitSwap被建模為一個激勵數據復制的市場。這種方法被稱為BitSwap策略,白皮書描述了一種可行的策略,并指出策略可以被另一種策略替代。這種交易系統可以建立在虛擬貨幣的基礎上,這就是FileCoin的切入點。?當然,每個節點都可以決定自己的策略,因此通常使用的策略必須具有抵御濫用的能力。當大多數節點被設置為具有某種公平的交換方式時,它的工作原理是這樣的:

1.當對等體連接時,它們會交換它們擁有的塊(have_list)和要查找的塊(want_list);2.要確定節點是否實際共享數據,它可以應用?BitSwap策略進行檢驗;3.該策略基于這兩個節點之間的先前數據交換;4.當節點交換區塊時,他們會跟蹤他們共享的數據量(構建信用額)以及他們收到的數據量(構建債務);5.在BitSwap賬目中,記錄了兩個節點之間的分類賬目;6.如果一個節點擁有信用(共享多于接收),我們的節點會發送被要求的區塊7.如果一個節點有債務,我們的節點將共享或不共享,這取決于一個確定性函數,當債務越大,共享的機會就越小;8.數據交換總是從交換分類賬開始,如果不相同,我們的節點斷開連接;

這是一種很酷的游戲理論!白皮書進一步描述了一些邊緣情況,比如如果我沒有塊可以交換的塊怎么辦?答案很簡單,就是收集你的同行正在尋找的區塊,這樣你就有了交易的東西。?現在讓我們看看我們如何在BitSwap交換協議的內部進行搜索。?命令行界面有一個部分blocks和一個部分bitswap;??為了看到 bitswap的運行方式,我請求了一個大的視頻文件:Qmdsrpg2oXZTWGjat98VgpFQb5u1Vdw5Gun2rgQ2Xhxa2t

# ask for the file$ ipfs get Qmdsrpg2oXZTWGjat98VgpFQb5u1Vdw5Gun2rgQ2Xhxa2t?# in a seperate terminal, after requesting the file, I inspect the “bitswap wantlist”$ ipfs bitswap wantlistQmYEqofNsPNQEa7yNx93KgDycmrzbFkr5oc3NMKXMxx5ffQmUmDEBm9a8MYyqRdb3YQnoqPmqAo4cEWdKQErirFJdSWDQmY5VJPbsRZzFCTMrFBx2qtZiyyeLhsjBysyfC1fx2gE9SQmdbzYgyhqUNCNL8xU2HTSKwao1ck2Gmi5U1ygjQuJd92bQmbZDe5Dcv9mJr8fiqp5aJL2cbyu64tgzwCS2Vy4P3krCLQmRjzMzVeYRE5b6tDF3sTXMV1sTffno92uL3WwuFavBrWQQmPavzEJQw8atvErXQis6C6GF7DRFbb95doAaFkHe9M38uQmY9fs1Pkr3nV7RkbGdfGh3q8HuKtMMCCUp22AAbwPYnrSQmUtxZkuJuyydd124Z2cfx6jXMAMpcXZRF96QMAsXc2y6cQmbYDTJkmLqMm6ojdL6pLP7C8mMVfVPnUxn3yp8HzXDcXfQmbW9MZ7cwn8svpixosAuC7GQmUXDTZRuxJ8dJp6HyJzCSQmdCLGWsYQFhi9y3BmkhUreX2S799iWGyJqvnbK9dzB55cQmc7EvnBPf2mPCUCfvjcsaQGLEakBbUN9iycnyrLF3b2orQmd1mNnDQPf1BAjFqDHjiLe4g4ZFPAheQCniYkbQPosjDEQmPip8XzQhJFd487WWw7D8aBuGLwXtohciPtUDSnxpvMFRQmZn5NAPEDtptMb3ybaMEdcVaoxWHs7rKQ4H5UBcyHiqTZ…?# find a node where we have debt$ ipfs dht findprovs Qmdsrpg2oXZTWGjat98VgpFQb5u1Vdw5Gun2rgQ2Xhxa2tQmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9zQmUh2KnjAvgEbJFSd5JZws4CNvt6LbC4C1sRpBgCbZQiqDQmc9pBLfKSwWboKHMvmKx1P7Z738CojuUXkPA1dsPrvSw2QmZFhGyS2W833nKKkbqZAU2uSvBbWUytDJkKBHimwRmhd6QmZMxNdpMkewiVZLMRxaNxUeZpDUb34pWjZ1kZvsd16ZicQmbut9Ywz9YEDrz8ySBSgWyJk41Uvm2QJPhwDJzJyGFsD6?# try one to see if we have downloaded from that node$ ipfs bitswap ledger QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3Ledger for <peer.ID SoLMeW>Debt ratio: 0.000000Exchanges: ?11Bytes sent: 0Bytes received: 2883738

現在,看看block命令:

# Let’s pick a block from the wantlist above$ ipfs block stat QmYEqofNsPNQEa7yNx93KgDycmrzbFkr5oc3NMKXMxx5ffKey: QmYEqofNsPNQEa7yNx93KgDycmrzbFkr5oc3NMKXMxx5ffSize: 262158?$ ipfs block get QmYEqofNsPNQEa7yNx93KgDycmrzbFkr5oc3NMKXMxx5ff > slice_of_a_movie# results in a binary file of 262 KB

我們將在下一章再看一下塊如何適應。
到目前為止,我們描述的堆棧的三層結構(網絡,路由,交換)在libp2p中實現。
現在,讓我們看看堆棧中IPFS的核心……

對象:組織數據
現在它變得引人入勝。您可以將IPFS概括為:分布式的、經過身份驗證的、哈希鏈接的數據結構。這些hash-linked數據結構Merkle DAG的由來(還記得我們前一章嗎?)。?為了創建任何數據結構,IPFS提供了一種靈活而強大的解決方案:

1.在圖表中組織數據,我們稱之為圖表的節點?objects2.這些對象可以包含數據(任何類型的數據,對IPFS透明)和/或指向其他對象的鏈接3.這些鏈接 –?Merkle Links只是目標對象的加密哈希

這種組織數據的方式有幾個有用的屬性(引自白皮書):

1.內容尋址:所有內容都由其多哈希校驗和(包括鏈接)唯一標識。2.防篡改:所有內容都通過校驗和進行驗證。如果數據被篡改或損壞,IPFS會檢測到它。3.重復數據刪除:所有保存相同內容的對象都是相等的,并且只存儲一次。這對于索引對象(如git樹和提交)或數據的公共部分尤其有用。

要了解IPFS對象,請查看此對象可視化示例。(https://ipfs.io/ipfs/QmNZiPk974vDsPmQii3YbrMKfi12KTSNM7XMiYyiea4VYZ/example#/ipfs/QmP8WUPq2braGQ8iZjJ6w9di6mzgoTWyRLayrMRjjDoyGr/graphmd/README.md)
另一個漂亮的功能是使用unix風格的路徑,其中Merkle DAG具有以下結構:

/ipfs/<hash-of-object>/<named-path-to-object

我們將在下面看到一個例子。
讓我們通過重播快速入門中的一些示例來看它的實際效果:

$ mkdir foo$ mkdir foo/bar$ echo?“baz”?> foo/baz$ echo?“baz”?> foo/bar/baz$ tree foo/foo/├── bar│?? └── baz└── baz$ ipfs add -r fooadded QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR foo/bar/bazadded QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR foo/bazadded QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN foo/baradded QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm foo# the last hash is the root-node, we can access objects through their path starting at the root, like:$ ipfs cat /ipfs/QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/bar/bazbaz# To inspect an object identified by a hash, we do$ ipfs object get /ipfs/QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm{????“Links”:[??????{????????“Name”:”bar”,??????“Hash”:”QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN”,??????“Size”:61????},????{????????“Name”:”baz”,??????“Hash”:”QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR”,??????“Size”:12????}??],??“Data”:”\u0008\u0001″}# The above object has no data (except the mysterious \u0008\u0001) and two links# If you’re just interested in the links, use “refs”:$ ipfs refs QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3GmQmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDNQmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR# Now a leaf object without links$ ipfs object get /ipfs/QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/bar/baz{????“Links”:[?????],??“Data”:”\u0008\u0002\u0012\u0004baz\n\u0018\u0004″}# The string ‘baz’ is somewhere in there ??

數據字段中出現的Unicode字符是數據序列化的結果。我認為IPFS使用的是protobuf。如果我錯了請糾正我?在我寫這篇文章的時候,ipfs對象命令有一個實驗性的替代方法:ipfs dag:

$ ipfs dag get QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm{????“data”:”CAE=”,??“links”:[??????{????????“Cid”:{??????????“/”:”QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN”??????},??????“Name”:”bar”,??????“Size”:61????},????{????????“Cid”:{??????????“/”:”QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR”??????},??????“Name”:”baz”,??????“Size”:12????}??]}?$ ipfs dag get /ipfs/QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/bar/baz{????“data”:”CAISBGJhegoYBA==”,??“links”:[?????]}

我們看到了一些不同之處,但我們不談這個。兩個輸出都遵循白皮書中的IPFS對象格式。有趣的一點是出現的“Cid”;這指的是更新的內容標識符。
提到的另一個特性是pin對象的可能性,這導致將這些對象存儲在本地節點的文件系統中。ipfs的當前go實現將其存儲在目錄下的leveldb數據庫中~/.ipfs/datastore。我們已經在之前的帖子中看到了行動。?本章的最后一部分提到了對象級加密的可用性。這還沒有實現:(?status wip正在進行中;我也必須查找它)。項目頁面在這里:ipfs keystore proposal。(https://github.com/ipfs/specs/tree/master/keystore)

檔案:uh?
在Merkle DAG對象之上,IPFS定義了一個帶版本控制的Git文件系統,其中包含以下元素:

blob:blob中只有數據,它代表了IPFS中文件的概念。blob中沒有鏈接;list:lists也是IPFS文件的表示形式,但由多個blob和/或列表組成;tree:blob,列表和/或樹的集合:充當目錄;commit:樹中歷史的快照(就像git提交一樣);

現在我聽到你在想:這些斑點、列表和樹不是和我們在歸納法中看到的一樣嗎?我們有帶數據的對象,有或沒有鏈接,以及類似unix的文件路徑。?我聽到你這么想,因為當我讀到這一章的時候,我也是這么想的。在搜索了一下之后,我開始感覺到這個層被丟棄了,IPLD在“對象”層停止了,而上面的所有東西都對任何實現都是開放的。如果一位專家正在閱讀這篇文章,并認為我完全搞錯了:請讓我知道,我將用新的見解來糾正它。
那么,提交文件類型呢?白皮書的標題是“IPFS -內容尋址、版本化、P2P文件系統”,但是版本控制似乎還沒有實現。?還剩下一層……

命名:添加可變性
由于IPFS中的鏈接是內容可尋址的(內容上的加密散列表示內容的塊或對象),因此數據根據定義是不可變的。它只能被內容的另一個版本替換,因此它會獲得一個新的“地址”。
解決方案是為不可變內容創建“標簽”或“指針”(就像git分支和標簽一樣)。這些標簽可用于表示對象(或對象圖)的最新版本。
在IPFS中,可以使用我在上一篇文章中描述的自我認證文件系統創建此指針。它被命名為IPNS,其工作方式如下:

節點的根地址是?/ipns/<NodeId>可以通過將IPFS對象發布到此地址來更改它指向的內容通過發布,節點的所有者(知道生成的秘密密鑰的人ipfs init)以加密方式對該“指針”進行簽名。這使其他用戶可以驗證所有者發布的對象的真實性。就像IPFS路徑一樣,IPNS路徑也以哈希開頭,然后是類似Unix的路徑。IPNS記錄通過DHT公布和解決。

白皮書的這一章還介紹了一些使地址更人性化的方法,但我將把這些留到下一章再講。

贊(0)

評論 搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
p3试机号99