ipfs是去中心化星際檔案系統,本文介紹節點軟體ipfs環境搭建和使用方法,學習ipfs-api在nodejs代碼中通路ipfs網絡。
一、ipfs節點安裝與使用
1.1下載下傳節點軟體
到官網下載下傳windows版的ipfs節點軟體:
32位,
64位如果你不能通路官網,可以使用百度雲盤鏡像:
1.2解壓節點軟體
下載下傳後解壓到指定目錄,例如d:\go-ipfs,開一個控制台視窗,測試:
D:\go-ipfs > ipfs version
Ipfs version 0.4.14
可以将該目錄加入環境變量PATH,

或者将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
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退出監聽狀态。
?
二、ipfs-api安裝與使用
Ipfs節點提供和REST API接口,可供我們在程式代碼中操作節點進行檔案的上傳等操作。不過大多數情況下,我們并不需要直接操作這個REST開發接口,而是使用經過封裝的更友好的ipfs-api,一個nodejs包。
2.1安裝nodejs
到官網下載下傳nodejs安裝包:
。下載下傳後輕按兩下進行安裝即可。
開一個控制台視窗,測試:
C:\Users\hubwiz> node -v
V8.11.1
2.2安裝ipfs-api
Ipfs-api的安裝需要git指令行,是以我們先安裝git。從官網下載下傳git安裝包:
。下載下傳後輕按兩下安裝即可。
執行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
+ [email protected]
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:
http://127.0.0.1:8080/ipfs/QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i
同樣可以看到我們之前上傳的内容。
注意:需要首先啟動監聽器(ipfs daemon)并且你的浏覽器和ipfs節點在同一台計算機。
三、在浏覽器中通路ipfs
ipfs-api也支援在browser使用。最簡單的方法是使用專門針對浏覽器的封裝庫,在html中引用即可:
<script src="https://unpkg.com/ipfs-api/dist/index.js"></script>
這個特别封裝的庫會建立一個全局對象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節點。
如果你希望高效的學習以太坊DApp開發,可以通路彙智網提供的最熱門線上互動教程:
其他更多内容也可以通路
這個以太坊部落格。