IPFS星際文件系統(InterPlanetary File System)是去中心化文件系統,本文介紹IPFS節點軟件系統安裝,環境搭建等簡介入門教程,及學習如何使用ipfs-api和Node.js訪問IPFS網絡。html
到官網下載windows版的ipfs節點軟件:32位,64位
若是你不能訪問官網,能夠使用百度雲盤鏡像:32位,64位前端
下載後解壓到指定目錄,例如d:\go-ipfs,開一個控制檯窗口,測試:node
D:\go-ipfs > ipfs version Ipfs version 0.4.14
能夠將該目錄加入環境變量PATH,
python
或者將d:\go-ipfs\ipfs.exe拷貝到windows系統目錄,以便在任何目錄中能夠啓動ipfs.exe。linux
和git相似,ipfs節點也須要先初始化一個本地倉庫。執行init子命令來初始化本地倉庫:webpack
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子目錄,做爲本地倉庫的根目錄。git
若是你的C盤空間不夠大,或者你就是但願使用其餘目錄做爲本地倉庫根目錄,能夠設置IPFS_PATH環境變量,使其指向目標路徑,例如D:\my_ipfs_root
github
若是你指望從新初始化節點,會提醒你不能這麼作,不然會改寫你的密鑰:web
D:\go-ipfs> ipfs init Initializing IPFS node at C:\Users\hubwiz\.ipfs Error: ipfs configuration file already exists! Reinitializing would overwrite your keys.
這擋不住咱們。若是你必須從新初始化的話,先刪除原來的倉庫根目錄便可:npm
D:\go-ipfs> del C:\users\hubwiz\.ipfs
使用add子命令將指定的文件添加到本地倉庫,例如將當前目錄的README.md文件添加到本地倉庫:
D:\go-ipfs> ipfs add README.md 465 B / ? [-------------------------------------------------------=--] added QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8 README.md
ipfs會根據文件的內容生成一個哈希值,例如:
QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8
你須要記錄下這個編碼,由於須要使用它來訪問本地倉庫(或ipfs網絡)中的文件。
注意:ipfs並不會無節制地將你本地倉庫中的文件分佈到其餘ipfs節點中,若是沒有其餘的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. ......
執行daemon子命令將節點接入ipfs網絡:
D:\go-ipfs> ipfs daemon Initializing daemon... ...... Daemon is ready
只有當啓動監聽後,節點纔可以接受ipfs網絡中的內容檢索請求,參與內容的交換與分佈。
能夠按Ctrl+C退出監聽狀態。
?
Ipfs節點提供和REST API接口,可供咱們在程序代碼中操做節點進行文件的上傳等操做。不過大多數狀況下,咱們並不須要直接操做這個REST開發接口,而是使用通過封裝的更友好的ipfs-api,一個nodejs包。
到官網下載nodejs安裝包:32位,64位。下載後雙擊進行安裝便可。
開一個控制檯窗口,測試:
C:\Users\hubwiz> node -v V8.11.1
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-api@20.0.1 added 1 package, updated 1 package and moved 1 package in 22.138s
在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-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包。
在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
在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)) }) })
在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'] } } ] } }
執行webpack打包:
D:\test-ipfs-api> webpack
因爲須要從網頁中訪問ipfs節點,這就引入了跨域安全問題,所以咱們須要配置ipfs節點使其容許跨域請求:
D:\>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
因爲ipfs節點默認在本機(127.0.0.1)的5001端口監聽API請求,所以若是你的瀏覽器和ipfs節點不在同一臺機器上,須要讓ipfs節點監聽公開地址:
D:\> ipfs config --json Addresses.API '"/ip4/0.0.0.0/tcp/5001"'
固然,若是你的瀏覽器和ipfs節點在同一臺機器上,就不須要進行這個配置了。
因爲ipfs節點旳http網關默認在本機(127.0.0.1)的8080端口監聽http請求,所以若是你的瀏覽器和ipfs節點不在同一臺機器上,就須要讓ipfs網關監聽公開地址:
D:\> ipfs config --json Addresses.Gateway '"/ip4/0.0.0.0/tcp/8080"'
首先啓動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 實戰開發入門
區塊鏈開發進階:去中心化以太坊 DApp 電商平臺實戰開發