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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

社区广播台

查看: 2545|回复: 0

IPFS开发简介与入门实战

[复制链接]
发表于 2021-4-22 23:39:31 | 显示全部楼层 |阅读模式
本帖最后由 赤膊医数 于 2021-4-22 23:41 编辑
' I* d' C/ ?8 X- K" H- j: _
) j% k& ?# T6 x+ V/ g) Q' F, N2018年,最火爆且值得期待的区块链项目莫过于EOS和IPFS。1、IPFS简介
  • IPFS是什么2 q3 ?2 Q* K+ T& X% E& L4 M
    星际文件系统IPFS(InterPlanetary File System)是一个面向全球的、点对点的分布式版本文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。原理用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。
    8 M$ ~' d; r. c. e  H6 V- r以上内容来自巴比特官网介绍4 o& d( V( o1 j/ x7 p# }; r
    IPFS是基于区块链技术的去中心化存储网络,实现了永久性存储。
    2 ?3 b  o4 l( ?
  • IPFS的火热
    3 [, Z, i( N2 |1 u1 \  p4 W: gFilecoin ICO是迄今为止涉及金额最大的ICO,仅一小时就募集了接近2亿美元,打破ICO记录,成为2017年最火爆的区块链项目。IPFS项目吸引了世界各地数字货币投资者和互联网从业者的密切关注,2018年比较值得期待的是IPFS主网的上线。然而就在前段时间,官方公布说上线时间延期到年底。7 U4 y9 @) f  |3 f8 h
    注:Filecoin是IPFS激励层的加密数字货币(即代币),有点类似于以太坊平台上的以太币。
      K. F9 h& i" y: n6 r4 l+ g4 p; bIPFS官网:https://ipfs.io/
    ) E/ d$ k' K! {8 {Filecoin官网:https://filecoin.io/
    2 G1 U9 n+ B1 Q$ w% Q' @8 _
  • IPFS的应用案例
    3 v* I: H7 [* Q6 F) zGitHub有两款开源项目,且有对应网址,分别是音乐播放器和视频播放器。
    1 ^% @- r) _  d5 k3 m$ i
    $ G' |( ?2 d$ j! x
    • IPFS音乐播放器
      ( J3 w7 ]$ n8 {/ _; ]
      . R' H2 q4 Y* s2 z: U9 h4 c/ i8 ^: M3 P' \
      5521305-ae7a09ee6683f37a.jpg
      4 W- P6 S3 \$ \" ?& _3 J4 i
      5 Z- v0 Y. J8 t" T5 Y( JIPFS音乐播放器! M; e; H. f: l# f9 v

      # a5 \+ y8 k* C6 n! B3 H) A: v# fIPFS音乐播放器网址:https://diffuse.sh/& A& O7 w+ U$ n; O) H
      GitHub地址:https://github.com/icidasset/diffuse; x; K; D. y0 p* h9 L
    • IPFS视频在线播放器' v0 C6 k+ x7 o6 p+ q* F5 V

        H# D2 c9 b) n9 K7 F$ `4 r; L
      - g8 \+ d1 ~7 h 5521305-6bb3339c3bf60f73.png
      9 _$ X) H- V# Z* c( N0 L$ |2 z+ O, L  x9 R9 L# x0 }5 ?# `
      IPFS视频在线播放器首页7 }1 Z# l+ }/ U
      : Q7 q- P/ R* A3 ]0 ]
      - \# q; O; k/ F( A
    9 M- O0 }$ Q8 \' I8 j8 F
    5521305-f10de97d94961616.png
    # U; o! Y- i6 [0 ?: I7 h
    * Y, f3 S6 I( _1 {IPFS视频在线播放器播放电影2 \/ d5 `) W7 R$ ]& W8 T

    ) _" m- k: m: W4 }  l# I' U) J4 d" X号称是国内第一个IPFS应用  s/ t8 i1 a6 Z4 }+ \4 M4 V
    IPFS视频在线播放器网址:http://www.ipfs.guide/
    : g* u! U# t2 ^. P' B) e8 LGitHub地址:https://github.com/download13/ipfstube
    , Z4 n4 ^  n6 X/ w& H可用于测试的电影视频Hash(这里只列举两部):% g5 y/ m5 q9 x  ]
    神秘巨星:QmWBbKvLhVnkryKG6F5YdkcnoVahwD7Qi3CeJeZgM6Tq68
    7 a# R* j( z7 u0 _+ W' U  d- Y盗梦空间:QmQATmpxXvSiQgt9c9idz9k3S3gQnh7wYj4DbdMQ9VGyLh
    7 ]$ H/ D) \' F, X
2、IPFS的安装既然IPFS这么牛,有必要了解一下IPFS的开发,先从IPFS的安装开始。  d& o, ]  k7 ~- _, C
  • IPFS Desktop
    3 B* O" I" l' z) P当然,可以直接安装IPFS节点桌面管理软件来体验一下。该软件可以方便地运行和管理自己的节点,查看IPFS节点资源信息,支持二次开发。该项目是Node.js编写的,已开源。
    2 p( r, @! V5 a9 {" R0 W6 |- V  _0 v$ `1 Q2 c; b4 Y, I2 l$ \
    % G% i) j. t' T  K( Y
    5521305-6a23898f658aaa52.png $ n5 V$ Q0 y$ {3 n) r
    5 O7 j* s$ o7 Q* d/ z( y* d# ?
    IPFS节点桌面管理软件
    # m$ L4 [, a0 Z: o4 x! `% i, F- Y6 @% }  u* @# d3 A" |
    GitHub地址:' \5 R9 P5 O* \; J' B
    https://github.com/ipfs-shipyard/ipfs-desktop. P9 F% i% i) }# |
  • Go-IPFS& @2 t- I1 V. z4 x* U
    进入IPFS的官网,找到并切换到"Install"页面,点击"Download IPFS for your platform",会跳转到如下网址(需要翻墙):
    3 h. S% [% j9 x0 mhttps://dist.ipfs.io/#go-ipfs
    $ w# _2 m! n) y2 R! K* V: d$ q& _& a1 C  n
    5521305-4fc9604f1c9a3f8a.png
    4 v2 z6 A7 g# M) M! l
    ; I) ^8 {: m3 T下载Go-IPFS
    & o9 m3 L) G- M# E
    $ C; A6 _4 x, X+ C' w3 O如果打不开,可以试着去Github查看安装方法8 X# X) o9 \  m: S+ H  u6 A9 w
    GitHub地址:https://github.com/ipfs/go-ipfs# [2 X7 B' b- @- E# o4 D! f7 c, w
    将网页下载好的文件解压出来,下载的是"go-ipfs_v0.4.13_darwin-amd64.tar.gz",解压出来的是go-ipfs文件夹,
    7 Y0 H3 X; z7 p- ^  X# k' ^然后打开终端,进入到go-ipfs文件夹根目录,复制ipfs文件到系统的bin目录,然后可以通过"ipfs version"来检查,操作如下:4 q: u) y: R+ K: T3 Z& h& _/ [
    wenzildeiMac: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  F: x! l' W: @/ Z  x3 B
3、IPFS节点的创建、查看和启动以下是安装官网的Go-IPFS步骤下实验的7 V2 t' k( ~8 [. |# @) a
  • 创建节点% ~% Q* c/ l$ d+ D+ `7 B5 w2 a
    进入到当前用户的根目录,并使用"ipfs init"命令创建节点,可以用"open ./"打开创建节点生成的".ipfs"目录。. S* y# j6 @( g6 w0 A. s- B  m
    wenzildeiMac: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 ./2 o: O2 r  N6 m7 E+ M& P
  l9 L3 R% T2 d. e' ~  H2 N4 o
5521305-5a5a65e04aadc891.png
' r% z3 Q7 n9 O4 ]! [0 o6 p
& c2 b9 q: ~1 R+ A) h5 ^IPFS节点的创建2 J( H. w/ R$ [) S$ E/ j6 f/ F

1 ~2 ^" @/ e( I% T
  • 查看节点id
    % A- g- g! G* U& z3 N3 f% K( LwenzildeiMac:.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默认存储空间+ k- [. o+ l5 G% d5 q: b9 n" q
    存储节点默认存储大小为10G,如果你想修改存储空间,可以修改config配置文件,找到StorageMax并修改
    7 _( Z% z8 M& H- ]wenzildeiMac:~ wenzil$ export EDITOR=/usr/bin/vimwenzildeiMac:~ wenzil$ ipfs config edit  & K, R/ l, k. c
    5521305-9a3e346dfd368715.png
    ; g$ Q* Y5 Z5 Y$ H' Z, Z6 L: }" r" \
    $ Y: @* f8 k2 H; q3 h$ t! k. _修改IPFS默认存储空间
    : {0 m& o" j+ P$ d) \# P
    0 H( P. r. h* l. q% k0 \9 H
  • 启动和同步节点服务器
    2 H/ U9 `0 T+ K: e) P( ?执行"ipfs daemon"命令,可以同步节点数据到IPFS网络。
    ( O+ D9 Y5 V- M% Q9 I8 R& m& _  UwenzildeiMac:.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) T8 P: J! k9 q0 D6 A" z
4、IPFS运行体验
  • IPFS查看ReadMe% |, m. v; v1 b( E! B
    可以回去查看执行"ipfs init"命令的时候,返回的内容。打开一个新的终端,操作如下:" {" i9 _, d9 {5 g' r( Q5 j& A2 p
    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管理界面; R; L8 x( L9 ?8 Z
    IPFS节点服务器启动后,可以用浏览器访问:http://localhost:5001/webui+ I0 @" t  Y; g% k! j: o
    有本地配置、节点连接、本地节点文件等信息,如图:
    1 L5 S$ N5 O) _: T5 s# i4 X2 U$ X% T3 o. t7 G3 U* _4 k

    ' a9 H9 A8 }# a6 j" L 5521305-e7b2945efee17b07.png
    0 J* G3 C0 h$ O, U  T, p
    , O: W! i9 S0 g1 L- [% kIPFS的Web管理界面
    4 t5 o' d. T- s% J* o. j( d" K( _1 r1 s- L

    6 b; w6 x# B8 X
    $ i, N7 m$ p! M3 h4 n/ G( ~! p6 N9 I1 q
5、设置跨域资源共享当我们在前端通过js接口操作ipfs时,会遇到跨域资源访问问题,可以在终端执行以下配置来解决:
! g2 D" ~. f5 t' V6 }  Gipfs 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节点
  • 新建文件' |+ m. {" s# d# t/ U' ?
    wenzildeiMac:ifps_test wenzil$ vi test.txtwenzildeiMac:ifps_test wenzil$ cat test.txt IPFS测试文件
  • 添加文件到IPFS节点
    . J" c/ ~2 a+ zwenzildeiMac:ifps_test wenzil$ ipfs add test.txt added QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab test.txt添加文件到IPFS节点后,返回了文件的哈希值7 d& J( F6 c) c9 `. I% u  D
  • 查看IPFS节点的文件! @, z6 p: ~% N% w) s# p6 ?; M
    wenzildeiMac:ifps_test wenzil$ ipfs cat QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbIPFS测试文件注意:此时的文件只是添加到了本地的IPFS节点,读取的是本地数据,可以通过如下网址查看。
    & |+ E/ ]( ^4 o" \+ s8 U8 b' Jhttp://localhost:8080/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab& C! a9 i- p7 o  X2 ^4 ~. b
    通过"ipfs daemon"命令启动节点服务器,会将本地节点文件同步到外网,同步成功后,这时就可以访问如下网址来查看(如果访问失败,试着翻墙看看)。
    1 m3 x3 H$ g% J- nhttps://ipfs.io/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab$ ?8 _# m0 }# G' `" g
    4 X& z( s; S. R) i4 L8 |" Z  C$ n: N
    5521305-47b7c5838326410f.png 3 ^% r  Q. o6 f+ ~4 k2 I

      I1 @7 D3 {8 y- {2 Z查看IPFS文件内容% e# F" a# z' i1 ^' B+ h& I

    . u& f$ l6 ]/ f7 n如果访问成功的话,说明已经存储到IPFS网络中。目前IPFS网络暂未加入代币Filecoin机制,所以存储读取文件免费,速度也比较慢。& l8 d5 z; P* ]3 u6 J9 m
  • 下载IPFS节点的文件
    ' r% P3 M/ f0 E- zwenzildeiMac:ifps_test wenzil$ ipfs get QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbSaving file(s) to QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab 25 B / 25 B [========================================================] 100.00% 0s查看当前目录,发现多了一个"QmSV..."的文件"- G( D7 x+ n4 s( J9 b6 R
    6 B1 i2 q% s! L: P$ {$ o- }
    8 M( M& q7 L) K) I0 W* @3 x
    5521305-eb55bb51ae418085.png 1 A+ G" X! F9 z

    : Z# [% e1 F( F) X; N下载IPFS节点的文件
    ' ]! b/ O% A) A+ y7 \
    $ @7 M3 b+ {6 W2 k$ {& R- D
    7 U# w% ?1 D& ^1 Y/ h8 o. H; G
6.2 创建文件夹存储文件
  • ipfs命令新建文件夹
    ! T; }0 v8 A6 A8 @. n5 c9 uwenzildeiMac: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 /文件夹名"可以删除文件夹。
    + Q' T; N- v  g( n9 T2 O  N9 L& R6 v' q
6.3 IPFS上传文件夹
  • ipfs命令添加文件夹
    8 T$ ~7 A3 ]5 J* O3 G9 H2 p先在本地创建一个文件夹和对应文件,如图:/ o" t: H' \4 [2 D
    + D7 D3 ^* Y( N; ]. T

    ! r- M: e( p6 J& l; Z 5521305-3f47f331d7d63fb6.png
    + p+ K+ F; _7 @2 |" L3 w8 g( ]8 O9 E% a, l& k2 \3 P$ W, t0 i# Z
    本地创建文件夹及文件8 o4 W0 I; b- w# c' i0 ]: h

    4 V9 x* X4 J# B1 L, T  |然后通过"ipfs add -r 文件夹"命令添加整个文件夹
    1 y: F( K# d: E- b8 K& r7 v 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$
  • 查看文件夹的文件内容
    0 ~( O" b7 }5 ~6 n2 d, `% x. UwenzildeiMac: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对应文件夹
    . ]# l( y0 Z* z& \2 ?' D. V访问文件夹对应的IPFS地址:
    : u- D! E4 C& Xhttps://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj% W! Z& E6 @0 m  q0 H
    第一次访问的时候,需要同步数据到IPFS网络,等待时间有点久,慢到让你以为同步失败了。
    4 k. t, t2 s7 {" i. k9 r
    ! X4 d2 E1 ~6 |3 @* L 5521305-72d506bca193abec.png
    0 ~# Z& x3 n2 C1 }; T
    & Z2 }8 Q% q: i$ U; ~' V查看IPFS对应文件夹
    8 K6 ^8 [/ ?/ A) D3 u% @% d$ R+ f1 k' A2 z" v
    访问文件夹对应的文件,如看到图片文件,访问ipfs网关:
    , t% u, A# u9 |" u/ F. y1 [. mhttps://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj/portrait.jpeg6 n: y, f" ]" R/ U: ^

    " z0 B( |% t' ` 5521305-b2de93582c9d0dac.png
    % z1 ^  p* C0 O
      B8 F, f: E$ h- s8 }查看IPFS文件夹对应文件
    : c) ]( R( b2 z/ ^6 M9 G" \0 D- i$ L1 {0 F" E; ?9 g! \
    或者通过文件的Hash来访问,如访问txt文件的地址:
    - Z8 r* f5 w4 J- s  N" w" E! lhttps://ipfs.io/ipfs/QmPEWgwQEHD6qxm5cUivTEZ252T123DvQ5L6HyUDgViQvT
    ) L, _/ e( S/ J2 t. i$ I+ c$ O7 F% {1 T$ B+ u
    5521305-9f5f8194546ee968.png
    & q2 ]5 A0 H( `! M$ `, u( m+ b1 T! }! y: Q# x4 M# p' e
    通过文件Hash访问查看
    8 u* q% b4 F; R; M& z: o. }% u9 z. P: ~& @: s
    % @, h( \- o' S' s; r
6.4 添加简单网页到IPFS节点
  • 网页效果和项目结构& p3 K/ ^9 U" A$ c0 s7 M5 I
    实现一个简单的实时显示系统当前时间的网页,效果如图:
    ; a# z3 Z+ d$ y
    . q1 R. n% V5 j/ x, o4 Z
    : @8 X$ U) _9 P# J 5521305-13caff069d686e6e.png 8 a) w4 _* y1 K# n. J

    # B' z2 W6 a2 E+ n) f+ jIPFS添加简单网页
    ! N5 q5 T! C0 e2 M3 \8 _' ]& p% ^+ m  X; _7 R) S5 W
    工程结构如图:
    ) W8 @% P- D0 p# P6 J
    + k/ I$ O% m* K( d1 J" o6 i6 z8 A
    $ I, O4 r7 `9 q4 {/ _  \4 p& l 5521305-1f43ed03e72738db.png
    2 `6 `7 |. }$ u5 P+ A% o0 j% C" _2 d0 W8 X2 V
    网页工程结构
    $ B9 b9 E  C, s2 I8 M6 [! P
    7 f/ y. b7 O" ]* p, @5 w$ S/ Q, h! x. O2 \
实现代码比较简单,这里就不贴代码了。: Z. g7 y7 U8 N& L
  • ipfs命令添加文件夹
    2 O5 d; f: \# @8 r/ {wenzildeiMac: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"命令在新的终端窗口打开运行。
    9 J: m$ b" _3 P. KwenzildeiMac:~ 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 X, U0 U+ p; q* x. ^( m浏览器访问ipfs网关:
    " D) C7 A/ b8 \, G3 G! J. r$ z; h. uhttps://ipfs.io/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD/3 w: a4 E) n1 X8 c
    ' U7 z; d! A" j  z0 h4 D# }
    5521305-f507c2fadf344358.png 8 q# {+ @/ ]( j+ i5 T" b; g

    0 H4 b% A2 S  O" _( y/ z3 q& G查看IPFS对应网页- w" @$ ^2 u! H3 z) w" ?
    : J) ], D4 U0 b' V
    3 r8 ~6 f; I3 M+ N( `, N  p5 y: B/ P
6.5 IPNS绑定节点名
  • IPNS绑定节点操作
    4 n8 i  J% U3 p" Q0 f0 Q) z( m# Y每次修改文件内容后,文件的哈希值就会发生变化。对于网站而言,发布后可能还需要做修改,这时需要IPNS绑定节点名。每次更新网站内容后,重新publish一次更新发布到IPNS即可。) _' S1 {* ?3 M) C5 g
    刚才的html根目录的哈希值是QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD,操作如下:" `( n- M0 Q3 D6 B2 n
    wenzildeiMac:study wenzil$ ipfs name publish QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDDPublished to QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz: /ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 查看当前节点
    ) l" C5 O" c' G  y/ J3 uwenzildeiMac: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". d/ ^% F3 G* C" R* t' K4 S. s
  • 验证节点
    ' F% C; w+ d* c1 ?  w; F  F, }命令为:"ipfs name resolve 节点ID“
    % _9 F* @. a8 o. ]5 F, K6 E: i- owenzildeiMac:study wenzil$ ipfs name resolve QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 访问IPNS对应文件
    ; U/ L5 I; L( d/ E0 N浏览器访问ipfs网关:
    & C; K2 f5 X" zhttps://ipfs.io/ipns/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/
    / N& g  h3 P2 r5 @1 B' g( g9 X* J' o# I+ k; H1 p% T3 C

6 q  \$ o# q) Z9 u7 q1 v 5521305-34805df9bb0347e0.png
8 o/ n- ]0 n/ F/ x# f, K2 t" ~
! U/ G, O/ R# t7 f查看IPNS对应网页  H! }% s  R, E( l; P; \* t

9 h1 R: ?  L5 p) C8 x7、IPFS与以太坊DApp开发实战
  • IPFS与以太坊DApp结合的好处
    6 h; b+ s# P( W$ E; E* ?在以太坊平台上,往区块链写入数据需要花费以太币,调用智能合约执行每一行代码的时候,都需要一定量的gas交易费。区块链存储大数据成本很高,而且不合理。  x" m7 H, y7 x$ s+ Y/ ?
    可以先将文件存储到IPFS,然后得到文件的Hash存储到以太坊区块链中。读取文件的时候,从以太坊区块链中获取文件的Hash,再通过Hash来读取IPFS网络上的文件。
    * U& r/ u- v) p' x" L使用官方提供的ipfs-api,可以很方便地在代码中操作节点将数据上传到IPFS,或者通过Hash从IPFS读取数据。
    2 m$ c1 }  h  m2 A  H6 s, T7 h' q- ATruffle框架提供了快速搭建包含以太坊智能合约的React项目,可以通过"truffle unbox react"创建工程,然后安装ipfs-api依赖库。于是,可以在前端方便地调用IPFS的接口来读取、上传文件。
    8 a; C# B7 }2 M' m* Ttruffle unbox react官网:6 P, S6 U" z5 n- F; V+ w" E; @9 i
    http://truffleframework.com/boxes/react$ j* w5 g: x4 m; G
  • IPFS与DApp开发实战
    $ m5 i  o1 w, K9 X9 k8 w4 P话不多说,开始进入实战开发
    1 i6 x. P/ A. p9 J0 I. e7.1 安装Truffle unbox react新建一个空目录"ipfs_dapp",然后执行安装命令  i- l# l5 B' [# Z1 S
    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",修改后完整代码:
    5 m% o2 C% x, _  I9 vpragma 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"
    ) x. j  z5 y8 J6 C+ `6 b6 b1 jfunction 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"进行智能合约的部署
    8 y! c  n: @$ j* I
    # e: ^) ^  \/ H) e% x9 c% W 5521305-e9cbe2a2b1d0327b.png
    4 w, v& b( X( V# y6 I5 e. X1 V1 o/ }2 u& v& t
    Remix-IDE部署智能合约
    . T& D5 m& o9 S* w- @" N( y: F0 Z6 n- ~. R: y
    4 {9 P' ]" g' U. C5 e3 E, g
    5521305-1c0743601b91144b.png
      V0 S) |# Q/ n2 J8 p0 {1 q' i/ |* i/ |2 ^
    Remix-IDE部署智能合约-确认
    / H' j  f% @$ z* F( K9 b
    1 T" c/ S9 G, `/ K然后复制智能合约地址,App.js文件中会用到合约地址为:"0xb177d6cf6916f128c9931e610c63208d9c5a40f3"
    6 I/ Y6 G' n% C7.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"命令,结果如图:& ~, N0 ~4 `* o$ Q9 V: g9 O
    5521305-4dba93598490e042.png 9 y- Y  a; Q! K" \

    * {" b7 d2 v3 i: H7 Cnpm_start1 o+ s5 A! v) J2 y1 e7 G
    6 _+ [# }* U5 q+ r" \' V0 o3 L
    会自动打开网页,然后上传一张本地图片,之后点击"图片哈希写入区块链"按钮
    ( o1 P+ [# f5 R- B2 x
    $ z( W, G% n! r5 s) P' R; O 5521305-c5e820e466316868.png $ |( R$ f! n+ p8 M8 m0 ~
    9 D! n3 C7 L( w; {' V9 ~
    运行结果1
    ) D4 V/ H% i3 Q3 ~5 N- F5 g% x. v+ ^' |
    最终效果如图:/ `- Z6 V  E! S* [8 p# a: B. p0 K) v
    . G- v$ {6 f! I, R: U  s) l! z, v& x

      m$ X5 r0 P; H" d 5521305-a13f100335acb2e5.png / g; N: c$ C' Z; C1 e# ^! L$ ~

    ' I; F/ Q  ], O; |7 t运行结果- r- n4 x. g- ]2 y* Y: ~) H
    + h  E6 [) D8 K  \# S
    访问IPFS网关:
    / u3 e, C$ i) `. d# ^https://ipfs.io/ipfs/QmbHptfJfyuGAZxstFYgAVfz33cytR1seTD3ZabBSDd899
    6 Y2 i- L% l6 C6 [& X1 H发现图片已经成功写入IPFS,如图:
      `, \% T7 Q5 R* c9 ]7 Y1 S
    4 Z. F* s, y, A; u1 y$ l  g; d$ w; \2 J/ e
    5521305-583743843cc663c0.png
    - G+ `% Z6 ~+ b& g6 d7 `) e" V' x' _
    运行结果3
    8 D7 W& i5 h0 R6 W
    5 \; O$ w8 z5 y3 C' f- f备注:本地IPFS网关端口默认为8080,我的电脑上端口冲突了,系统自动修改为8082。+ |6 G0 G! u4 x7 X
    搞定,收工。
    ' s4 w  l- z( hPS:刚入坑的小白,很多不懂,还请各位大佬多赐教,谢谢!% U2 Z9 a+ b$ e: h
    * T7 x) p) ]7 t: L6 X4 h
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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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