1. 程式人生 > >IPFS(InterPlanetary File System,星際檔案系統)安裝與環境配置

IPFS(InterPlanetary File System,星際檔案系統)安裝與環境配置

IPFS(InterPlanetary File System,星際檔案系統)是去中心化的,本文是介紹IPFS節點軟體的系統環境搭建安裝與使用方法的入門教程,並且介紹如何使用ipfs-api和Node.js訪問IPFS網路。

1.ipfs節點安裝與使用

1.1下載節點軟體

到官網下載windows版的ipfs節點軟體:32位,64位 如果你不能訪問官網,可以使用百度雲盤映象:32位,64位

1.2解壓節點軟體

下載後解壓到指定目錄,例如d:\go-ipfs,開一個控制檯視窗,測試:

  D:\go-ipfs > ipfs version
        Ipfs version 0.4.14

可以將該目錄加入環境變數PATH, path env 或者將d:\go-ipfs\ipfs.exe拷貝到windows系統目錄,以便在任何目錄中可以啟動ipfs.exe。

1.3 初始化本地倉庫

和git類似,ipfs節點也需要先初始化一個本地倉庫。執行init子命令來初始化本地倉庫:

D:\go-ipfs> ipfs init
Initializing IPFS node at C:\Users\hubwiz\.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmQaTgU1TLNHPBEvLGgWK1G9FgVByyUZNVhDs789uWPtku
to get
started, enter: ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

預設情況下,ipfs將在當前使用者主目錄(例如:對於hubwiz使用者,其主目錄就是C:\Users\hubwiz)下建立.ipfs子目錄,作為本地倉庫的根目錄。

如果你的C盤空間不夠大,或者你就是希望使用其他目錄作為本地倉庫根目錄,可以設定IPFS_PATH環境變數,使其指向目標路徑,例如D:\my_ipfs_root ipfs-path

1.4重新初始化

如果你期望重新初始化節點,會提醒你不能這麼做,否則會改寫你的金鑰:

D
:\go-ipfs> ipfs init Initializing IPFS node at C:\Users\hubwiz\.ipfs Error: ipfs configuration file already exists! Reinitializing would overwrite your keys.

這擋不住我們。如果你必須重新初始化的話,先刪除原來的倉庫根目錄即可:

D:\go-ipfs> del C:\users\hubwiz\.ipfs

1.5將檔案新增到本地倉庫

使用add子命令將指定的檔案新增到本地倉庫,例如將當前目錄的README.md檔案新增到本地倉庫:

D:\go-ipfs> ipfs add README.md
465 B / ? [-------------------------------------------------------=--] 
added QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8 README.md

ipfs會根據檔案的內容生成一個雜湊值,例如:

QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8

你需要記錄下這個編碼,因為需要使用它來訪問本地倉庫(或ipfs網路)中的檔案。 注意:ipfs並不會無節制地將你本地倉庫中的檔案分佈到其他ipfs節點中,如果沒有其他的ipfs節點搜尋你的檔案(的雜湊值),那麼你本地倉庫中的檔案將始終只存在於本地。

1.6訪問ipfs檔案

Ipfs網路中只能通過內容的雜湊值來訪問檔案,例如對於上面的README.md檔案,我們使用cat子命令通過其雜湊值來檢視其內容:

D:\go-ipfs> ipfs cat QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8

控制檯將輸出內容:

\# ipfs commandline tool

This is the [ipfs](http://ipfs.io) commandline tool. It contains a full ipfs node.
......

1.7 將節點接入網路

執行daemon子命令將節點接入ipfs網路:

D:\go-ipfs> ipfs daemon
Initializing daemon...
......
Daemon is ready

只有當啟動監聽後,節點才能夠接受ipfs網路中的內容檢索請求,參與內容的交換與分佈。

可以按Ctrl+C退出監聽狀態。 ?

2. ipfs-api安裝與使用

Ipfs節點提供和REST API介面,可供我們在程式程式碼中操作節點進行檔案的上傳等操作。不過大多數情況下,我們並不需要直接操作這個REST開發介面,而是使用經過封裝的更友好的ipfs-api,一個nodejs包。

2.1安裝nodejs

到官網下載nodejs安裝包:32位,64位。下載後雙擊進行安裝即可。

開一個控制檯視窗,測試:

C:\Users\hubwiz> node -v
V8.11.1

2.2安裝ipfs-api

Ipfs-api的安裝需要git命令列,因此我們先安裝git。從官網下載git安裝包:32位,64位。下載後雙擊安裝即可。

執行git命令測試:

D:\test-ipfs-api> git version
git version 2.16.2.windows.1

ipfs-api需要編譯原生node模組,因此需要安裝VisualStudio 2015和python27。

官網下載VisualStudio 2015社群版,雙擊安裝即可。 官網下載Python27安裝包,雙擊安裝並設定PATH環境變數使python可用。

重新開一個控制檯,使環境變數生效。現在安裝ipfs-api:

D:\test-ipfs-api> npm install ipfs-api
+ ipfs-[email protected]20.0.1
added 1 package, updated 1 package and moved 1 package in 22.138s

2.3測試程式碼 – nodejs

在D:\test-ipfs-api目錄下建立一個測試指令碼test.js:

const ipfsAPI = require('ipfs-api')
const ipfs = ipfsAPI('localhost', '5001', {protocol: 'http'})
const buffer = Buffer.from('this is a demo')
ipfs.add(buffer)
    .then( rsp => console.log(rsp[0].hash))
.catch(err => console.error(err))

執行這個指令碼:

D:\test-ipfs-api> node test.js
QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i
也就是說,我們將內容this is a demo新增到本地倉庫後,得到雜湊值 QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i。現在可以使用cat子命令來檢視這個雜湊值對應的內容:

D:\test-ipfs-api> ipfs cat QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i  

控制檯會輸出我們之前上傳的內容:

this is a demo

ipfs進入監聽狀態後,提供了一個http閘道器,讓我們可以使用瀏覽器來訪問ipfs上的內容。閘道器預設在本機(127.0.0.1)的8080埠監聽,因此使用你的瀏覽器訪問這個URL:

3. 在瀏覽器中訪問ipfs

ipfs-api也支援在browser使用。最簡單的方法是使用專門針對瀏覽器的封裝庫,在html中引用即可:

這個特別封裝的庫會建立一個全域性物件ipfsAPI,我們在瀏覽器指令碼中可以直接使用,例如:

var ipfs = window.IpfsApi(‘localhost’, ‘5001’) 這種方法比較簡單,因此下文不再描述。接下來我們將使用更加工程化的方法, 採用webpack來直接在前端指令碼中使用ipfs-api的nodejs包。

3.1 HTML頁面

在D:\test-ipfs-api目錄下建立index.html:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <textarea id="content">THIS IS ANOTHER DEMO</textarea>
  <button id="upload">Upload</button>
  <script src="./bundle.js"></script>
</body>
</html>

我們的目標是,當點選按鈕時,我們將文字框的內容上傳到ipfs

3.2前端指令碼

在D:\test-ipfs-api目錄下編寫指令碼app.js:

import ipfsAPI from 'ipfs-api'
const ipfs = ipfsAPI('localhost', '5001', {protocol: 'http'})

window.addEventListener('load', function() {
  let btn = document.querySelector('#upload')
let txt = document.querySelector('#content')
btn.addEventListener('click',()=>{
    let buffer = Buffer.from(txt.value, 'utf-8');
    ipfs.add(buffer)
      .then( rsp => console.log(rsp[0].hash))
.catch(err => console.error(err))
})  
})

3.3 webpack配置

在D:\test-ipfs-api目錄下編寫配置檔案webpack.config.js:

const webpack = require('webpack');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  entry: './app.js',
  output: {
    path: path.resolve(__dirname),
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        loader: 'babel-loader',
        query: {
          presets: ['es2015'],
          plugins: ['transform-runtime']
        }
      }
    ]
  }
}

3.4前端指令碼打包

執行webpack打包:

D:\test-ipfs-api> webpack

3.5 配置ipfs的CORS策略

由於需要從網頁中訪問ipfs節點,這就引入了跨域安全問題,因此我們需要配置ipfs節點使其允許跨域請求:

D:\>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'

3.6 配置ipfs的API監聽地址

由於ipfs節點預設在本機(127.0.0.1)的5001埠監聽API請求,因此如果你的瀏覽器和ipfs節點不在同一臺機器上,需要讓ipfs節點監聽公開地址:

D:\> ipfs config --json Addresses.API '"/ip4/0.0.0.0/tcp/5001"'

當然,如果你的瀏覽器和ipfs節點在同一臺機器上,就不需要進行這個配置了。

3.7配置ipfs的閘道器的監聽地址

由於ipfs節點旳http閘道器預設在本機(127.0.0.1)的8080埠監聽http請求,因此如果你的瀏覽器和ipfs節點不在同一臺機器上,就需要讓ipfs閘道器監聽公開地址:

D:\> ipfs config --json Addresses.Gateway '"/ip4/0.0.0.0/tcp/8080"'

3.8測試網頁

首先啟動ipfs監聽:

D:\>ipfs daemon

然後在測試目錄下啟動web伺服器,這裡使用python內建的簡單伺服器,當然你可以使用任何熟悉的web伺服器:

D:\test-ipfs-api> python –m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

現在開啟你的瀏覽器,訪問http://127.0.0.1:8000/,一切順利的話,你可以看到一個文字框和一個按鈕,點選按鈕,即可將文字框的內容上傳到ipfs節點。