ipfs私有鏈環(huán)境搭建與java-sdk調(diào)用

ipfs私有鏈環(huán)境搭建與java-sdk調(diào)用

環(huán)境準(zhǔn)備

ipfs鏡像文件

docker pull ipfs/go-ipfs

私有鏈密鑰生成工具生成密鑰文件

go get github.com/Kubuxu/go-ipfs-swarm-key-gen
cd $GOPATH/src/github.com/Kubuxu/go-ipfs-swarm-key-gen
go build
$GOPATH/src/github.com/Kubuxu/go-ipfs-swarm-key-gen > ~/swarm.key

在宿主機創(chuàng)建ipfs 的data鳄梅、export目錄

mkdir -p ~/ipfs/ipfs1/data ~/ipfs/ipfs1/export ~/ipfs/ipfs2/data ~/ipfs/ipfs2/export

把第2步生成的密鑰文件分別拷貝至 ipfs 對應(yīng)的 data 文件夾下

cp ~/swarm.key ~/ipfs/ipfs1/data 
cp ~/swarm.key ~/ipfs/ipfs2/data 

環(huán)境配置

分別啟動 ipfs 兩個容器

docker run -d --name ipfs_host1 --privileged=true --entrypoint="sh" -v ~/ipfs/ipfs1/export:/export -v ~/ipfs/ipfs1/data:/data/ipfs -p 4001:4001 -p 127.0.0.1:8085:8080 -p 5001:5001 ipfs/go-ipfs:latest -c "while true; do sleep 1;done"
docker run -d --name ipfs_host2 --privileged=true --entrypoint="sh" -v ~/ipfs/ipfs2/export:/export -v ~/ipfs/ipfs2/data:/data/ipfs -p 4011:5001 -p 127.0.0.1:9085:8080 -p 5011:5001 ipfs/go-ipfs:latest -c "while true; do sleep 1;done"

注意:啟動命令中的參數(shù)說明测摔。--entrypoint="sh" 由于 ipfs 容器的 dockerfile 中注明了 entrypoint 執(zhí)行的命令队伟,當(dāng)直接運行容器后埃跷,容器會根據(jù)默認配置文件啟動 ipfs 服務(wù)五芝,并連接 ipfs 公網(wǎng)環(huán)境谐丢。由于我們需要搭建自己的私有鏈環(huán)境所以需要改寫entrypoint執(zhí)行我們制定的命令揭蜒,并在容器中修改相應(yīng)的配置文件淘衙,運行私有鏈環(huán)境传藏。這里我們設(shè)置 entrypoint 運行 sh命令,并執(zhí)行上訴命令最后部分的參數(shù) -c "while true; do sleep 1;done"彤守,啟動一個主進程來保持 ipfs 容器運行毯侦。

修改 ipfs 服務(wù)默認配置

分別進入ipfs_host1與ipfs_host2容器中執(zhí)行以下命令

進入 ipfs_host容器

docker exec -it ipfs_host1 sh

初始化節(jié)點配置

ipfs init

運行初始化命令后,會在/data/ipfs目錄下創(chuàng)建啟動配置信息具垫,并且在屏幕中出現(xiàn)以下初始化信息

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

    ipfs cat /ipfs/QmcLnHDuhN7bCbdv5FRbYiTNKuqNhs1WSCUezFPt7F4vHJ/readme

記住ipfs_host1中的peer identity: QmcLnHDuhN7bCbdv5FRbYiTNKuqNhs1WSCUezFPt7F4vHJ信息侈离,在后面啟動 ipfs_host2服務(wù)的時候需要用到

刪除默認配置中的引導(dǎo)節(jié)點信息

ipfs bootstrap rm --all

修改接口調(diào)用地址

打開服務(wù)啟動配置文件

vi config

修改配置文件中 Addresses中的 API值:

"API": "/ip4/127.0.0.1/tcp/5001" --> "API": "/ip4/0.0.0.0/tcp/5001"

注意,修改后調(diào)用 sdk 初始化 IPFS 對象的時候才能遠程訪問 ipfs 服務(wù)筝蚕。如果沒有修改則初始化 IPFS 對象的時候則會出錯卦碾。

環(huán)境啟動

啟動 ipfs 服務(wù)

啟動 ipfs_host1服務(wù)

ipfs daemon

啟動 ipfs_host2服務(wù),注意下面的命令使用到ipfs_host1初始化時生成的peer identity

ipfs bootstrap add /ip4/宿主機ip/tcp/4001/ipfs/QmcLnHDuhN7bCbdv5FRbYiTNKuqNhs1WSCUezFPt7F4vHJ
ipfs daemon

環(huán)境驗證

進入 ipfs_host1容器中執(zhí)行以下命令

創(chuàng)建測試文件

cd ~
echo test > test.txt

上傳文件

ipfs add text.txt

ipfs 上傳文件后會有如下提示信息反饋

added QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH test.txt

其中QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH就是文件test.txt的hash值

ipfs 是根據(jù)文件內(nèi)容進行 hash 只要文件內(nèi)容不變起宽,只修改文件名是不會影響最終的上鏈文件 hash 值的洲胖。

進入 ipfs_host2容器中驗證上傳文件
執(zhí)行文件查看命令,查看文件內(nèi)容

ipfs cat QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH

執(zhí)行命令后坯沪,控制臺會返回查詢結(jié)果:test

至此绿映,ipfs 私有網(wǎng)絡(luò)搭建成功。

有興趣的朋友可以改寫 dockerfile 的內(nèi)容重寫 entrypoint執(zhí)行命令的內(nèi)容屏箍,減少修改 ipfs 服務(wù)默認配置部分的操作步驟绘梦。

java-ipfs-http-client的使用

pom.xml中添加依賴橘忱,這里需要根據(jù) github 上的版本修改$LATEST_VERSION的值

  <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>$LATEST_VERSION</version> 
    </dependency>
  </dependencies>

使用ipfs上傳文件以及下載文件

// 實例化ipfs對象
IPFS ipfs = new IPFS("/ip4/10.121.60.26/tcp/5001");

//保存上傳文件
NamedStreamable.FileWrapper savefile = new NamedStreamable.FileWrapper(new File("/Users/song/Documents/book/test1.pdf"));
MerkleNode result = ipfs.add(savefile).get(0);
System.out.println(result.toJSONString());//返回結(jié)果里面獲取保存文件的唯一hash,基于文件內(nèi)容的 hash


//下載文件
Multihash filePointer = Multihash.fromBase58("Qmc51yHGyaxdRsUwBozP9tQuTRQuXLkZv3sPEcpSgb8BxP");//參數(shù)為文件 hash
byte[] fileContents = ipfs.cat(filePointer);

//保存文件
File downloadfile = new File("/Users/song/Documents/aaa.pdf");

if(!downloadfile.exists()) {
    downloadfile.createNewFile();
}

FileOutputStream fop = new FileOutputStream(downloadfile);
fop.write(fileContents);
fop.flush();
fop.close();

結(jié)語

ipfs 并不僅僅只用于分布式文件存儲卸奉,如果想要深入了解 ipfs 功能可以參考ipfs - 命令手冊钝诚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榄棵,隨后出現(xiàn)的幾起案子凝颇,更是在濱河造成了極大的恐慌,老刑警劉巖疹鳄,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧略,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘪弓,警方通過查閱死者的電腦和手機垫蛆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腺怯,“玉大人袱饭,你說我怎么就攤上這事∏赫迹” “怎么了虑乖?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晾虑。 經(jīng)常有香客問我疹味,道長,這世上最難降的妖魔是什么帜篇? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任糙捺,我火速辦了婚禮,結(jié)果婚禮上坠狡,老公的妹妹穿的比我還像新娘继找。我一直安慰自己,他們只是感情好逃沿,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幻锁,像睡著了一般凯亮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哄尔,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天假消,我揣著相機與錄音,去河邊找鬼岭接。 笑死富拗,一個胖子當(dāng)著我的面吹牛臼予,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啃沪,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粘拾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了创千?” 一聲冷哼從身側(cè)響起缰雇,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎追驴,沒想到半個月后械哟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡殿雪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年暇咆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丙曙。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡糯崎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出河泳,到底是詐尸還是另有隱情沃呢,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布拆挥,位于F島的核電站薄霜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纸兔。R本人自食惡果不足惜惰瓜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汉矿。 院中可真熱鬧崎坊,春花似錦、人聲如沸洲拇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赋续。三九已至男翰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纽乱,已是汗流浹背蛾绎。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人租冠。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓鹏倘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顽爹。 傳聞我的和親對象是個殘疾皇子纤泵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容