元宇宙织梦网(区块链大数据 芝麻卡NFR:吃饭赚钱 睡觉赚钱 做梦赚钱)

 找回密码
 立即注册

QQ登录

只需一步,快速开始

社区广播台

查看: 3421|回复: 0

IPFS开发简介与入门实战

[复制链接]
发表于 2021-4-22 23:39:31 | 显示全部楼层 |阅读模式
本帖最后由 赤膊医数 于 2021-4-22 23:41 编辑
( t' T* c1 j/ M, B  H; N/ ^
; S8 O+ ?( H9 R# y1 {2018年,最火爆且值得期待的区块链项目莫过于EOS和IPFS。1、IPFS简介
  • IPFS是什么+ c5 h* N( ?6 i. q) B: Q  g! w  Y8 O# ~0 D
    星际文件系统IPFS(InterPlanetary File System)是一个面向全球的、点对点的分布式版本文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。原理用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。
    & S# Q4 G2 l; d- o% k, T1 ^以上内容来自巴比特官网介绍
    . Z1 M/ R2 i. i  W7 F6 ~IPFS是基于区块链技术的去中心化存储网络,实现了永久性存储。  u/ N5 g8 K5 Y! R8 w
  • IPFS的火热
    * _% M: c  c) L+ x  IFilecoin ICO是迄今为止涉及金额最大的ICO,仅一小时就募集了接近2亿美元,打破ICO记录,成为2017年最火爆的区块链项目。IPFS项目吸引了世界各地数字货币投资者和互联网从业者的密切关注,2018年比较值得期待的是IPFS主网的上线。然而就在前段时间,官方公布说上线时间延期到年底。
    . P: c! ~% o4 b1 y注:Filecoin是IPFS激励层的加密数字货币(即代币),有点类似于以太坊平台上的以太币。* m, b; ~9 l" k9 @4 G0 p; D
    IPFS官网:https://ipfs.io/
    3 p- g& Q9 w) l$ R& v  B8 `6 ~& {Filecoin官网:https://filecoin.io/
    & o) c" k5 v1 U% q2 s0 \' z& `# r
  • IPFS的应用案例
    * v+ B* \7 G$ s6 aGitHub有两款开源项目,且有对应网址,分别是音乐播放器和视频播放器。
    / Z, t" m0 z2 R5 T: D) R
    8 O4 D: }$ ~7 N7 [0 a  @. J- ~
    • IPFS音乐播放器: R* K0 Y0 |+ ?) C$ Q6 H
      + O, [$ k  X7 G0 ~/ g6 q5 r

      + o" B" k2 l- N! J; { 5521305-ae7a09ee6683f37a.jpg
      $ g7 i# A' t, O" u9 N5 A1 ~4 I7 m( @% Z3 ~& U8 ]1 M: k
      IPFS音乐播放器! V' I7 \( n! G8 a' G; |  S8 R$ k0 p

      % ^' @+ W. N: R2 H; D( l5 bIPFS音乐播放器网址:https://diffuse.sh/1 R/ I0 ?8 d" v; r7 A: n
      GitHub地址:https://github.com/icidasset/diffuse& q8 G) }" C3 I& \* o0 N; m
    • IPFS视频在线播放器
      7 ^) {1 d$ h3 d6 o! S9 b7 k) f3 F! ~' v$ ~+ P9 U: I

      $ \  D. e, W/ `2 U 5521305-6bb3339c3bf60f73.png
      / \6 M4 O) y0 y9 O1 ~0 m& D- @! Z1 O; F5 ]' V
      IPFS视频在线播放器首页
      6 e$ U: K* m+ ?) }, B, B4 ~
      2 M1 s7 ~+ s# V/ R  I( l6 h- V& l
      0 d& Q: e5 g3 E, l
    2 x5 w. Z, E, A
    5521305-f10de97d94961616.png
    2 Z6 W% @, D) z1 l4 f& s# W& E& m: {0 d; _
    IPFS视频在线播放器播放电影
    + [5 D" i3 h4 n& Q! e5 F5 g
    8 |" h# S4 w" q1 v" h$ e号称是国内第一个IPFS应用8 w& z* Z' m: {$ z  a
    IPFS视频在线播放器网址:http://www.ipfs.guide/$ s# I, y% W- \' a: X
    GitHub地址:https://github.com/download13/ipfstube
    2 t4 S* Z' t# r" y# i可用于测试的电影视频Hash(这里只列举两部):; H4 r3 M) F$ b0 C; N
    神秘巨星:QmWBbKvLhVnkryKG6F5YdkcnoVahwD7Qi3CeJeZgM6Tq68: C! F8 U8 w% S: u
    盗梦空间:QmQATmpxXvSiQgt9c9idz9k3S3gQnh7wYj4DbdMQ9VGyLh- w. [5 _5 w! U1 }  g1 e. W. Q. D
2、IPFS的安装既然IPFS这么牛,有必要了解一下IPFS的开发,先从IPFS的安装开始。
" L4 H* X4 Y. r. ]. W! Y8 C% ^
  • IPFS Desktop$ V% [) g0 e1 U7 ]( b" x0 K
    当然,可以直接安装IPFS节点桌面管理软件来体验一下。该软件可以方便地运行和管理自己的节点,查看IPFS节点资源信息,支持二次开发。该项目是Node.js编写的,已开源。
    & n' f2 q" m5 v  ^3 l# F
    9 v; x; v3 F6 g4 w7 }; R& m! i2 `2 r) |
    5521305-6a23898f658aaa52.png
    ! o( x! ?! }. N; z$ T% A9 c) @( @3 P
    IPFS节点桌面管理软件
    3 ?; I- S" }# `+ I4 h
    $ a( ]& a9 g: H1 A% X6 h4 B- Y+ zGitHub地址:; l  Y" z% q2 v# q5 _
    https://github.com/ipfs-shipyard/ipfs-desktop/ D6 E, R- {# I" v7 F. m
  • Go-IPFS
    - Q7 h1 U0 U2 J( M" @进入IPFS的官网,找到并切换到"Install"页面,点击"Download IPFS for your platform",会跳转到如下网址(需要翻墙):8 o* V4 ?3 R; r. T$ p1 Q
    https://dist.ipfs.io/#go-ipfs
    & y' ~2 {' U6 H" J: S: o/ k% z, ^# k2 m+ r4 o. |- ?! ]6 o1 p# K8 i2 y
    5521305-4fc9604f1c9a3f8a.png + M- O( P% L8 o9 K
    7 r/ J0 z5 _; g8 N1 A
    下载Go-IPFS
    5 l6 r- K- O0 a; M0 C" t, i( y
    . q# f3 K9 e; {, [8 w如果打不开,可以试着去Github查看安装方法
    ' s/ k: Q  w: P7 o1 |1 lGitHub地址:https://github.com/ipfs/go-ipfs
    . I( M2 |4 c  l% x3 y将网页下载好的文件解压出来,下载的是"go-ipfs_v0.4.13_darwin-amd64.tar.gz",解压出来的是go-ipfs文件夹,# I7 |  I( w! X* l* e* q
    然后打开终端,进入到go-ipfs文件夹根目录,复制ipfs文件到系统的bin目录,然后可以通过"ipfs version"来检查,操作如下:
    3 U  P8 T* [- L$ o. C+ AwenzildeiMac:go-ipfs wenzil$ pwd/Users/wenzil/Desktop/study/go-ipfswenzildeiMac:go-ipfs wenzil$ lsLICENSE     README.md   build-log   install.sh  ipfswenzildeiMac:go-ipfs wenzil$ cp ipfs /usr/local/bin/ipfswenzildeiMac:go-ipfs wenzil$ ipfs versionipfs version 0.4.13* h: E! @8 h1 q! b* g8 D; q: }( R/ G
3、IPFS节点的创建、查看和启动以下是安装官网的Go-IPFS步骤下实验的3 H5 M8 i( C! r
  • 创建节点
    1 k) M: \+ W$ r( W进入到当前用户的根目录,并使用"ipfs init"命令创建节点,可以用"open ./"打开创建节点生成的".ipfs"目录。
    " e: b# K- m, Y- C5 AwenzildeiMac:go-ipfs wenzil$ cd ~/wenzildeiMac:~ wenzil$ pwd/Users/wenzilwenzildeiMac:~ wenzil$ ipfs initinitializing IPFS node at /Users/wenzil/.ipfsgenerating 2048-bit RSA keypair...donepeer identity: QmWH4xmGBznY9CJ4SjxpxWqGwMwrFtPdjgeweLCfJxW8j9to get started, enter:    ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readmewenzildeiMac:~ wenzil$ cd .ipfswenzildeiMac:.ipfs wenzil$ open ./
    * [  P- M5 Z. T! {
8 r& b1 {, Q6 B! @& T  O3 b! R
5521305-5a5a65e04aadc891.png ' V0 B2 z+ G3 g7 D1 w. |. {
# [, ^) x/ K4 _, [: d
IPFS节点的创建
7 \3 B" w4 m4 C' ?' T, b6 ?
+ t- I- P  i6 h! @0 Y6 @0 N9 V9 V
  • 查看节点id- L  n" y% d; S, ~+ [7 \$ m& v9 Q
    wenzildeiMac:.ipfs wenzil$ ipfs id{    "ID": "QmWH4xmGBznY9CJ4SjxpxWqGwMwrFtPdjgeweLCfJxW8j9",    "PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt98O5zNptBtmSF6xYdOHAMunQsXE9rAmgqBXVPLJk+AoaBjNiAipB+sTXKwaj8stp9c3iuSzz10+dyYI38bq4TPDCsHnQ3PjKSgZwEaT0M6pJhGqJcSbLY57CjQOEwgFe+tw3b4hcoDvvNJMG0dZZg1r9xnfevBz0DNewlj2vtviSTQL6r/ZXlD04GsytxTSQ2pzMJTG3QmYyokeZ37DT7Vwa+IJjDCiDJC5BlZ204zunZBx3tqWUn2Hr2NtEX+4YDdX4SBHa0ZDNqZmzLRe5YlAXjVI0ONHs+BVsC1v1L5we52iSYCSgVHoxRP/pa9EZdHMvgs9QeAa5jO90yxgTAgMBAAE=",    "Addresses": null,    "AgentVersion": "go-ipfs/0.4.13/",    "ProtocolVersion": "ipfs/0.1.0"}
  • 修改IPFS默认存储空间
    % B. G+ z5 |9 }0 ~3 W4 o3 B存储节点默认存储大小为10G,如果你想修改存储空间,可以修改config配置文件,找到StorageMax并修改
    3 l+ o0 s, ?1 S2 Q$ K% {3 gwenzildeiMac:~ wenzil$ export EDITOR=/usr/bin/vimwenzildeiMac:~ wenzil$ ipfs config edit  " C6 N- o# G4 n+ I0 a) R1 m8 n
    5521305-9a3e346dfd368715.png
    2 @/ Q  l0 x8 r4 H5 J+ A
    . E- t# O3 c/ x2 t0 N- j修改IPFS默认存储空间
    9 `8 x& r0 Q7 D0 M3 g
    1 P( q' A: k3 W8 N5 Z
  • 启动和同步节点服务器
    $ _' m; F% e  b# B/ S  I执行"ipfs daemon"命令,可以同步节点数据到IPFS网络。' o! Q: h% v* ?* j7 |$ B% w! _# Q# l
    wenzildeiMac:.ipfs wenzil$ ipfs daemonInitializing daemon...Adjusting current ulimit to 2048...Successfully raised file descriptor limit to 2048.Swarm listening on /ip4/127.0.0.1/tcp/4001Swarm listening on /ip4/192.168.1.100/tcp/4001Swarm listening on /ip6/::1/tcp/4001Swarm listening on /p2p-circuit/ipfs/QmWH4xmGBznY9CJ4SjxpxWqGwMwrFtPdjgeweLCfJxW8j9Swarm announcing /ip4/100.64.9.179/tcp/55898Swarm announcing /ip4/127.0.0.1/tcp/4001Swarm announcing /ip4/192.168.1.100/tcp/4001Swarm announcing /ip6/::1/tcp/4001API server listening on /ip4/127.0.0.1/tcp/5001Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8082Daemon is ready
    ) h# j. }& [( A& h. [6 P8 O7 s" Z" w
4、IPFS运行体验
  • IPFS查看ReadMe
    9 ]2 ^8 W2 c4 `8 ?$ ^# L可以回去查看执行"ipfs init"命令的时候,返回的内容。打开一个新的终端,操作如下:& @% y# m5 d( O9 L7 F9 t  R: Y. o
    wenzildeiMac:~ wenzil$ ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readmeHello and Welcome to IPFS!██╗██████╗ ███████╗███████╗██║██╔══██╗██╔════╝██╔════╝██║██████╔╝█████╗  ███████╗██║██╔═══╝ ██╔══╝  ╚════██║██║██║     ██║     ███████║╚═╝╚═╝     ╚═╝     ╚══════╝If you're seeing this, you have successfully installedIPFS and are now interfacing with the ipfs merkledag! -------------------------------------------------------| Warning:                                              ||   This is alpha software. Use at your own discretion! ||   Much is missing or lacking polish. There are bugs.  ||   Not yet secure. Read the security notes for more.   | -------------------------------------------------------Check out some of the other files in this directory:  ./about  ./help  ./quick-start     <-- usage examples  ./readme          <-- this file  ./security-notes
  • Web管理界面
    9 }% f4 B$ f+ k( fIPFS节点服务器启动后,可以用浏览器访问:http://localhost:5001/webui
    - K0 C" E) D. N! V; h有本地配置、节点连接、本地节点文件等信息,如图:
    ' Q2 [* }/ [+ K& E4 `& P/ m
    ( ~. @- c7 {$ h1 P+ }' U: S- C
    % ?  v9 P- k8 }* T: V3 @ 5521305-e7b2945efee17b07.png
    4 c# M) t% g  w- @9 R+ \
    7 c, N* {- |- F4 {( LIPFS的Web管理界面
    + N) d9 r# p$ r$ b' Z, d
    : f6 y# |: H& H) R, }& C. @
    6 J9 I$ @1 L- Q! H: e1 m- y3 i! L4 X( ^, G* H. j& w3 U
5、设置跨域资源共享当我们在前端通过js接口操作ipfs时,会遇到跨域资源访问问题,可以在终端执行以下配置来解决:" i( Y; P; @' T& P
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT","GET", "POST", "OPTIONS"]'ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials '["true"]'ipfs config --json API.HTTPHeaders.Access-Control-Allow-Headers '["Authorization"]'ipfs config --json API.HTTPHeaders.Access-Control-Expose-Headers '["Location"]'6、IPFS的基本操作6.1 添加单个文件到IPFS节点
  • 新建文件
    ! T2 o3 m: S1 n$ X  R; GwenzildeiMac:ifps_test wenzil$ vi test.txtwenzildeiMac:ifps_test wenzil$ cat test.txt IPFS测试文件
  • 添加文件到IPFS节点* m  r) S3 B: G* x  Q0 a
    wenzildeiMac:ifps_test wenzil$ ipfs add test.txt added QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab test.txt添加文件到IPFS节点后,返回了文件的哈希值
    : b  o' B0 ^" ], |
  • 查看IPFS节点的文件* y# G- X3 P4 p6 {
    wenzildeiMac:ifps_test wenzil$ ipfs cat QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbIPFS测试文件注意:此时的文件只是添加到了本地的IPFS节点,读取的是本地数据,可以通过如下网址查看。
    : H' J0 J3 N0 i: Jhttp://localhost:8080/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab' O' P) X" e) q  A$ k
    通过"ipfs daemon"命令启动节点服务器,会将本地节点文件同步到外网,同步成功后,这时就可以访问如下网址来查看(如果访问失败,试着翻墙看看)。& [6 Q3 u- r! k9 G# `% F
    https://ipfs.io/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab& P$ |1 Y3 Y+ r' L* z. z; r

    ! X6 n$ D& b6 @9 U 5521305-47b7c5838326410f.png 8 U! Z3 y$ h9 d7 R
    1 i  W# b$ ~0 d3 K' v! X9 o
    查看IPFS文件内容# Z" h4 F7 q, y+ J

    " R8 c: S" l& C  B6 O如果访问成功的话,说明已经存储到IPFS网络中。目前IPFS网络暂未加入代币Filecoin机制,所以存储读取文件免费,速度也比较慢。8 R( t$ C6 u6 N; ^* u& r! I( n
  • 下载IPFS节点的文件
    & J; a; @1 O9 V4 [! LwenzildeiMac:ifps_test wenzil$ ipfs get QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbSaving file(s) to QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab 25 B / 25 B [========================================================] 100.00% 0s查看当前目录,发现多了一个"QmSV..."的文件"7 q$ ^, g) u( o' ~8 S

    ) P+ L. r" w. B7 y, a4 a5 p# \7 ]! e' v4 l, C4 [# |
    5521305-eb55bb51ae418085.png
    6 k! S- l  D; K/ c1 R" |2 U$ j/ j9 J3 `2 U& c7 t5 |# Q, y
    下载IPFS节点的文件
    ' r) W6 y6 z- [; q' \2 m" F, F% l. e! @: d2 f

    ; b1 C  {: w. E/ U/ a
6.2 创建文件夹存储文件
  • ipfs命令新建文件夹) Q2 z- a1 y% c4 b
    wenzildeiMac:ipfs_test wenzil$ pwd/Users/wenzil/Desktop/study/ipfs_testwenzildeiMac:ipfs_test wenzil$ ipfs files mkdir /wenzilwenzildeiMac:ipfs_test wenzil$ ipfs files cp /ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab /wenzil/test.txtwenzildeiMac:ipfs_test wenzil$ ipfs files lstestwenzilwenzildeiMac:ipfs_test wenzil$ ipfs files ls /testwenzilwenzildeiMac:ipfs_test wenzil$ ipfs files rm -rf /testwenzildeiMac:ipfs_test wenzil$ ipfs files lswenzilwenzildeiMac:ipfs_test wenzil$ ipfs files ls /wenziltest.txtwenzildeiMac:ipfs_test wenzil$ ipfs files read /wenzil/test.txtIPFS测试文件注:"ipfs files rm -rf /文件夹名"可以删除文件夹。/ M) \1 W8 J( o' ^5 q/ }/ P

    3 F, R9 C' U7 |. F
6.3 IPFS上传文件夹
  • ipfs命令添加文件夹" W+ \! H* l. Q' n" o, m
    先在本地创建一个文件夹和对应文件,如图:
    ) C$ P3 |7 w3 k! q8 L4 ~6 M
    ' R% C1 K: [" ?; }& {9 u; x! J3 s# h& I
    5521305-3f47f331d7d63fb6.png
    4 Z3 L& h' c2 W  l# i; u# T
    ) v4 m& {" S; P5 `4 K" F& P2 M  B本地创建文件夹及文件
    9 n  t0 b7 @& R9 L1 ~  e" l
    ! L4 b7 `6 i. F" F  O$ t然后通过"ipfs add -r 文件夹"命令添加整个文件夹
    3 o' o! L: R8 h5 l wenzildeiMac:ipfs_folder wenzil$ pwd /Users/wenzil/Desktop/study/ipfs_folder wenzildeiMac:ipfs_folder wenzil$ ls portrait.jpeg   readme.txt wenzildeiMac:ipfs_folder wenzil$ cd .. wenzildeiMac:study wenzil$ pwd /Users/wenzil/Desktop/study wenzildeiMac:study wenzil$ ipfs add -r ipfs_folder/ added   QmbHptfJfyuGAZxstFYgAVfz33cytR1seTD3ZabBSDd899     ipfs_folder/portrait.jpeg added   QmPEWgwQEHD6qxm5cUivTEZ252T123DvQ5L6HyUDgViQv  T ipfs_folder/readme.txt added   QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj   ipfs_folder wenzildeiMac:study wenzil$
  • 查看文件夹的文件内容9 B  N& F9 G2 ]) f# O* y$ s. g
    wenzildeiMac:study wenzil$ ipfs cat QmPEWgwQEHD6qxm5cUivTEZ252T123DvQ5L6HyUDgViQvT 我是区块链开发小白,请大家多多赐教,谢谢。欢迎阅读我的区块链系列文章,简书地址:https://www.jianshu.com/u/5f809ab3698cwenzildeiMac:study wenzil$ ipfs cat /ipfs/QmPEWgwQEHD6qxm5cUivTEZ252T123DvQ5L6HyUDgViQvT我是区块链开发小白,请大家多多赐教,谢谢。欢迎阅读我的区块链系列文章,简书地址:https://www.jianshu.com/u/5f809ab3698cwenzildeiMac:study wenzil$ ipfs cat /ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj/readme.txt我是区块链开发小白,请大家多多赐教,谢谢。欢迎阅读我的区块链系列文章,简书地址:https://www.jianshu.com/u/5f809ab3698c
  • 查看IPFS对应文件夹
    5 M" l. Z# x1 D; j访问文件夹对应的IPFS地址:
    / {3 x) a% @3 {  f7 E' Y9 Shttps://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj
    ) u* }3 K, b6 h# X2 v% u第一次访问的时候,需要同步数据到IPFS网络,等待时间有点久,慢到让你以为同步失败了。
    * Z7 c5 v' L4 F  m' b: d7 Y7 B; g, ~  B  {! R7 E! N) j
    5521305-72d506bca193abec.png
    1 K  J" ~8 u& \/ I1 |3 g& I* W7 w4 X4 W# i& t- v
    查看IPFS对应文件夹
    ) ?' [2 ^- E  f8 V0 _6 ~2 z
    0 l8 D8 k7 Q# b0 H: p访问文件夹对应的文件,如看到图片文件,访问ipfs网关:
    9 H8 N. K1 u8 K! S( Phttps://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj/portrait.jpeg
    " P. G0 y$ d$ y) g
    , \' `& L# W& o 5521305-b2de93582c9d0dac.png 5 H0 F# N" z( a: `$ l) {. e- k
    7 ]9 [/ n( g# U* g5 }* T
    查看IPFS文件夹对应文件
    ) F+ q1 m6 Q! U  U% u- H4 D% [9 u
    $ _7 ~' K* m; F/ H- e! P或者通过文件的Hash来访问,如访问txt文件的地址:
    * J( D; i, {4 \$ thttps://ipfs.io/ipfs/QmPEWgwQEHD6qxm5cUivTEZ252T123DvQ5L6HyUDgViQvT
    ( F$ D6 x$ u% O# O" _* C2 `, C1 a7 a) M+ f
    5521305-9f5f8194546ee968.png
    # U; l! g! p. ?
    2 c" Q  s5 h# ^通过文件Hash访问查看5 v, f6 `6 E# O: C9 Y& n
    1 l: N6 f: M* F% {; q/ r7 E# t
    / n& E( j9 N" `
6.4 添加简单网页到IPFS节点
  • 网页效果和项目结构
    3 _3 l5 K8 L8 q3 Z' h实现一个简单的实时显示系统当前时间的网页,效果如图:
    / ]4 ?. A9 v4 j
    / }9 G: p4 M9 P  C
    , ~5 z' W0 |% ]+ g 5521305-13caff069d686e6e.png 2 k8 U8 p' n4 _( a3 O# @

    9 v  m! ?) i2 ~IPFS添加简单网页
    & c2 u4 E2 x1 i, E
    " e' N/ P# U! Y3 h2 M工程结构如图:, U3 X, e) F0 H+ F2 `% A' h

    ; T. F4 e( O6 J/ [3 g; }
    * C+ ~, w7 [6 o8 j5 P 5521305-1f43ed03e72738db.png ; f4 Q: L, v# e1 p, @6 s% a
    - ]$ e9 @4 `' Q, q7 }
    网页工程结构  H! \6 g6 n0 T% L' O
    , m  B, j- `# K: i5 o
    " a: V, c3 K! f" m% w4 X) Z
实现代码比较简单,这里就不贴代码了。$ j& Q2 G, Q7 K/ z  U+ E
  • ipfs命令添加文件夹
    0 I* x* V7 P. @! ^) I8 p! K. ewenzildeiMac:study wenzil$ ipfs add -r ipfs_htmladded QmTj49dgFgFhfNRTUYyUSzk3puj7vvDoVsAynFrL7GAj1d ipfs_html/index.htmladded QmeHFBSyN9KqeZWKyKTWKYzDRU192YWDRjf6sLWFWhwk2z ipfs_html/styles.cssadded QmWkEfgL2pjo7n8b9YBCv4qwE77YWePkSscxiHQfPpwpkp ipfs_html/time.jsadded QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD ipfs_html记得要开启IPFS节点服务器进行数据的同步,可以使用"ipfs daemon"命令在新的终端窗口打开运行。
    0 f6 N9 N: A; @" L4 Z8 _wenzildeiMac:~ wenzil$ ipfs daemonInitializing daemon...Adjusting current ulimit to 2048...Successfully raised file descriptor limit to 2048.Swarm listening on /ip4/127.0.0.1/tcp/4001Swarm listening on /ip4/192.168.6.31/tcp/4001Swarm listening on /ip6/::1/tcp/4001Swarm listening on /p2p-circuit/ipfs/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrzSwarm announcing /ip4/127.0.0.1/tcp/4001Swarm announcing /ip4/192.168.6.31/tcp/4001Swarm announcing /ip6/::1/tcp/4001API server listening on /ip4/127.0.0.1/tcp/5001Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8082Daemon is ready
  • 访问ipfs对应文件
    , _0 n- L* r+ \( X( H4 d3 n浏览器访问ipfs网关:. v$ m) r7 l/ C) Z  c* y  J; K
    https://ipfs.io/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD/
    / n1 Z. X" U, m! ]5 T5 `& j
    - D' F% C' S4 ^3 m+ d2 q 5521305-f507c2fadf344358.png 5 T* A: N) c7 u  k! b
      G( B, {  D: f8 P( o9 r
    查看IPFS对应网页/ i* ?1 T$ D# X2 l

    6 D2 j% A" {1 B9 G7 P" D, b, z$ e" U2 \" C5 P8 N
6.5 IPNS绑定节点名
  • IPNS绑定节点操作- {" _0 Q9 D; ?* K3 k
    每次修改文件内容后,文件的哈希值就会发生变化。对于网站而言,发布后可能还需要做修改,这时需要IPNS绑定节点名。每次更新网站内容后,重新publish一次更新发布到IPNS即可。4 _8 Z5 J( a# }4 N8 G* X
    刚才的html根目录的哈希值是QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD,操作如下:
    ( |1 q3 b, V# @* p% Q8 L6 Y' TwenzildeiMac:study wenzil$ ipfs name publish QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDDPublished to QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz: /ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 查看当前节点8 G! A8 X0 ]3 z# k  ?0 }
    wenzildeiMac:study wenzil$ ipfs id{    "ID": "QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz",    "PublicKey": "CAASpg......",    "Addresses": [        "/ip4/127.0.0.1/tcp/4001/ipfs/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz",        "/ip4/192.168.6.31/tcp/4001/ipfs/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz",        "/ip6/::1/tcp/4001/ipfs/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz",        "/ip4/14.xxx.xxx.xxx/tcp/4001/ipfs/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz",        "/ip4/61.xxx.xxx.xxx/tcp/20472/ipfs/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz"    ],    "AgentVersion": "go-ipfs/0.4.13/",    "ProtocolVersion": "ipfs/0.1.0"}    发现"ID"和上面"Published to"返回的节点一致,都是"QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz"" W0 \$ y9 X& D6 v9 L5 Q+ j  S9 _7 y
  • 验证节点* O6 M9 J( j3 e3 `( D, j
    命令为:"ipfs name resolve 节点ID“
    4 O! o: u$ E9 U% @# E8 PwenzildeiMac:study wenzil$ ipfs name resolve QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 访问IPNS对应文件
    ! `$ t' q9 |% b/ X2 I1 D浏览器访问ipfs网关:
    6 N2 l0 j" _1 S5 X, |* O( ]https://ipfs.io/ipns/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/1 h( n0 ^0 v8 |2 U( M! Q, R

    6 {6 ^# h  o2 t' ^+ l6 b4 B
( ^8 K- Y. u- X- r  \
5521305-34805df9bb0347e0.png
$ E# ?  C% q, k
2 H( e$ i+ Z; _0 C0 X8 }: v; S, ?查看IPNS对应网页3 S9 v, F2 k: b3 I7 Y
/ s" f. L* ~8 l1 n
7、IPFS与以太坊DApp开发实战
  • IPFS与以太坊DApp结合的好处2 P% u# a6 A0 [
    在以太坊平台上,往区块链写入数据需要花费以太币,调用智能合约执行每一行代码的时候,都需要一定量的gas交易费。区块链存储大数据成本很高,而且不合理。
    4 {6 q! f' {8 ?可以先将文件存储到IPFS,然后得到文件的Hash存储到以太坊区块链中。读取文件的时候,从以太坊区块链中获取文件的Hash,再通过Hash来读取IPFS网络上的文件。
    : {( M; S% k  N( p' j, W& }4 R使用官方提供的ipfs-api,可以很方便地在代码中操作节点将数据上传到IPFS,或者通过Hash从IPFS读取数据。( u$ b3 @. F; Q0 ^% f8 k( a
    Truffle框架提供了快速搭建包含以太坊智能合约的React项目,可以通过"truffle unbox react"创建工程,然后安装ipfs-api依赖库。于是,可以在前端方便地调用IPFS的接口来读取、上传文件。
    ( {' A% {2 o8 M1 E% w! atruffle unbox react官网:+ ^0 C, l+ U1 x: b% x) Q
    http://truffleframework.com/boxes/react
    ' X6 V0 h' z0 R! I" X7 E7 [
  • IPFS与DApp开发实战
    $ {) z0 ~" }/ J+ ^! ~$ o话不多说,开始进入实战开发8 i) e7 E- B4 f  J
    7.1 安装Truffle unbox react新建一个空目录"ipfs_dapp",然后执行安装命令- Y- F  B3 Z# w5 M( R; L2 w; O) D
    truffle unbox reactwenzildeiMac:ipfs_dapp wenzil$ pwd/Users/wenzil/Desktop/study/ipfs_dappwenzildeiMac:ipfs_dapp wenzil$ truffle unbox reactDownloading...Unpacking...Setting up...Unbox successful. Sweet!  Commands:    Compile:              truffle compile  Migrate:              truffle migrate  Test contracts:       truffle test  Test dapp:            npm test  Run dev server:       npm run start  Build for production: npm run build7.2 安装ipfs-apinpm install --save ipfs-apiwenzildeiMac:ipfs_dapp wenzil$ npm install --save ipfs-apinpm WARN deprecated bignumber.js@6.0.0: Custom ALPHABET bug fixed in v7.0.2react-box@0.1.0 /Users/wenzil/Desktop/study/ipfs_dapp├—┬ ipfs-api@22.0.0 │ ├—— async@2.6.1 │ ├—— big.js@5.1.1 │ ├—┬ bs58@4.0.1 │ │ └—— base-x@3.0.4 # ...... 省略N多行输出7.3 修改智能合约代码修改contracts目录中的"SimpleStorage.sol",修改后完整代码:- G, r% m; L; e# Q4 I; l
    pragma solidity ^0.4.18;contract SimpleStorage {  // 用于存储图片的哈希值  string storedData;  function set(string x) public {    storedData = x;  }  function get() public view returns (string) {    return storedData;  }}    修改"Migrations.sol"
      S5 A) C& ]1 T2 O, F. M  M9 ~, `function Migrations() public { owner = msg.sender;}修改为:constructor() public {    owner = msg.sender;}7.4 编译智能合约truffle compilewenzildeiMac:ipfs_dapp wenzil$ truffle compileCompiling ./contracts/Migrations.sol...Compiling ./contracts/SimpleStorage.sol...Writing artifacts to ./build/contracts7.5 部署智能合约进入remix-ide,复制SimpleStorage.sol代码,然后切换到"Run"菜单,选择"Injected Web3"进行智能合约的部署
    3 N2 G3 [% v4 m9 X+ \( b- ~3 `: I4 x, X/ v
    5521305-e9cbe2a2b1d0327b.png : C' ^$ N  d5 |8 r& D
    6 I( t; p$ B  M+ p! L8 k. T
    Remix-IDE部署智能合约5 \$ n- G* o9 b( A

    3 D& s3 z4 D5 f& D  f5 h8 e' Z4 A& K3 p9 Q) f
    5521305-1c0743601b91144b.png
    9 ^0 U2 P% G6 z8 D1 d2 D
    ! b; E! ^& N' K) ORemix-IDE部署智能合约-确认
    7 C  Q& w/ F# L" q
    - y0 |4 G9 [( W# ]然后复制智能合约地址,App.js文件中会用到合约地址为:"0xb177d6cf6916f128c9931e610c63208d9c5a40f3"
    ( l& n& V+ p* R# P7.5 修改App.js文件import React, {Component} from 'react'import SimpleStorageContract from '../build/contracts/SimpleStorage.json'import getWeb3 from './utils/getWeb3'import './css/oswald.css'import './css/open-sans.css'import './css/pure-min.css'import './App.css'const ipfsAPI = require('ipfs-api');const ipfs = ipfsAPI({  host: 'localhost',  port: '5001',  protocol: 'http'});const contract = require('truffle-contract')const simpleStorage = contract(SimpleStorageContract)let account;// Declaring this for later so we can chain functions on SimpleStorage.let contractInstance;let saveImageToIPFS = (reader) => {    return new Promise(function(resolve, reject) {        const buffer = Buffer.from(reader.result);        ipfs.add(buffer).then((response) => {        console.log(response)        resolve(response[0].hash);     }).catch((err) => {        console.error(err)        reject(err);     })  })}class App extends Component {   constructor(props) {   super(props)   this.state = {       blockChainHash: null,       web3: null,       address: null,       imageHash: null,       isSuccess: false  }}componentWillMount() {    ipfs.swarm.peers(function(err, res) {    if (err) {      console.error(err);    } else {      // var numPeers = res.Peers === null ? 0 :     res.Peers.length;      // console.log("IPFS - connected to " + numPeers + " peers");      console.log(res);    }});getWeb3.then(results => {    this.setState({web3: results.web3})    // Instantiate contract once web3 provided.    this.instantiateContract()  }).catch(() => {    console.log('Error finding web3.')  })}instantiateContract = () => {  simpleStorage.setProvider(this.state.web3.currentProvider);  this.state.web3.eth.getAccounts((error, accounts) => {  account = accounts[0];    simpleStorage.at('0xb177d6cf6916f128c9931e610c63208d9c5a40f3').then((contract) => {    console.log(contract.address);    contractInstance = contract;    this.setState({address: contractInstance.address});    return;  });})}render() {  return (    <div className="App">    <div style={{marginTop:10}}>智能合约地址:</div>    <div>{this.state.address}</div>    <div style={{marginTop:10}}>上传图片到IPFS:</div>    <div>      <label id="file">选择图片</label>      <input type="file" ref="file" id="file" name="file" multiple="multiple"/>    </div>    <button style={{marginTop:10}} onClick={() => {        var file = this.refs.file.files[0];        var reader = new FileReader();        reader.readAsArrayBuffer(file)        reader.onloadend = function(e) {          console.log(reader);          saveImageToIPFS(reader).then((hash) => {            console.log(hash);            this.setState({imageHash: hash})          });      }.bind(this);  }}>开始上传</button>  <div style={{marginTop:10}}>图片哈希值:{this.state.imageHash}</div>  <button onClick={() => {       contractInstance.set(this.state.imageHash, {from: account}).then(() => {          console.log('图片的hash已经写入到区块链!');          this.setState({isSuccess: true});      })  }}>图片哈希写入区块链</button>  {    this.state.isSuccess      ? <div style={{marginTop:10}}>          <div>图片哈希成功写入区块链!</div>          <button onClick={() => {              contractInstance.get({from: account}).then((data) => {                console.log(data);                this.setState({blockChainHash: data});              })            }}>从区块链读取图片哈希</button>        </div>      : <div/>  }  {    this.state.blockChainHash      ? <div style={{marginTop:10}}>          <div>从区块链读取到的哈希值:{this.state.blockChainHash}</div>        </div>      : <div/>  }  {    this.state.blockChainHash      ? <div style={{marginTop:10}}>          <div>访问本地文件:</div>          <div>{"http://localhost:8082/ipfs/" + this.state.imageHash}</div>          <div>访问IPFS网关:</div>          <div>{"https://ipfs.io/ipfs/" + this.state.imageHash}</div>          <img alt="" style={{width: 100, height: 100 }} src={"https://ipfs.io/ipfs/" + this.state.imageHash}/>        </div>      : <img alt=""/>    }    </div>);  }}export default App7.6 新建终端,执行"npm start"命令,结果如图:1 L& ^/ B* q7 N$ d3 O
    5521305-4dba93598490e042.png 8 N1 U" g) J5 T' V8 m+ u8 ^6 r

    6 G) H1 C2 ~, i- ?' p5 z: `npm_start
    6 d3 s- p/ C5 F$ C4 v3 |' g; c, ]5 P! O
    会自动打开网页,然后上传一张本地图片,之后点击"图片哈希写入区块链"按钮
    + n' z: @3 F! ~' m( |+ S# P
    7 i6 c7 {: c- Z, y+ U 5521305-c5e820e466316868.png
    4 j, z/ ]/ i! c* e
    ! Y* g# m' F0 f# m) g) K运行结果13 A8 e- U- R" s" Y" q% a1 `
    ) t: M! N# Y/ y; j
    最终效果如图:
    0 O' Z: b0 p) S6 N" z0 Z5 Q% B1 ^2 ~, J2 N. g8 f+ G

    % u8 x! j8 R: A. x. X: M" L& b 5521305-a13f100335acb2e5.png $ x" j3 A* d: b3 ^3 P
    6 D8 U2 \9 `# c, W, s* z9 h
    运行结果
    , ?$ A7 m# {4 K4 C5 V" G$ Y! S, D7 p- v5 \! v8 U# r
    访问IPFS网关:
    ; @/ i- j5 p1 A. Z1 Nhttps://ipfs.io/ipfs/QmbHptfJfyuGAZxstFYgAVfz33cytR1seTD3ZabBSDd899# [( ~0 F8 N. ]5 B
    发现图片已经成功写入IPFS,如图:
    - n% l/ x! H5 g9 a9 n  h. m
    1 T9 a* `9 f- u/ j. n3 X: H, k+ F7 f) U" {$ o1 F$ v0 ]6 |) e
    5521305-583743843cc663c0.png
    8 ]+ T( n7 Y' S5 d  _  r. q' C, u8 t( w
    运行结果31 f0 q' U7 I3 o/ N. [. S
    # Z. p% A5 g0 V6 w9 V! W
    备注:本地IPFS网关端口默认为8080,我的电脑上端口冲突了,系统自动修改为8082。6 Q# w, Q; V( r; v7 o& B; u6 `  |6 {
    搞定,收工。
    / r" e  f' v2 ~3 v- w' |7 x4 M" \PS:刚入坑的小白,很多不懂,还请各位大佬多赐教,谢谢!
    ( z" u. _# R# U$ [8 P# ~" E1 S1 U$ N  J* t/ l0 a
5521305-6bb3339c3bf60f73.png
5521305-f10de97d94961616.png
5521305-6a23898f658aaa52.png
5521305-4fc9604f1c9a3f8a.png
5521305-5a5a65e04aadc891.png
5521305-9a3e346dfd368715.png
5521305-e7b2945efee17b07.png
5521305-47b7c5838326410f.png
5521305-eb55bb51ae418085.png
5521305-3f47f331d7d63fb6.png
5521305-72d506bca193abec.png
5521305-b2de93582c9d0dac.png
5521305-9f5f8194546ee968.png
5521305-13caff069d686e6e.png
5521305-1f43ed03e72738db.png
5521305-f507c2fadf344358.png
5521305-34805df9bb0347e0.png
5521305-e9cbe2a2b1d0327b.png
5521305-1c0743601b91144b.png
5521305-4dba93598490e042.png
5521305-c5e820e466316868.png
5521305-a13f100335acb2e5.png
5521305-583743843cc663c0.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表