IPFS是什麼?

IPFS 是什麼

IPFS(InterPlanetary File System,星際文件系統)是永久的、去中心化保存和共享文件的方法,這是一種內容可尋址、版本化、點對點超媒體的分佈式協議。git

  • 內容可尋址:經過文件內容生成惟一哈希值來標識文件,而不是經過文件保存位置來標識。相同內容的文件在系統中只會存在一份,節約存儲空間
  • 版本化:可追溯文件修改歷史
  • 點對點超媒體:P2P 保存各類各樣類型的數據

能夠把 IPFS 想象成全部文件數據是在同一個 BitTorrent 羣而且經過同一個 Git 倉庫存取。github

總之,它集一些成功系統(分佈式哈希表、BitTorrent、Git、自認證文件系統)的優點於一身,是一套很厲害的文件存取系統。golang

IPFS 使用場景

IPFS 的發明者 Juan Benet(juan@benet.ai)在 IPFS 技術白皮書中假設了一些使用場景:web

  • 在 /ipfs 和 /ipns 下掛載全球文件系統
  • 掛載的我的同步文件夾,擁有版本功能
  • 文件加密,數據共享系統
  • 可用於全部軟件的帶版本的包管理器(已經實現了:https://github.com/whyrusleeping/gx
  • 能夠做爲虛機的根文件系統
  • 能夠做爲數據庫:應用能夠直接操做 Merkle DAG,擁有 IPFS 提供的版本化、緩存以及分佈式特性
  • 能夠作(加密)通信平臺
  • 各類類型的 CDN
  • 永久的 Web,不存在不能訪問的連接

我以爲做爲數據庫這一點對應用開發者來講會頗有用。數據庫

安裝與初始化

下載 go-ipfs 解壓(下面的示例我是在 Windows 10 上作的,解壓目錄爲 D:\go-ipfs),而後到解壓目錄執行命令 ipfs init,將在用戶 home(~)下創建 .ipfs 目錄存放數據,默認最大存儲 10G。init 命令能夠帶參,好比修改最大存儲、目錄等,具體參考 ipfs init help瀏覽器

繼續執行命令 ipfs daemon 啓動節點服務器:緩存

  • 加入 IPFS 網絡
  • 本地 HTTP 服務器,默認 8080 端口
  • 處理後續 ipfs 的客戶端命令

新開一個命令行,執行命令 ipfs id 以查看當前節點標識:服務器

{
    "ID": "QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R",
    "PublicKey": "....",
    "Addresses": [
      "/ip4/169.254.40.215/tcp/4001/ipfs/...",
      ....
    ],
    "AgentVersion": "go-ipfs/0.4.12/",
    "ProtocolVersion": "ipfs/0.1.0"
}

{ "ID": "QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R", "PublicKey": "....", "Addresses": [ "/ip4/169.254.40.215/tcp/4001/ipfs/...", .... ], "AgentVersion": "go-ipfs/0.4.12/", "ProtocolVersion": "ipfs/0.1.0" } 網絡

瀏覽器訪問 http://localhost:5001/webui 進入管理界面,查看系統狀態、管理文件以及配置系統。tcp

配置

除了使用 Web 管理界面修改配置外,也能夠直接用命令行 ipfs config show > ipfs.conf 先導出當前配置(JSON 格式,配置項很少且含義明顯),改完後使用 ipfs config replace ipfs.conf 更新配置,重啓服務器就生效了。固然,修改配置也能夠直接用 ipfs config edit

服務器最終使用的配置文件保存在 ~/.ipfs/config 中,對比剛剛導出的文件咱們發現導出的文件只比這個 config 少了一項 Identity.PrivKey,即節點初始化時自動生成的 RSA 私鑰。

密鑰對

節點初始化時會自動生成 RSA 密鑰對,而且私鑰沒有設置密碼。

公鑰經過多重哈希獲得節點 id(即上面的 QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R),節點服務器啓動後會和其餘節點交互公鑰,後續通信時使用對方公鑰加密數據,經過多重哈希對方公鑰、對比對方節點 id 來確認是否正在和正確的節點交互。

私鑰用來解密接收到的數據,也用於 ipns 來綁定文件名。整個過程沒有引入證書,僅是使用了 PKI 機制。

總之,我以爲能夠暫時不用關心密鑰對,可能只有在一些使用場景下面才須要吧。

添加文件

我當前目錄結構是這樣的:

D:\GO-IPFS
│  build-log
│  config
│  install.sh
│  ipfs.conf
│  ipfs.exe
│  LICENSE
│  README.md
│
└─b3log
    └─hacpai
            README.md

D:\GO-IPFS │ build-log │ config │ install.sh │ ipfs.conf │ ipfs.exe │ LICENSE │ README.md │ └─b3log └─hacpai README.md

我準備添加的目錄是 b3log,執行命令:

D:\go-ipfs>ipfs add -r b3log
 94 B / 94 B [=============================================================================================] 100.00% 0s
added Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv b3log/hacpai/README.md
added Qmbkno2HVZdW7XfwsVjmuu9VDKBByczFR8qwsBXMjMrjPQ b3log/hacpai
added QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 b3log

D:\go-ipfs>ipfs add -r b3log 94 B / 94 B [=============================================================================================] 100.00% 0s added Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv b3log/hacpai/README.md added Qmbkno2HVZdW7XfwsVjmuu9VDKBByczFR8qwsBXMjMrjPQ b3log/hacpai added QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 b3log

這樣咱們使用 ipfs cat /ipfs/Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv 就能夠查看 README.md 了。在其餘節點上也能夠,只要記住這個文件的哈希值就好了。咱們能夠在本身的 HTTP 網關上試試(注意個人端口改爲了 5002,你的默認應該是 8080):

9070383bdece4f6792a561c7b4fa98c4-image.png

固然也能夠用 ipfs 官方的 HTTP 網關:https://ipfs.io/ipfs/Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv

獲取文件

ipfs get /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R

ipfs get /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R

將獲取剛纔咱們發佈的 b3log 目錄。

Pin

IPFS 的本意是讓用戶以爲全部文件都是在本地的,沒有「從遠程服務器上下載文件」。Pin 是將文件長期保留在本地,不被垃圾回收。

執行 ipfs pin ls 能夠查看哪些文件在本地是持久化的,經過 add 添加的文件默認就是 pin 過的。

綁定節點名

每次修改文件後 add 都會返回不一樣的哈希,這對於網站來講就無法固定訪問地址了,因此咱們須要經過 ipns 來「綁定」節點名。

上面 b3log 目錄的哈希值是 QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9,咱們將整個目錄做爲節點根目錄發佈:

D:\go-ipfs>ipfs name publish QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9
Published to QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R: /ipfs/QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9

D:\go-ipfs>ipfs name publish QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 Published to QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R: /ipfs/QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9

而後咱們就能夠經過 ipns 訪問了,注意是 ipns

D:\go-ipfs>ipfs cat /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R/hacpai/README.md
The piper will lead us to reason.

歡迎訪問黑客與畫家的社區 https://hacpai.com

D:\go-ipfs>ipfs cat /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R/hacpai/README.md The piper will lead us to reason. 歡迎訪問黑客與畫家的社區 https://hacpai.com

之後每次更新文件都再 publish 一下就好了。目前(v0.4.12)使用 ipns 訪問會很慢,聽說 v0.4.14 會解決。

DNS 解析

IPFS 容許用戶使用現有的域名系統,這樣就能用一個好記的地址來訪問文件了,好比:

D:\go-ipfs>ipfs cat /ipns/ipfs.b3log.org/hacpai/README.md
The piper will lead us to reason.

歡迎訪問黑客與畫家的社區 https://hacpai.com

D:\go-ipfs>ipfs cat /ipns/ipfs.b3log.org/hacpai/README.md The piper will lead us to reason. 歡迎訪問黑客與畫家的社區 https://hacpai.com

只須要在 DNS 解析加入一條 TXT 記錄:

記錄類型 主機記錄 記錄值
TXT ipfs dnslink=/ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R

總結

  • IPFS 是永久的、去中心化保存和共享文件的方法,這是一種內容可尋址、版本化、點對點超媒體的分佈式協議
  • 咱們能夠用它來存取文件,數據永不丟失
  • 應用能夠用它來作數據庫,自動擁有版本化、緩存及分佈式特性
  • 官方參考實現使用 golang 編寫,JavaScript、Python、C 等語言在陸續開發中
  • 總之,IPFS 是一套很是厲害的文件系統

原文:https://hacpai.com/article/1511015097370
 

推薦兩個以太坊相關的實戰教程:

相關文章
相關標籤/搜索