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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

社区广播台

查看: 3455|回复: 0

IPFS开发简介与入门实战

[复制链接]
发表于 2021-4-22 23:39:31 | 显示全部楼层 |阅读模式
本帖最后由 赤膊医数 于 2021-4-22 23:41 编辑
1 [- x! \* u" A! w8 a
3 V# Z* k2 r8 ?2018年,最火爆且值得期待的区块链项目莫过于EOS和IPFS。1、IPFS简介
  • IPFS是什么2 H1 a( z4 e- }
    星际文件系统IPFS(InterPlanetary File System)是一个面向全球的、点对点的分布式版本文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。原理用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。  ~1 Y2 D' H# V2 k" F8 F9 h
    以上内容来自巴比特官网介绍
    5 g, d7 ]" [" J) n, E; PIPFS是基于区块链技术的去中心化存储网络,实现了永久性存储。
    , d# h5 d$ L$ B  s/ A
  • IPFS的火热
    : K5 n0 h4 ~) zFilecoin ICO是迄今为止涉及金额最大的ICO,仅一小时就募集了接近2亿美元,打破ICO记录,成为2017年最火爆的区块链项目。IPFS项目吸引了世界各地数字货币投资者和互联网从业者的密切关注,2018年比较值得期待的是IPFS主网的上线。然而就在前段时间,官方公布说上线时间延期到年底。6 H( B: e$ C( E1 i1 K0 U
    注:Filecoin是IPFS激励层的加密数字货币(即代币),有点类似于以太坊平台上的以太币。6 z) K& Z  i* l! f
    IPFS官网:https://ipfs.io/4 V/ \: J! r* V! r+ s
    Filecoin官网:https://filecoin.io/1 ]6 `/ t( g" _& Z* E1 m. A
  • IPFS的应用案例+ @, I' c: a, H5 v) I* y% a0 H
    GitHub有两款开源项目,且有对应网址,分别是音乐播放器和视频播放器。
    4 Q9 @7 W% y9 A! y' J- y+ U0 D( i; X+ x8 C! D/ y
    • IPFS音乐播放器0 _; F0 m7 O+ i* Q. d" M9 T5 {
      ( [6 D6 _* g- K3 c5 }
      ! R" C  X8 p1 {5 q. A. o
      5521305-ae7a09ee6683f37a.jpg
      1 r9 \0 Y$ r, v1 J% h, {
      % b" }" S: y( w4 F& ~IPFS音乐播放器
      8 k' L. }6 m  g. u
      6 Y" h4 }8 v  K) K3 f8 lIPFS音乐播放器网址:https://diffuse.sh/; b7 Y2 j9 D8 {! l* h6 |! r" u
      GitHub地址:https://github.com/icidasset/diffuse
      - {1 y$ M* z" m% H
    • IPFS视频在线播放器& N1 h5 ^; c! y8 M
      * n0 ?# D7 w: \6 {5 Q
      4 P# O1 {/ J3 N3 `) `! W, m
      5521305-6bb3339c3bf60f73.png
        L. H/ i7 [, q4 u$ Y
      + K% `, n- {1 MIPFS视频在线播放器首页
      " ]& H" H; z* n/ d$ t. Q
      # ~/ O) {4 F$ m; N; v! W( H! J' w

    7 j" p- s$ [$ x+ H3 p: A. P 5521305-f10de97d94961616.png
    4 P# d: Q; Q' r- @* N( r9 U( o5 J6 U; ^0 `
    IPFS视频在线播放器播放电影/ q/ `* y$ K2 s! L% Y- Z
    * \4 {4 ]. J& g' t& j0 _
    号称是国内第一个IPFS应用
    ' i) G3 ~- o" N* [) |  ^+ nIPFS视频在线播放器网址:http://www.ipfs.guide/
    / O7 K. T8 a4 j3 v  S+ UGitHub地址:https://github.com/download13/ipfstube2 @6 x  m- q. \+ G0 H
    可用于测试的电影视频Hash(这里只列举两部):2 O1 j6 s. s8 R. X8 ^1 j# B* i
    神秘巨星:QmWBbKvLhVnkryKG6F5YdkcnoVahwD7Qi3CeJeZgM6Tq68
    - ~& W6 |+ m7 [+ Q" F) ~: L# v盗梦空间:QmQATmpxXvSiQgt9c9idz9k3S3gQnh7wYj4DbdMQ9VGyLh
    7 R' M. i  f' h8 M) k0 w" [
2、IPFS的安装既然IPFS这么牛,有必要了解一下IPFS的开发,先从IPFS的安装开始。
6 |' Z; o" I" r
  • IPFS Desktop
    * Y0 V  F) h. C' f7 s$ }& F$ k当然,可以直接安装IPFS节点桌面管理软件来体验一下。该软件可以方便地运行和管理自己的节点,查看IPFS节点资源信息,支持二次开发。该项目是Node.js编写的,已开源。
    ! f8 x2 o5 g- [, n9 e1 E
    - {! r3 \7 g' q, F0 Y! W' U$ g
    ' F) J: A: s- a9 _ 5521305-6a23898f658aaa52.png ' f. u8 _1 S; f) J  t" Z

    9 S2 B% x4 e4 P/ U' D# cIPFS节点桌面管理软件8 A- h; x$ s* x. B( M
    / v) \4 y9 {6 }
    GitHub地址:% l# c& y  R/ M* b) x( E! H3 r
    https://github.com/ipfs-shipyard/ipfs-desktop
    1 O0 [4 `) e: p6 D  X' X! T
  • Go-IPFS* F- ^( Y& ~; T, f" i; p* K
    进入IPFS的官网,找到并切换到"Install"页面,点击"Download IPFS for your platform",会跳转到如下网址(需要翻墙):
    ' f. u& Y7 c. v' T' }$ _8 K- [/ bhttps://dist.ipfs.io/#go-ipfs
    $ G8 H6 K  z% s% x2 \, s$ v$ p1 l7 \6 }5 q8 A1 X
    5521305-4fc9604f1c9a3f8a.png * H: [& f6 p: z; j

    ( S; W% j$ B/ M下载Go-IPFS
      r8 N; a) w4 d
    7 o$ t5 i* d* _3 w如果打不开,可以试着去Github查看安装方法
    $ R* m! L% R4 v2 W2 EGitHub地址:https://github.com/ipfs/go-ipfs, d0 v0 n6 \% k: @/ ]6 C
    将网页下载好的文件解压出来,下载的是"go-ipfs_v0.4.13_darwin-amd64.tar.gz",解压出来的是go-ipfs文件夹,% P3 p, @1 F! x6 K! N- `
    然后打开终端,进入到go-ipfs文件夹根目录,复制ipfs文件到系统的bin目录,然后可以通过"ipfs version"来检查,操作如下:
    . |- o7 e. N4 N' R. \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
    6 T7 S: ^9 \, b' ~/ M6 \% ?/ z  z3 r
3、IPFS节点的创建、查看和启动以下是安装官网的Go-IPFS步骤下实验的
, e$ A2 U7 B# p& i% v+ r
  • 创建节点
    8 @( L0 m7 A" B( [- b进入到当前用户的根目录,并使用"ipfs init"命令创建节点,可以用"open ./"打开创建节点生成的".ipfs"目录。. T4 r9 r* i/ A" Z* }
    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 ./6 R4 e: R' ]2 Y" W. C. X
! m( M" N9 Q' l$ t
5521305-5a5a65e04aadc891.png
/ W9 c" L+ {" D$ C7 K+ P4 B0 U7 {5 j4 ]' g1 v, z$ I
IPFS节点的创建
5 d  r- O, c# e' |; G
: {1 y. q1 h" A
  • 查看节点id8 i( j% @6 a+ w2 g0 I  S3 l9 M* A
    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默认存储空间
    ( M$ M4 e: w$ r# b存储节点默认存储大小为10G,如果你想修改存储空间,可以修改config配置文件,找到StorageMax并修改
    : J% ]" ^; S, A- \  d* {$ G- ~wenzildeiMac:~ wenzil$ export EDITOR=/usr/bin/vimwenzildeiMac:~ wenzil$ ipfs config edit  + j7 [" k$ E2 {: d$ ]
    5521305-9a3e346dfd368715.png 9 u& b& ^8 \: ?. `0 K; ~. G
    , x2 R! Z' ?+ \- i! s3 s1 x
    修改IPFS默认存储空间6 j  A7 R2 d: @7 P) J, B

    6 i0 X( x* B0 Q; F- n
  • 启动和同步节点服务器
    ! A4 a+ I* c% {执行"ipfs daemon"命令,可以同步节点数据到IPFS网络。
    : `( ]; E# y. p/ jwenzildeiMac:.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
    7 x; |3 ~& S# H* X$ [
4、IPFS运行体验
  • IPFS查看ReadMe! D5 Z1 f6 H: z$ I$ {4 k" g0 q
    可以回去查看执行"ipfs init"命令的时候,返回的内容。打开一个新的终端,操作如下:
    ' W6 O% F( a! EwenzildeiMac:~ 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管理界面+ U5 G6 ?+ o; e- O+ W0 R5 C
    IPFS节点服务器启动后,可以用浏览器访问:http://localhost:5001/webui
    , ~2 s' \$ R5 C  c( p% W有本地配置、节点连接、本地节点文件等信息,如图:# F4 s0 W6 p1 t* h6 @
    ! q" P3 M7 s( W& ]6 V9 |! T0 K, e; U
    1 U2 H3 J' o4 V! a" Q! B
    5521305-e7b2945efee17b07.png / X  C! r) N+ K& R1 x* h( E

      }& b/ {- G; y9 pIPFS的Web管理界面; l, ?0 X9 k. R# \3 g, h
    2 d$ h3 W/ T) s. h5 |
    , y0 ^) \; o! }) B- c
    6 s6 s2 V7 u6 D8 @4 Q
5、设置跨域资源共享当我们在前端通过js接口操作ipfs时,会遇到跨域资源访问问题,可以在终端执行以下配置来解决:+ B; f1 ~% L% Q
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节点
  • 新建文件
    3 @/ |$ `: `( y8 S6 UwenzildeiMac:ifps_test wenzil$ vi test.txtwenzildeiMac:ifps_test wenzil$ cat test.txt IPFS测试文件
  • 添加文件到IPFS节点
    8 l$ H5 ]* B3 |  ^wenzildeiMac:ifps_test wenzil$ ipfs add test.txt added QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab test.txt添加文件到IPFS节点后,返回了文件的哈希值& G1 U, G/ W$ u3 X- H5 \- ^
  • 查看IPFS节点的文件2 e( b2 c5 B4 }0 E: Y' a, c
    wenzildeiMac:ifps_test wenzil$ ipfs cat QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbIPFS测试文件注意:此时的文件只是添加到了本地的IPFS节点,读取的是本地数据,可以通过如下网址查看。( p, n  {5 {8 p+ o6 c0 u* f8 |
    http://localhost:8080/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab$ P& G  l) x: r& ~
    通过"ipfs daemon"命令启动节点服务器,会将本地节点文件同步到外网,同步成功后,这时就可以访问如下网址来查看(如果访问失败,试着翻墙看看)。
    $ i  M0 m6 q+ W4 p+ `https://ipfs.io/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab
    7 |: s7 g% O: a5 p4 n( \
    4 I* F/ B$ C* s6 Z5 V3 x  S+ S 5521305-47b7c5838326410f.png ( ^0 B8 O9 ]5 p7 V  b3 d3 _
    5 s, Z: k- f* d7 t5 O; F
    查看IPFS文件内容
    5 F, l0 _1 i, P+ M
    . j: [0 F4 P' O) {如果访问成功的话,说明已经存储到IPFS网络中。目前IPFS网络暂未加入代币Filecoin机制,所以存储读取文件免费,速度也比较慢。
    * @9 n  F3 o# c& R2 N% Q
  • 下载IPFS节点的文件- r2 S* ], q# i! y
    wenzildeiMac:ifps_test wenzil$ ipfs get QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbSaving file(s) to QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab 25 B / 25 B [========================================================] 100.00% 0s查看当前目录,发现多了一个"QmSV..."的文件"
    9 F0 y8 A3 J5 l5 }4 C. e# `1 t
    * F' m( @- [; s( X, v
    ' n( H+ J, K( V0 e/ q& K 5521305-eb55bb51ae418085.png ' E; v" v, ~, f( A% r8 \
    ) d0 [! j9 l. f* N) V1 J) ]
    下载IPFS节点的文件6 a; z9 l# k( d$ \/ [
    1 Q: {( E7 |! o3 R
    9 V4 g. ~4 P1 l( l# ~) S6 W
6.2 创建文件夹存储文件
  • ipfs命令新建文件夹
    : I% ]2 \+ O9 B) s; c: I( nwenzildeiMac: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 /文件夹名"可以删除文件夹。
    ! ^. O4 K! V% _0 X
    6 t; Y, b) D* l9 H2 f
6.3 IPFS上传文件夹
  • ipfs命令添加文件夹9 h$ K- u+ v0 O: M4 S5 M
    先在本地创建一个文件夹和对应文件,如图:
    . o% p0 @$ y$ k- i9 f2 r+ E3 C" U. M1 {" Y' V2 M
    7 Z5 `' A& \5 f& V$ O4 X7 R
    5521305-3f47f331d7d63fb6.png
    1 f4 i8 Y# e6 g; A4 r# ]1 G9 f! f2 ?, W3 J& F. ~, h2 J
    本地创建文件夹及文件
    . K" t$ n, R8 C& Q; e% W. X  o' |" H) R0 _
    然后通过"ipfs add -r 文件夹"命令添加整个文件夹
    . p& Q: Z6 \7 B/ s' ~ 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$
  • 查看文件夹的文件内容
    : W4 ~0 X+ P8 ^4 SwenzildeiMac: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对应文件夹
    ) H6 T# t5 E/ q访问文件夹对应的IPFS地址:
    6 d5 {2 C5 ~" [: o3 thttps://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj
    / s$ w2 [0 ]0 U( V/ x1 U( }第一次访问的时候,需要同步数据到IPFS网络,等待时间有点久,慢到让你以为同步失败了。
    - b% o; M& \5 u- q# W/ c5 y8 k/ y* x% B5 E3 j  S
    5521305-72d506bca193abec.png 3 x5 c5 H) Q; i. W8 Q/ z6 p" m; l
    3 C: p/ G$ |- Z; I+ o
    查看IPFS对应文件夹
    + I- C) V) |' q% h1 t! S: O9 W' C8 n" Z) P
    访问文件夹对应的文件,如看到图片文件,访问ipfs网关:+ E1 z5 @% M; K, G% F' x- Q8 I
    https://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj/portrait.jpeg$ ?4 f6 V$ O& L* J8 i
    2 w# ^, z3 |- e7 n4 y- T5 K' N
    5521305-b2de93582c9d0dac.png 0 J9 f, C3 X, T( @) _
    " s) G. _) @! C1 e
    查看IPFS文件夹对应文件7 }3 y8 ?4 v" K1 q0 w

    ; h3 d8 F7 U$ x4 d或者通过文件的Hash来访问,如访问txt文件的地址:
    + @% V, S& E4 g; Q( J6 Jhttps://ipfs.io/ipfs/QmPEWgwQEHD6qxm5cUivTEZ252T123DvQ5L6HyUDgViQvT
    # u2 A6 i/ }2 T" Y5 x: F  _: g3 a- U
    5521305-9f5f8194546ee968.png
    + U# Y8 X& ?- r$ K- m
    % [) i# y: w; u( o通过文件Hash访问查看" f6 m7 q% F5 S
    + w! T3 P2 K* S8 D& O

    , P2 c4 N* a/ h# X3 z, [
6.4 添加简单网页到IPFS节点
  • 网页效果和项目结构
    ) |) S' a4 P) ^( P$ ]实现一个简单的实时显示系统当前时间的网页,效果如图:0 O' Y) f& z6 a6 U8 Q$ f
    3 G5 g0 q4 ^9 ]

    5 L& U; H/ `9 R7 j% f; B 5521305-13caff069d686e6e.png 5 s( |% D& u( O
    & R6 y2 |& Q8 @
    IPFS添加简单网页" y; C4 x6 v, |
    " K* Z5 ]8 s' @; f" d. o6 T
    工程结构如图:) s/ }' P  ~( V0 _1 C8 }; _- G& W" Q

    ; V% s9 ]. e& l* z: b3 R2 E5 V! S- K& f! T1 _' ]* e# X3 u+ E) n
    5521305-1f43ed03e72738db.png
    6 d% I& ]: b, T$ f& R4 q5 o9 M+ p0 C5 Z: b3 V
    网页工程结构
    " N4 e; \9 L: q: H
    % o+ U( c& f  o5 w$ |3 z1 x7 [1 U7 n0 F: }- T
实现代码比较简单,这里就不贴代码了。/ ~+ [2 k6 `' k  G
  • ipfs命令添加文件夹3 R' N+ g  X. N2 D& |1 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"命令在新的终端窗口打开运行。
    3 w, M* M& w# q8 |/ zwenzildeiMac:~ 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对应文件, k& O( {# @9 w6 v$ @" N
    浏览器访问ipfs网关:) U8 J" h: l5 Z% b8 r8 D7 ^
    https://ipfs.io/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD/
    5 g9 r5 X; R+ ?' M6 c0 b3 n4 ?$ S0 R1 x( f# F8 \! o: ?) a  J$ \
    5521305-f507c2fadf344358.png
    , N' @# |5 |: \9 ?7 b) c' b
    ; j1 L2 W! K* W( v& r查看IPFS对应网页
    4 Q" L- p+ \9 P  C: t  t% H: [

    ) |/ d# s# s1 p& ?# e0 O6 ?
6.5 IPNS绑定节点名
  • IPNS绑定节点操作% r' O' K8 J4 @/ f6 d3 t' I/ j
    每次修改文件内容后,文件的哈希值就会发生变化。对于网站而言,发布后可能还需要做修改,这时需要IPNS绑定节点名。每次更新网站内容后,重新publish一次更新发布到IPNS即可。
    / x; {8 y  ~: W% P" Q7 s2 O刚才的html根目录的哈希值是QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD,操作如下:$ y& ?; A2 U' d- K% T/ _
    wenzildeiMac:study wenzil$ ipfs name publish QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDDPublished to QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz: /ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 查看当前节点4 d4 Y: X; l1 Y! V
    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"/ f$ E( x3 w* K2 `" W2 J/ d
  • 验证节点
    % h7 I4 K/ k# T( z命令为:"ipfs name resolve 节点ID“
    " g4 V0 U: H8 |* O( ~- `wenzildeiMac:study wenzil$ ipfs name resolve QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 访问IPNS对应文件$ D  @7 g' C9 d1 x- v7 W
    浏览器访问ipfs网关:" U& D0 z; A$ p) @4 n0 a% l
    https://ipfs.io/ipns/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/
    & H$ l( y/ o  \
    3 N5 k" k3 e( H9 |: y5 ^2 w* w
4 u5 u, F+ B& B2 D  E
5521305-34805df9bb0347e0.png % }1 v" W9 W+ S' v9 F, U& K/ D, v

+ s4 \. O6 {; [% h' p) I/ y! p1 ^查看IPNS对应网页( C( L* g4 M/ J
$ X; u3 u- A# R; E
7、IPFS与以太坊DApp开发实战
  • IPFS与以太坊DApp结合的好处3 x+ `8 G& S6 [2 _
    在以太坊平台上,往区块链写入数据需要花费以太币,调用智能合约执行每一行代码的时候,都需要一定量的gas交易费。区块链存储大数据成本很高,而且不合理。  J' P# ^, h: E4 x$ I" S
    可以先将文件存储到IPFS,然后得到文件的Hash存储到以太坊区块链中。读取文件的时候,从以太坊区块链中获取文件的Hash,再通过Hash来读取IPFS网络上的文件。. d9 V0 T% ]/ T8 M+ c
    使用官方提供的ipfs-api,可以很方便地在代码中操作节点将数据上传到IPFS,或者通过Hash从IPFS读取数据。* r; |% f( k+ C
    Truffle框架提供了快速搭建包含以太坊智能合约的React项目,可以通过"truffle unbox react"创建工程,然后安装ipfs-api依赖库。于是,可以在前端方便地调用IPFS的接口来读取、上传文件。1 C0 q3 l/ v: x2 q  N* Z' n# V
    truffle unbox react官网:
    4 b" n" L  }" |; lhttp://truffleframework.com/boxes/react
    % J, O! L2 J7 M* R1 z7 i- C, W0 @
  • IPFS与DApp开发实战
    ' h+ j5 w- B  s5 `! d话不多说,开始进入实战开发1 Y' V% v/ H$ ^5 t/ `! f( F4 X! t) q
    7.1 安装Truffle unbox react新建一个空目录"ipfs_dapp",然后执行安装命令
    7 R- i% v3 A! o: p' B/ a7 m" R- qtruffle 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 x3 q- Y7 Z7 n! |  u1 I6 @
    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"
    % o* J0 R8 m2 R( Gfunction 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"进行智能合约的部署/ i0 z" y6 x8 T# o" ~
    9 o5 U5 @$ i- j# d3 ?5 ^3 R
    5521305-e9cbe2a2b1d0327b.png # F5 p+ Z' W' ]; |
    1 \& N6 R2 h* ~" u) Y: D
    Remix-IDE部署智能合约
    , f9 v* h! L# q2 m" U6 O& t0 G) f; K, v( `" J
    / p/ Y( @8 d2 l9 V
    5521305-1c0743601b91144b.png ; |* u6 K' I3 d; x2 L8 D7 P( j
    2 K( a/ ~8 b: f! K
    Remix-IDE部署智能合约-确认
    , R! l+ m3 q0 [& ?  b+ ^
    ( y6 e, r! T, p( |4 ~9 E% O- I然后复制智能合约地址,App.js文件中会用到合约地址为:"0xb177d6cf6916f128c9931e610c63208d9c5a40f3"+ A% d) v7 H4 _  h
    7.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 h; n( ^& M! E) x& @
    5521305-4dba93598490e042.png
    8 ~3 [6 }7 N: u3 i( k) W! H/ n& a2 ~9 E1 X' @! b1 i* [
    npm_start
    & a) A. O" j- S( l2 o3 g6 b2 L; |- e, ]/ h6 a
    会自动打开网页,然后上传一张本地图片,之后点击"图片哈希写入区块链"按钮( Y  ]6 u8 {! d6 p5 k) N3 H( m

    ! B2 P- K0 x* U- h4 S0 o& Q$ n 5521305-c5e820e466316868.png + t$ q6 i, j7 m

    , _5 `. }8 _5 y( G4 C4 C运行结果1
    ( B  \2 x3 U3 o0 K/ G# f4 Z9 m, \- W
    最终效果如图:, t7 h- K& c9 J6 I8 Q8 S+ F6 h
    , y- U" S) s6 B9 V1 G6 d  i

    # A0 K0 f2 m+ f% u  V6 C9 Q8 i, Q 5521305-a13f100335acb2e5.png ( R, I# \" Z$ T& w3 b
    - I" q( O0 E) \/ v
    运行结果/ c8 s  y5 k6 d- t! ?( r8 v) \

    2 s/ I$ v  s  E. B: {: J7 |访问IPFS网关:, w1 w+ C# @. I2 a, I
    https://ipfs.io/ipfs/QmbHptfJfyuGAZxstFYgAVfz33cytR1seTD3ZabBSDd899
    + O' O4 t& o; ]* _; E& l发现图片已经成功写入IPFS,如图:
    ) \$ F$ F* Z: T  w/ q( K1 R9 |4 F2 v6 E

    ) x' V1 u; S5 t8 M- H 5521305-583743843cc663c0.png # P& B/ t# D7 X+ p% R$ l
    : G# z7 v4 p( r& P5 e7 A+ v4 ^
    运行结果3
    ! j0 X* v  p! ]# S1 d8 z* q6 a4 C0 W, ^. j( E" z' h1 p
    备注:本地IPFS网关端口默认为8080,我的电脑上端口冲突了,系统自动修改为8082。- F! X3 b! A5 Y* I  J, ~5 u+ y8 ~
    搞定,收工。
    7 I% M+ @# \8 C8 X9 f/ T# g$ {PS:刚入坑的小白,很多不懂,还请各位大佬多赐教,谢谢!) r" J7 ]5 ~+ `& j2 ^+ a

    ! J+ ?3 [- h, C6 x/ P- j
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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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