IPFS 使用安裝教程

買賣虛擬貨幣
1. 簡介IPFS(InterPlanetaryFile System)是一個點對點的分散式超媒體分發協議,它整合了過去幾年最好的分散式系統思路,為所有人提供全球統一的可定址空間,包括Git、自證明檔案系統SFS、BitTorrent和DHT,同時也被認為是最有可能取代HTTP的新一代網際網路協議。IPFS用基於內容的定址替代傳統的基於域名的定址,使用者不需要關心伺服器的位置,不用考慮檔案儲存的名字和路徑。我們將一個檔案放到IPFS節點中,將會得到基於其內容計算出的唯一加密雜湊值。雜湊值直接反映檔案的內容,哪怕只修改1位元,雜湊值也會完全不同。當IPFS被請求一個檔案雜湊時,它會使用一個分散式雜湊表找到檔案所在的節點,取回檔案並驗證檔案資料。IPFS是通用目的的基礎架構,基本沒有儲存上的限制。大檔案會被切分成小的分塊,下載的時候可以從多個伺服器同時獲取。IPFS的網路是不固定的、細粒度的、分散式的網路,可以很好的適應內容分發網路的要求。這樣的設計可以很好的共享各類資料,包括影象、影片流、分散式資料庫、整個作業系統、模組鏈、8英寸軟盤的備份,還有靜態網站。IPFS提供了一個友好的WEB訪問介面,使用者可以透過本機的 IPFS-HTTP 閘道器(http://localhost:5001/ipfs/) 或者公共的閘道器(http://ipfs.io/) 獲取IPFS網路中的內容,也可以透過特定的瀏覽器或者外掛透過ipfs:/or fs:/的方式直接獲取內容。也許在不久的將來,IPFS協議將會徹底替代傳統的HTTP協議。2. 使用IPFS
2.1 安裝•$ go get -u -d github.com/ipfs/go-ipfs•$ cd $GOPATH/src/github.com/ipfs/go-ipfs•$ make install2.2 初始化•$ ipfs init
2.3 加入IPFS網路•$ ipfs daemon2.4 獲取內容•$ipfs cat/ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/r   eadme•http://localhost:5001/ipfs/QmYwAPJzv5CZsnA625s3Xf2nemTYgPpHdWEz79ojWnPbdG2.5 釋出內容
•$ ipfs add hello.jpg• IPFS檔案還可以抽象成特殊的IPFS目錄,從而標註一個可讀的檔名(透明的對映到IPFS雜湊),在訪問的時候會像HTTP一樣獲取一個目錄索引。在IPFS上建立網站的流程和過去一樣,而且把網站加入到IPFS節點的指令只需要一條指令:ipfs add -r yoursitedirectory。2.6 快取內容到本地 •$ ipfs pin add-r                        QmcKi2ae3uGb1kBg1yBpsuwoVqfmcByNdMiZ2pukxyLWD8 •快取到本地的內容不僅可以自己使用,還能為其他節點提供資源
2.7 IPNS域名訪問 •IPFS雜湊只能用來表示不可變資料,因為一旦資料改變,雜湊值也會改變。從某種意義上來說,這是保持資料持續性的好的設計。但是我們也需要一種方法來標記最新更新網站的雜湊,這個方法我們稱作IPNS。•IPNS的原理是從域名的TXT記錄裡獲取IPFS雜湊地址,然後根據這個雜湊地址從IPFS網路中獲取資料。比如http://ipfs.io/ipns/ipfs.git.sexy/•接下來IPFS還打算支援Namecoin。Namecoin從理論上完全實現了分散式Web的去 中心化,整體的執行中不再需要中心化的授權。支援了Namecoin的IPFS不再需要ICAN N、中心伺服器,不受政治干涉,也無需授權證書。2.8 更多 •更多資訊請瀏覽IPFS的API文件https://ipfs.io/docs/api/
•如果你想機遇IPFS做一些開發,這裡有各種語言實現的API呼叫介面https://github.com/ipfs/ipfs#api-client-libraries3. IPFS是如何工作的3.1 身份驗證和比特幣相似,每一個節點都會由NodeId(公鑰的雜湊值)來標識,節點儲存著公鑰和加密過的私鑰。首次連線時,節點間交換公鑰,並檢查 hash(other.PublicKey)是否等於other.NodeId。如果沒有,則終止連線。type NodeId Multihash
type Multihash []byte        //self-describingcryptographic hash digesttype PublicKey []bytetype PrivateKey []byte// self-describing keystype Node struct {
    NodeId NodeID PubKey PublicKey    PriKey PrivateKey3.2 網路每個節點與網路中的相連的其他數百個節點進行定期通訊。
IPFS的網路傳輸具有如下特性:• 傳輸: IPFS可以使用任何傳輸協議,如 WebRTC 和 uTP。• 可靠性:如果底層網路不能保證可靠性,IPFS可以使用 uTP 或 SCTP 來保    證• 連線:IPFS還使用 ICE NAT 穿越技術• 完整性:使用雜湊校驗和檢查訊息的完整性。• 真實性:可以使用傳送者的公鑰和HMAC來檢查訊息的真實性。
同時IPFS不僅僅是透過IP來連線節點,還支援很多其他協議。IPFS內部使用   不同的地址格式來選擇不同的網路協議。# an SCTP/IPv4 connection/ip4/10.20.30.40/sctp/1234/# an SCTP/IPv4 connectionproxied over TCP/IPv4/ip4/5.6.7.8/tcp/5678/ip4/1.2.3.4/sctp/1234/3.3 路由
IPFS透過透過基於 S/Kademlia 和 Coral 的 DSHT 來尋找匹配的節點和特定節點的地址資訊,IPFS的物件和使用模式的大小類似於 Coral 和 Mainline,因此 IPFS DHT 根據其大小對儲存的值進行區分。小值(等於或小於1KB)直接儲存在DHT上。對於更大的值,DHT儲存擁有這些塊的節點NodeId。DSHT的介面定義如下:typeIPFSRouting interface {FindPeer(node NodeId)// 得到指定節點的地址SetValue(key[]bytes, value []bytes)
// 小值可直接儲存在DHT上GetValue(key[]bytes)// 從DHT中獲取值ProvideValue(key Multihash)// 宣佈此節點可以提供一個大值FindValuePeers(keyMultihash, min int)
// 得到擁有特定大值的所以節點}3.4 塊交換在IPFS中,透過使用 BitSwap 協議與其他節點進行塊(block)交換來實現資料分發。BitSwap 維持著兩個列表,想要獲得的塊和已儲存的塊。但與 BitTorrent 不同的是,BitSwap 不限於一個torrent中的塊。BitSwap 節點可以從整個IPFS網路獲取所需的塊,而不管這些塊屬於哪些檔案,這大大提高了下載效率。同時,網路中存在一些激勵節點會主動快取和傳播稀有的檔案片段。
3.4.1 信用體系我們希望所有的節點都樂於分享他們擁有的塊,但某些自私節點只從P2P網路中獲取塊,而從不做種。IPFS使用了一套簡單的信用系統來解決這個問題。• 從其他節點獲取塊會產生“債務”,向其他節點傳送塊可以償還“債務”• 每個節點都記錄與相連節點間的“債務”情況• 欠債越多的節點其優先順序越低,如果一個節點只獲取而從不奉獻將會很快被    其他節點進行忽略超時操作。
3.4.2 策略BitSwap 採用的不同策略對整體的演變表現有著非常不同的影響。在 BitTorrent 中,雖然規定了標準策略,但是也已經實現了許多其他方法,從 BitTyrant (儘可能分享)到BitThief(利用漏洞並且永遠不會分享),到 PropShare (按比例分享)。我們需要的策略的目標應該是:1.   最大化節點的交易效能和整體交換效率2.   防止“吃白食”的情況發生
3.   有效抵抗其他未知策略4.   對受信任的節點限制寬鬆一種在實踐中可行的策略是一個跟債務率掛鉤的演算法節點的負債率 r = bytes_sent / (bytes_recv + 1)傳送率 P (send|r) = 1− 1/(1+exp(6−3r))當節點的負債率超過已建立信用額度的兩倍時,傳送率迅速降低。
3.4.3 賬單BitSwap 節點維持與其他節點的傳輸計費賬單,當節點間建立連線時,雙方交換賬單,如果賬單不匹配,則清除已有賬單,重新開始記賬。當然,惡意節點可能會故意丟失賬單,希望清除債務,其他節點可以將其視作不當行為,並拒絕。賬單的資料結構如下:type Ledger struct {owner      NodeIdpartner    NodeId
bytes_sent intbytes_recv inttimestamp  Timestamp}3.4.4 介面規範// Additionalstate kept
type BitSwap struct{ledgersmap[NodeId]Ledger// Ledgers knownto this node, inc inactiveactive map[NodeId]Peer// currently openconnections to other nodesneed_list []Multihash
// checksums ofblocks this node needshave_list[]Multihash// checksums ofblocks this node has}type Peer struct {nodeid NodeId
ledger Ledger// Ledger between the node and this peerlast_seenTimestamp// timestamp oflast received messagewant_list[]Multihash// checksums ofall blocks wanted by peer
// includes blocks wanted by peer’s peers}// Protocol interface:interface Peer {open (nodeid:NodeId, ledger :Ledger);send_want_list(want_list :WantList);
send_block (block :Block) -> (complete :Bool);close (final :Bool);}3.5 Merkle DAGDHT 和 BitSwap 技術讓 IPFS形成一個用於快速而強大的儲存和分發塊的 P2P 系統。在此之上,IPFS還構建了一種有向無環圖 Merkle DAG,使用嵌入資料來源中的目標雜湊雜湊構建物件之間的連結。Merkle DAGs 為IPFS提供了許多有用的屬性,包括:
1. 內容定址:所有內容(包括連結)都由其多雜湊校驗和進行唯一標識2. 防篡改:所有內容都使用其校驗和進行驗證。如果資料被篡改或損壞,則IPFS會檢測到該資料。3. 去冗餘:所有內容完全相同的物件,只儲存一次。這對索引物件特別有,比如git tree和commits,或者是公共部分的資料。IPFS物件的定義如下:type IPFSLink struct{Name string
// name or aliasof this linkHash Multihash// cryptographichash of targetSize int// total size oftarget}
type IPFSObject struct {links []IPFSLink// array of linksdata []byte// opaque contentdata}
Merkle DAG 是一種非常靈活的資料儲存方式,唯一的要求是 a) 使用內容定址 b) 使用上述編碼格式。這使得我們可以用路徑的方式訪問物件, /ipfs/<hash-of-object>/<name-path-to-object>,如:/ipfs/XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x/test/foo.txt3.6 檔案系統在 Merkle DAG 之上,IPFS還定義了一組物件用於對版本化檔案系統進行建模。這個物件模型類似於Git:1. block: 可變大小的資料塊。
2. list:塊或其他列表的集合。3. tree:塊、列表或其他樹的集合。4. commit:樹的版本歷史中的快照。3.6.1 blobblob 物件包含了可定址的資料單元,表示一個檔案。{
“data”:”some data here”,// blobs 是沒有 link 的}一個IPFS檔案由 blobs 和 lists 構成3.6.2 listlist 物件將很多去重的 blobs 連線到一起,包含了一組有序的 blob 或 list 物件。
{    ”data”:["blob", "list", "blob"],// 列表裡的資料型別和links裡面的一一對應“links”: [{"hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x","size": 189458},
{ "hash":"XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5","size":19441 },{ "hash":"XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z","size":5286 }// listshave no names in links]
}3.6.3 treetree 物件代表一個路徑,內容包括 blob、list、tree、commit,同時標記了物件的名稱。{“data”: ["blob","list", "blob"],// trees have anarray of object types as data
“links”:[{ "hash":"XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x","name":"less", "size":189458 },{ "hash":"XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5","name":"script", "size":19441 },{ "hash":"XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z",
"name": "template","size": 5286}// treesdo have names]}3.6.4 commitcommit 物件代表物件的歷史快照。
{    ”data”: {“type”:”tree”,“date”:”2014-09-20 12:44:06Z”,“message”:”This is a commit message.”},
“links”: [{ "hash":"XLa1qMBKiSEEDhojb9FFZ4tEvLf7FEQdhdU","name":"parent","size": 25309 },{ "hash":"XLGw74KAy9junbh28x7ccWov9inu1Vo7pnX","name":"object", "size":5198 },{ "hash":"XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm",
"name":"author", "size":109 }]}3.7 命名和可變狀態到目前為止,IPFS堆疊形成了構建內容定址物件 DAG 的P2P交換。它可以用於釋出和檢索不可變的物件,甚至可以跟蹤這些物件的版本歷史。但是,仍缺少一個關鍵元件:可變命名。沒有它,使用者就得在IPFS系統外獲取到新的內容地址了。3.7.1 自驗證命名
1.   定義節點的NodeId為該節點公鑰的雜湊2.   透過 /ipns/的方式可以訪問該節點下的內容3.   當其他節點從該節點獲取檔案時,可以驗證其公鑰和NodeId是否匹配透過自驗證命名,我們可以實現這樣的訪問效果  /ipns/<NodeId>/docs/test.md而不必用/ipfs/<test.md’s Hash>這樣的方式3.7.2 更加友好的命名方式
自驗證命名雖然解決了一些問題,但對使用者來說還不夠友好, IPFS提供瞭如下解決方案:1. 節點連結透過執行 ipfs link //friends/bob /便可將 bob 節點連結到 alice 節點的 friends/bob 路徑下,這樣只需要知 道alice的地址就可以訪問bob了2.  域名訪問IPNS可以從域名的TXT記錄裡獲取IPFS雜湊地址,然後根據這個雜湊地址從IPFS網路中獲取資料
例如我們設定 ipfs.benet.ai 的TXT記錄為”ipfs=XLF2ipQ4jD3U …”,訪問 /ipns/ipfs.benet.ai 便相當於 ipns/XLF2ipQ4jD3U …3. Proquint可發音方案IPNS支援將雜湊地址譯成可發音的單詞例如 /ipns/dahih-dolij-sozuk-vosah-luvar-fuluh將解析為 /ipns/KhAwNprxYVxKqpDZ
4. 短地址服務以shorten.er為例,使用者可以獲得一個指向特定地址的連結例如 /ipns/shorten.er/foobar將解析為 /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm這時shorten.er就類似於我們今天使用的DNS伺服器了。4. 基於IPFS的應用
•    ipfs.pics - 免費的永久圖床,上傳和分享你的圖片。•    OrbitChat - 基於IPFS的去中心化聊天室,使用者可以自由建立和加入channel並參與討論。•    Neocities - 免費幫助人們創作和釋出網頁的組織,將使用者上傳的網頁永久儲存在IPFS網路中,即使Neocities關閉了,人們仍然可以在IPFS網路中瀏覽到這些創作。•    AKASHA - 基於IPFS和以太坊的下一代社交部落格平臺。•    git-ipfs-rehost - 將你的git倉庫託管在IPFS網路上。•    GlobalUpload - 檔案傳輸服務
•    IPFSSEARCH - 搜尋IPFS網路中的內容5. IPFS與區塊鏈技術的結合IPFS彌補了現有區塊鏈系統在檔案儲存方面的短板,將IPFS的永久檔案儲存和區塊鏈的不可篡改、時間戳證明特性結合,非常適合應用於保護版權、身份證明、來源證明等方面。同時用基於區塊鏈的代幣來激勵IPFS節點儲存資料也是最好的選擇。在去中心化的世界裡,QTUM智慧合約提供各種邏輯服務,IPFS提供檔案資源,兩者結合,共同構建去中心化的網路世界。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;