目錄
- 1 什么是IPFS
- 2 為什么有IPFS
- 3 IPFS的目標
- 4 IPFS包含哪些內容
- 5 IPFS與Filecoin
- 6 IPFS開發入門
- 6.1 部署私有IPFS
- 6.1.1 環境準備
- 6.1.2 配置 golang 環境
- 6.1.3 IPFS部署
- 6.1.4 生成共享key
- 6.1.5 添加網路節點
- 6.1.6 啟動IPFS
- 6.1.7 測驗文本傳輸
- 6.2 架構說明
- 6.2.1 IPFS 總體架構圖
- 6.2.2 CLI、HTTP-API架構圖
- 6.3 Spingboot使用IPFS上傳、下載檔案
- 6.4 相關開源代碼
- 7 遺憾
1 什么是IPFS
IPFS的全稱是星際檔案系統(InterPlanetary File System),它是一個點對點的分布式檔案系統,通過底層協議用戶可以在這個網路里上傳檔案并下載檔案,它將區塊鏈技術與互聯網進行了完美的融合,可以讓我們的互聯網速度更快, 更加安全, 并且更加開放, IPFS協議的目標是取代傳統的互聯網協議HTTP,
IPFS與云存盤的區別
IPFS看上去可能和云儲存有點相似,都是分布式存盤,但是二者內在邏輯完全不同,云儲存通常是由云服務廠商提供,存盤提供方與使用方是一對多的模式,IPFS則是點對點,存盤做到了去中心化,存盤提供方與使用方是多對多的模式,并且由于資料是加密存盤,因此資料也不會被云服務廠商盜用,
2 為什么有IPFS
互聯網是建立在HTTP協議上的,但發展到了今天HTTP逐漸顯示出不足,
HTTP的中心化是低效的, 并且成本很高
使用HTTP協議每次需要從中心化的服務器下載完整的檔案(網頁, 視頻, 圖片等), 速度慢,效率低, 如果改用P2P的方式下載,可以節省近60%的帶寬,P2P將檔案分割為小的塊, 從多個服務器同時下載, 速度非常快,
Web檔案經常被洗掉
http的頁面平均生存周期大約只有100天,Web檔案經常被洗掉(由于存盤成本太高), 無法永久保存,IPFS提供了檔案的歷史版本回溯功能(就像git版本控制工具一樣), 可以很容易的查看檔案的歷史版本, 資料可以得到永久保存,
中心化限制了web的成長
互聯網是一個高度中心化的網路,DDOS等黑客攻擊對互聯網的功能造成了嚴重威脅, 分布式的IPFS可以克服這些缺點,
互聯網應用高度依賴主干網
IPFS將內容分發到邊緣端,可以極大地降低互聯網應用對主干網的依賴,
3 IPFS的目標
IPFS不僅僅是為了加速web,而是為了最終取代HTTP協議, 使互聯網更加美好,
4 IPFS包含哪些內容
IPFS是一個協議,類似http協議
- 定義了基于內容的尋址檔案系統
- 內容分發
- 使用的技術分布式哈希、p2p傳輸、版本管理系統
IPFS是一個檔案系統
- 有檔案夾和檔案
- 可掛載檔案系統
IPFS是一個web協議
- 可以像http那樣查看互聯網頁面
- 未來瀏覽器可以直接支持 ipfs:/ 或者 fs:/ 協議
IPFS是模塊化的協議
- 連接層:通過其他任何網路協議連接
- 路由層:尋找定位檔案所在位置
- 資料塊交換:采用BitTorrent技術
IPFS是一個p2p系統
- 世界范圍內的p2p檔案傳輸網路
- 分布式網路結構
- 沒有單點失效問題
IPFS天生是一個CDN
- 檔案添加到IPFS網路,將會在全世界進行CDN加速
- bittorrent的帶寬管理
IPFS擁有命名服務
- IPNS:基于SFS(自認證系統)命名體系
- 可以和現有域名系統系結
5 IPFS與Filecoin
行業內很多人將IPFS等同于Filecoin,實際上兩者有嚴格區分,PFS是非區塊鏈專案,Filecoin是區塊鏈專案,二者都可以獨立存在,
為激勵云服務廠商、IDC資源提供商以及其他投資者提供高性能、高穩定的服務器加入到IPFS網路中,Filecoin作為激勵代幣而誕生,資源提供方(礦工)通過為客戶提供資料存盤和檢索來獲得原生代幣,存盤方(客戶)需要支付Filecoin作為存盤、分發和檢索資料費用,
Filecoin不是無限量發行的,發行總量20億,其中70%即14億枚用于獎勵貢獻者,每6年減半,
6 IPFS開發入門
6.1 部署私有IPFS
6.1.1 環境準備
系統要求
至少需要2G記憶體,2 核 CPU,
實驗環境
共計兩個節點,192.168.159.102、192.168.159.103,系統采用centos7
環境準備后,按照如下步驟部署ipfs,每個節點都要部署,
6.1.2 配置 golang 環境
下載go
$ cd /home
$ wget https://golang.google.cn/dl/go1.17.1.linux-amd64.tar.gz
$ tar -zxvf go1.17.1.linux-amd64.tar.gz -C /usr/local
配置 golang 環境變數
$ vim /etc/profile
檔案末尾追加
# golang env
export GOROOT=/usr/local/go
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
$ source /etc/profile
# 創建作業目錄:
$ mkdir -p /data/gopath && cd /data/gopath
$ mkdir -p src pkg bin
6.1.3 IPFS部署
所有節點上都需要部署ipfs:
1、安裝
# 下載
$ cd /home
$ wget https://download.fastgit.org/ipfs/go-ipfs/releases/download/v0.9.1/go-ipfs_v0.9.1_linux-amd64.tar.gz
# 解壓縮
$ tar xvfz go-ipfs_v0.9.1_linux-amd64.tar.gz
# 安裝
$ cd go-ipfs/
$ ./install.sh
2、指定IPFS的存盤位置
$ export IPFS_PATH="/opt/ipfs"
3、初始化
$ ipfs init
該操作執行后,默認會在/root/目錄下生成一個隱藏目錄.ipfs,作為ipfs的local存盤,可用ls -a 查看,如果輸出以下代碼則表示初始化成功了:
generating ED25519 keypair...done
peer identity: 12D3KooWPVtCiwDTbf8L8B5pV5PWpW1C4yfzAZaqZpjz3pyzMEig
initializing IPFS node at /opt/ipfs
to get started, enter:
ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme
6.1.4 生成共享key
1、生成Key
選擇任意一個節點執行以下操作:
1)下載key生成工具
$ git clone https://hub.fastgit.org/Kubuxu/go-ipfs-swarm-key-gen.git
2)編譯go-ipfs-swarm-key-gen
$ go build -o ipfs-swarm-key-gen go-ipfs-swarm-key-gen/ipfs-swarm-key-gen/main.go
3)此時在當前目錄下會成一個ipfs-swarm-key-gen的可執行二進制檔案,我們使用該檔案來生成一個swarm.key檔案
$ ./ipfs-swarm-key-gen > swarm.key
2、將生成的swarm.key檔案傳輸到所有節點的 ~/.ipfs/檔案夾內,
102上:
$ cp swarm.key ~/.ipfs/
103上:
$ scp root@192.168.159.102:~/.ipfs/swarm.key ~/.ipfs
6.1.5 添加網路節點
所有節點上都移除默認的IPFS節點(此為私有化的關鍵步驟):
$ ipfs bootstrap rm all
查看節點ID:
$ ipfs id
系統會輸出以下內容,記住ID部分:
# 102
{
"ID": "12D3KooWP4avEe4hX3XVsbaWMHHuTZcXP5A5kCUf91BhRd9yy1Zb",
"PublicKey": "CAESIMTMekjuLE276A/3lr++zJqDGzkOYDqJulm6+VyEqVGi",
"Addresses": null,
"AgentVersion": "go-ipfs/0.9.1/",
"ProtocolVersion": "ipfs/0.1.0",
"Protocols": null
}
# 103
{
"ID": "12D3KooWDQL6EigoCsx6EjM4mSpz7Vqq9RHCZzPoshVFS8bdxrXh",
"PublicKey": "CAESIDVGdYIAdJfI6eZ6mAbrJo8RNn4baXsR4Wb1GZsc6Ocw",
"Addresses": null,
"AgentVersion": "go-ipfs/0.9.1/",
"ProtocolVersion": "ipfs/0.1.0",
"Protocols": null
}
在102服務器上添加103:
$ ipfs bootstrap add /ip4/192.168.159.103/tcp/4001/ipfs/12D3KooWDQL6EigoCsx6EjM4mSpz7Vqq9RHCZzPoshVFS8bdxrXh
在103服務器上添加102:
$ ipfs bootstrap add /ip4/192.168.159.102/tcp/4001/ipfs/12D3KooWP4avEe4hX3XVsbaWMHHuTZcXP5A5kCUf91BhRd9yy1Zb
6.1.6 啟動IPFS
所有的節點都添加完畢后使用命令啟動IPFS,顯示如下輸出說明啟動成功,組態檔沒有問題,
$ nohup ipfs daemon > ipfs.log 2>&1 &
......
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
IPFS Daemon啟動程序包含8個步驟:
- 檢查是否已經初始化
- 打開初始化根目錄 /.ipfs
- 讀取配置
- 根據配置生成一個新節點
- 連接到IPFS網路
- 開啟IPFS API服務
- 開啟Gateway網關服務
- 輸出IPFS Daemon ready
網路啟動后,可以測驗網路的連通性,使用如下命令查看IPFS連接了多少節點:
$ ipfs stats bitswap
bitswap status
provides buffer: 0 / 256
blocks received: 0
blocks sent: 0
data received: 0
data sent: 0
dup blocks received: 0
dup data received: 0
wantlist [0 keys]
partners [1]
其中partners就是連接到的節點數量,因為我們現在只有兩個節點,所以partners是1,
6.1.7 測驗文本傳輸
在102新建一個文本檔案:
$ echo "hello world" >> test.txt
將其添加到ipfs網路:
$ ipfs add test.txt
輸出以下字符就說明檔案已經上傳上去了:
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o test.txt
12 B / 12 B [==================================================================================================================] 100.00%
查看檔案:
$ ipfs cat QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
在子節點重復上面的操作,輸出都是hello world說明私有網路已經聯通,
6.2 架構說明
6.2.1 IPFS 總體架構圖

6.2.2 CLI、HTTP-API架構圖

6.3 Spingboot使用IPFS上傳、下載檔案
1、pom檔案引入相應的jar包
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.ipfs</groupId>
<artifactId>java-ipfs-http-client</artifactId>
<version>v1.3.3</version>
</dependency>
</dependencies>
2、讀取檔案
/**
* @param id
* 檔案的hash值
* @return 檔案內容
* */
@RequestMapping("/{id}")
public String getFileContent(@PathVariable String id) {
String content = null;
// 連接任一節點(本例中連的不是檔案上傳的節點)
IPFS ipfs = new IPFS("/ip4/192.168.159.103/tcp/5001");
Multihash filePointer = Multihash.fromBase58(id);
try {
// 獲取檔案內容
byte[] fileContents = ipfs.cat(filePointer);
content = new String(fileContents);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
驗證:(讀取部署時上傳驗證的檔案)

3、上傳檔案
/**
* @param fileName
* 檔案名
* @param content
* 檔案內容
* @return 檔案的hash值
* */
@PostMapping("/upload")
public String uploadFile(@RequestParam("fileName") String fileName,
@RequestParam("content") String content) {
String hash = null;
try {
// 連接
IPFS ipfs = new IPFS("/ip4/192.168.159.102/tcp/5001");
NamedStreamable.ByteArrayWrapper file = new NamedStreamable.ByteArrayWrapper(
fileName, content.getBytes());
MerkleNode addResult = ipfs.add(file).get(0);
hash = addResult.hash.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return hash;
}
驗證:

服務器上查看:

6.4 相關開源代碼
| 組件 | 代碼 | 開發語言 |
|---|---|---|
| IPFS專案 | https://hub.fastgit.org/ipfs/ipfs | |
| IPFS Go版本 | https://hub.fastgit.org/go-ipfs | go |
| IPFS 前端 | https://hub.fastgit.org/ipfs/ipfs-webui | js |
| IPFS API | https://hub.fastgit.org/ipfs/go-ipfs-api | go |
| 客戶端 | https://hub.fastgit.org/ipfs/ipfs-desktop | js |
PS:hub.fastgit.org 為github.com 的加速域名
7 遺憾
本文未說明私有IPFS如何支持客戶端瀏覽器訪問節點的webui
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301915.html
標籤:其他
