首頁 > 軟體

巨量資料搬上區塊鏈—Ubuntu部署IPFS實踐

2020-06-16 16:44:26

一、IPFS簡介

IPFS(InterPlanetary File System)是一個對等的分散式超媒體分發協定,它整合了過去幾年最好的分散式系統思路,為所有人提供全球統一的可定址空間,包括Git、自證明檔案系統SFS、BitTorrent和DHT,同時也被認為是最有可能取代HTTP的新一代網際網路協定。

IPFS用基於內容的定址替代傳統的基於域名的定址,使用者不需要關心伺服器的位置,不用考慮檔案儲存的名字和路徑。我們將一個檔案放到IPFS節點中,將會得到基於其內容計算出的唯一加密雜湊值。雜湊值直接反映檔案的內容,哪怕只修改1位元,雜湊值也會完全不同。當IPFS被請求一個檔案雜湊時,它會使用一個分散式雜湊表找到檔案所在的節點,取回檔案並驗證檔案資料。

IPFS是通用目的的基礎架構,基本沒有儲存上的限制。大檔案會被切分成小的分塊,下載的時候可以從多個伺服器同時獲取。IPFS的網路是不固定的、細粒度的、分散式的網路,可以很好的適應內容分發網路的要求。這樣的設計可以很好的共用各類資料,包括影象、視訊流、分散式資料庫、整個作業系統、模組鏈、8英寸軟碟的備份,還有靜態網站。

IPFS提供了一個友好的WEB存取介面,使用者可以通過http://ipfs.io/ipfs/雜湊串獲取IPFS網路中的內容,也許在不久的將來,IPFS協定將會徹底替代傳統的HTTP協定。

二、IPFS本地環境安裝

2.1、下載安裝包

開啟https://dist.ipfs.io/#go-ipfs,頁面會自動根據你的作業系統提供適合的下載安裝包,點選下載按鈕即可。
 筆者是在Ubuntu下安裝,所以下載go-ipfs的地址為:https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz(目錄為:https://dist.ipfs.io/go-ipfs/,可以下面查詢相關版本)
 通過wget命令下載報錯,提示拒絕連線,接下來在瀏覽器中手工下載。

2.2、安裝

我們將壓縮包上傳到家目錄,如:/home/simon/,然後解壓。
$ tar xvfz go-ipfs_v0.4.15_linux-amd64.tar.gz
go-ipfs/build-log
go-ipfs/install.sh
go-ipfs/ipfs
go-ipfs/LICENSE
go-ipfs/README.md

$ cd go-ipfs
$ sudo mv ipfs /usr/local/bin/ipfs
$ ipfs version #檢視版本
ipfs version 0.4.15
$ ipfs help #檢視幫助文件

USAGE
  ipfs - Global p2p merkle-dag filesystem.

  ipfs [--config=<config> | -c] [--debug=<debug> | -D] [--help=<help>] [-h=<h>] [--local=<local> | -L] [--api=<api>] <command> ...

SUBCOMMANDS
  BASIC COMMANDS
    init          Initialize ipfs local configuration
    add <path>    Add a file to IPFS
    cat <ref>    Show IPFS object data
    get <ref>    Download IPFS objects
    ls <ref>      List links from an object
    refs <ref>    List hashes of links from an object
 
  DATA STRUCTURE COMMANDS
    block        Interact with raw blocks in the datastore
    object        Interact with raw dag nodes
    files        Interact with objects as if they were a unix filesystem
    dag          Interact with IPLD documents (experimental)
 
  ADVANCED COMMANDS
    daemon        Start a long-running daemon process
    mount        Mount an IPFS read-only mountpoint
    resolve      Resolve any type of name
    name          Publish and resolve IPNS names
    key          Create and list IPNS name keypairs
    dns          Resolve DNS links
    pin          Pin objects to local storage
    repo          Manipulate the IPFS repository
    stats        Various operational stats
    p2p          Libp2p stream mounting
    filestore    Manage the filestore (experimental)
 
  NETWORK COMMANDS
    id            Show info about IPFS peers
    bootstrap    Add or remove bootstrap peers
    swarm        Manage connections to the p2p network
    dht          Query the DHT for values or peers
    ping          Measure the latency of a connection
    diag          Print diagnostics
 
  TOOL COMMANDS
    config        Manage configuration
    version      Show ipfs version information
    update        Download and apply go-ipfs updates
    commands      List all available commands
 
  Use 'ipfs <command> --help' to learn more about each command.
 
  ipfs uses a repository in the local file system. By default, the repo is
  located at ~/.ipfs. To change the repo location, set the $IPFS_PATH
  environment variable:
 
    export IPFS_PATH=/path/to/ipfsrepo
 
  EXIT STATUS
 
  The CLI will exit with one of the following values:
 
  0    Successful execution.
  1    Failed executions.


看到版本號或幫助資訊了,說明我們已經安裝成功了。

三、專案設定

3.1、建立ipfs節點

為了執行專案,我們需要通過在本地建立一個IPFS節點。
$ ipfs init

initializing IPFS node at /home/simon/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR
to get started, enter:

    ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme #這一行記錄下來,稍後我們還會用到

$ cd /home/simon/
$ ll -a
drwxrwxr-x  5 simon simon    4096 5月  15 18:39 .ipfs/ #多出了這樣一個資料夾
#......其它檔案,略

ipfs在家目錄/home/simon/下建立一個.ipfs資料夾,通過ll -a可以檢視到。

3.2、修改節點預設儲存空間

假設我們現在需要將本地節點的可使用硬碟容量設定成20G,
$ cd /home/simon/.ipfs
$ export EDITOR=/usr/bin/vim  #定義預設編輯器,也可以修改成/usr/bin/vi
$ ipfs config edit #修改ipfs組態檔

搜尋StorageMax關鍵詞,定位到第7行,將預設的10GB修改成20GB,儲存即可。

3.3、檢視節點id
$ ipfs id
{
    "ID": "QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR",
    "PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCkqFba44pvyyFdUlaHaSUeggzP3jCJIuk13fvCpV4F132M0hTpP9ZX7JvvtBO4KY68Y+TshEXJTtVX8dApQNemhitmleiOs+ADcONLJ4y2l+bydraThh+XEq1XdfpjIUL4Ud0tm7Z47zdQFilzmZu5CFfKWt7ad9Ua8HKilasn1Ic6VLmKcNaK5+0YA58tcn8EJcudmr8orwZXKRNl8InS4d2eawpU2xSv9PUFVEb4UGheg/6EghNDjABcWBR6Z6RyRvGYU5q770DdObmRJTf1PJmyIX4yxHL2WWCaKlPEUXNQROV/Pb+3Mu0UsJGMriAfq40L8nZkF0egqUQB0eCvAgMBAAE=",
    "Addresses": null,
    "AgentVersion": "go-ipfs/0.4.15/",
    "ProtocolVersion": "ipfs/0.1.0"
}

QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR即我們的節點ID,與我們的身份證一樣,表示節點在ipfs網路中的唯一標識。

3.4 新建測試檔案並新增到本地節點

3.4.1 檔案儲存測試
 在家目錄/home/simon/test下新建一個檔案檔案file.txt,
$ cd ~
$ mkdir test
$ cd test
$ vim file.txt
#輸入
Hello,歐陽!
#儲存
$ ipfs add file.txt #將檔案新增到本地節點
added QmYRn59kceZAYG7ARsgCFwNBiwqoHwiw7idGsonAAgkiJC file.txt
$ ipfs cat QmYRn59kceZAYG7ARsgCFwNBiwqoHwiw7idGsonAAgkiJC #檢視檔案寫入情況
Hello,歐陽!

可以看到我們已經將 file.txt 加入到本地節點中,一會在我們啟動節點伺服器並將本地節點內容同步到IPFS網路上時,便可以通過https://ipfs.io/ipfs/QmYRn59kceZAYG7ARsgCFwNBiwqoHwiw7idGsonAAgkiJC進行存取。

3.4.2 圖片儲存測試
如果我們需要儲存圖片咋辦?我們來上傳一張圖片colorbay.jpg到/home/simon/test目錄下,
$ ipfs add ./colorbay.jpg #將當前目錄下的圖片新增到本地節點
added QmakjbW9kUdSnwQCeTiGDvXErhPYi6kNNqaSdGsubz6Tsk colorbay.jpg


可以看到我們的圖片已經生成了雜湊值,同樣的,一會在我們啟動節點伺服器並將本地節點內容同步到IPFS網路上時,便可以通過https://ipfs.io/ipfs/QmakjbW9kUdSnwQCeTiGDvXErhPYi6kNNqaSdGsubz6Tsk進行存取。(其他檔案格式的測試,略)

如果我們要對file.txt或colorbay.jpg的內容做了修改咋辦?
答:那我們可以在本地修改好檔案,重新執行ipfs add 檔名,生成新的雜湊值即可。

3.5、啟動節點伺服器
$ ipfs daemon

Initializing daemon...
Successfully raised file descriptor limit to 2048.
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.60.147/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit/ipfs/QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.60.147/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready


此時我們已經啟動了節點伺服器,本地節點資料在同步到IPFS網路中,稍後我們可以通過上面的檔案網址在瀏覽器中進行存取了。


如果打不開,可以耐心等待一會,多重新整理幾次,因為節點同步資料需要一點時間。

3.6、跨域資源共用CORS設定

為了後續開發方便,我們還需要對跨域資源共用(CORS)進行設定,將3.4小節中的視窗按ctrl + c 退出 ipfs,然後依次執行下面的命令進行跨域設定即可。
$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]'
$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials '["true"]'
$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Headers '["Authorization"]'
$ ipfs config --json API.HTTPHeaders.Access-Control-Expose-Headers '["Location"]'


3.7、驗證

再次啟動節點伺服器,
$ ipfs daemon


新開一個終端視窗,
$ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║    ██║    ███████║
╚═╝╚═╝    ╚═╝    ╚══════╝

If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!

 -------------------------------------------------------
| Warning:                                              |
|  This is alpha software. Use at your own discretion! |
|  Much is missing or lacking polish. There are bugs.  |
|  Not yet secure. Read the security notes for more.  |
 -------------------------------------------------------

Check out some of the other files in this directory:

  ./about
  ./help
  ./quick-start    <-- usage examples
  ./readme          <-- this file
  ./security-notes


在Ubuntu中,在瀏覽器中輸入下面的網址http://localhost:5001/webui,可以看到我們原生的節點資訊,以及全球的節點資訊,也可以查詢到時我們上面檔案的雜湊對應的檔案內容。

總結

有了IPFS這個協定,彌補了區塊鏈只能攜帶少量資料的缺陷。如果我們需要把大檔案上到區塊鏈中,那我們可以先將檔案上傳到IPFS中生成一個唯一標識(雜湊),再將這個唯一標識寫入區塊鏈中,這個方案讓下一代網際網路實現價值傳遞變得無限可能!

學習階段,文章有誤之處,歡迎指正!


IT145.com E-mail:sddin#qq.com