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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

社区广播台

查看: 2945|回复: 0

IPFS开发简介与入门实战

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

      * \& @  `% w: ^2 g* e 5521305-ae7a09ee6683f37a.jpg " V% e5 L  F9 A- S& l
      & c1 l  M+ j, @% D; f: {
      IPFS音乐播放器
      / f6 n: `# g. t6 [3 H+ p& J4 Z5 U7 G. L5 Q# p6 L0 H" ~
      IPFS音乐播放器网址:https://diffuse.sh/- D% |" b1 U0 u  U9 |6 v
      GitHub地址:https://github.com/icidasset/diffuse3 [) E& D* l4 J0 y! x
    • IPFS视频在线播放器  Z2 j1 j* G5 E% h: ]

      7 A; \1 H, s2 H5 w: c3 N5 a" ], U- P. C9 ?' r# U
      5521305-6bb3339c3bf60f73.png " Z4 U5 B3 ~5 o: A! G* a* o

      0 l( ~0 G9 }: M0 B7 F9 B) ]9 ?  eIPFS视频在线播放器首页
      " ]8 x& V# E& X1 P/ \1 ~
      5 K+ O  [1 x' l8 E& v. i' C) \! K. A- }0 Y) x2 A
    ( ]1 c; ]/ s8 G8 K
    5521305-f10de97d94961616.png
    - o- \& @- ^. {* r% Z$ b* ^8 s# `$ D6 J  q7 Q
    IPFS视频在线播放器播放电影; A" c6 p$ s; Z  c

    7 c* k8 F8 w0 D3 I# i号称是国内第一个IPFS应用' b$ T5 Q5 B* g# H) |6 Z
    IPFS视频在线播放器网址:http://www.ipfs.guide/6 Z2 s7 h% ^: ]; @: ~" Z% I
    GitHub地址:https://github.com/download13/ipfstube
    7 U2 B8 j5 J% J0 B: E3 i5 K可用于测试的电影视频Hash(这里只列举两部):. Q- O  U( }2 a
    神秘巨星:QmWBbKvLhVnkryKG6F5YdkcnoVahwD7Qi3CeJeZgM6Tq68. J% ]7 D: g' n% D/ Q0 b/ a" s
    盗梦空间:QmQATmpxXvSiQgt9c9idz9k3S3gQnh7wYj4DbdMQ9VGyLh
    8 M. U1 r: H* [0 p
2、IPFS的安装既然IPFS这么牛,有必要了解一下IPFS的开发,先从IPFS的安装开始。5 @; l4 g% m. F- \  H
  • IPFS Desktop
    8 p1 z( F/ S, ~& c- b- L9 l当然,可以直接安装IPFS节点桌面管理软件来体验一下。该软件可以方便地运行和管理自己的节点,查看IPFS节点资源信息,支持二次开发。该项目是Node.js编写的,已开源。8 z) o0 B0 i1 A5 x' D) y+ D

    & J% ^& ~2 L8 N
    ) B! A2 N, H9 y% T( _ 5521305-6a23898f658aaa52.png
    3 s; Z' r2 ^+ j7 @/ u7 }7 [3 {, j  D: U7 z; p/ ^
    IPFS节点桌面管理软件
    9 N& Q" f& G9 J# e* b& J6 Q4 c4 x
    GitHub地址:
    3 Q! p8 q) E: Z! |4 _5 K2 {https://github.com/ipfs-shipyard/ipfs-desktop  k: C5 y1 S, ^
  • Go-IPFS: q  t) Q+ B: R
    进入IPFS的官网,找到并切换到"Install"页面,点击"Download IPFS for your platform",会跳转到如下网址(需要翻墙):' o' L% b. P- R7 p6 |
    https://dist.ipfs.io/#go-ipfs
    ; N: H5 ~; b6 c- ?( a: j
    ; ~2 ~$ c( ]' {" g% t 5521305-4fc9604f1c9a3f8a.png
    2 N) l7 u4 o" H+ Z9 a* U, Z: e
    8 J% w& j+ P. B  |下载Go-IPFS" d- M/ S) V+ G2 b

    0 p/ }! p) M' H0 O5 e/ T如果打不开,可以试着去Github查看安装方法
      X% {: m" M+ D0 S  L+ u! t3 @GitHub地址:https://github.com/ipfs/go-ipfs4 t2 \3 }" h6 l0 n4 D' U) z% L4 {
    将网页下载好的文件解压出来,下载的是"go-ipfs_v0.4.13_darwin-amd64.tar.gz",解压出来的是go-ipfs文件夹,
    & K1 I+ ~. y% {然后打开终端,进入到go-ipfs文件夹根目录,复制ipfs文件到系统的bin目录,然后可以通过"ipfs version"来检查,操作如下:
    1 I' f4 {' Q3 [" SwenzildeiMac: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; I, O. h. G: E% P
3、IPFS节点的创建、查看和启动以下是安装官网的Go-IPFS步骤下实验的
$ c8 g4 x# k( `' [# \# d
  • 创建节点! _' V: J6 @1 z
    进入到当前用户的根目录,并使用"ipfs init"命令创建节点,可以用"open ./"打开创建节点生成的".ipfs"目录。9 t) y" e; Y/ @6 V# G/ P" [# G) A
    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 ./
    " b* O5 h: ~, F% d% v% {

3 `* G* g' u4 ]( A0 ? 5521305-5a5a65e04aadc891.png ; K  {% N/ c: M

3 O5 D- f9 `- r$ v8 GIPFS节点的创建4 G' s. z( L6 j& R( r& ]) ~3 c
# R6 \. J/ L5 j& ~, U
  • 查看节点id* `- R( m7 g( e) G+ T: p0 w
    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默认存储空间
    8 K6 H' c: a* v+ L存储节点默认存储大小为10G,如果你想修改存储空间,可以修改config配置文件,找到StorageMax并修改, I2 p# ?/ ^& e9 t' |0 ~2 d
    wenzildeiMac:~ wenzil$ export EDITOR=/usr/bin/vimwenzildeiMac:~ wenzil$ ipfs config edit  8 |6 N" U+ T4 G( u
    5521305-9a3e346dfd368715.png 7 f& e, H$ D- B' m# N: J
    4 e8 p' Q5 @' v9 x
    修改IPFS默认存储空间
    2 t" c5 w* r9 r* p! x4 ~; t
    1 K6 _9 i1 C4 }3 Z$ p; U$ ]
  • 启动和同步节点服务器& }, P2 B2 Y) O  h
    执行"ipfs daemon"命令,可以同步节点数据到IPFS网络。
    , \" s* n/ h1 ^6 GwenzildeiMac:.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
    8 p" r, S1 c6 Y5 h1 O# b
4、IPFS运行体验
  • IPFS查看ReadMe) \3 a. l5 X- r6 j* R2 J: d0 ?
    可以回去查看执行"ipfs init"命令的时候,返回的内容。打开一个新的终端,操作如下:0 ?$ Y- r; f  |) Y0 \) _+ y
    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管理界面4 v& ?4 T0 h$ P3 Z
    IPFS节点服务器启动后,可以用浏览器访问:http://localhost:5001/webui/ Z3 R. N! R+ y/ q8 H
    有本地配置、节点连接、本地节点文件等信息,如图:+ D9 E- Q8 O( _0 [8 w& j

    ! f3 }1 B+ \; @8 A$ F# Y0 s: E1 ^) o
    5521305-e7b2945efee17b07.png
    2 r$ g8 v* {0 S4 A! Z  L2 B& U, B1 s7 i  p- t
    IPFS的Web管理界面
    2 A9 U+ ?0 t# V6 b3 Y: O$ p
    3 T/ p) O! K' H3 j4 U
    5 I' m: S( B; J  j, S0 M2 w9 H9 P- k( N
5、设置跨域资源共享当我们在前端通过js接口操作ipfs时,会遇到跨域资源访问问题,可以在终端执行以下配置来解决:  _( L. U7 G/ g0 a' ~4 `
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节点
  • 新建文件7 H- [5 c& Z' t
    wenzildeiMac:ifps_test wenzil$ vi test.txtwenzildeiMac:ifps_test wenzil$ cat test.txt IPFS测试文件
  • 添加文件到IPFS节点$ D+ o1 I( V" v# S; \
    wenzildeiMac:ifps_test wenzil$ ipfs add test.txt added QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab test.txt添加文件到IPFS节点后,返回了文件的哈希值
    ; d  z4 |1 b' U- o' X  }+ V6 j" |+ p
  • 查看IPFS节点的文件" ]; ?5 X8 A! j# _/ N
    wenzildeiMac:ifps_test wenzil$ ipfs cat QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbIPFS测试文件注意:此时的文件只是添加到了本地的IPFS节点,读取的是本地数据,可以通过如下网址查看。+ y" i$ {1 B' w  d
    http://localhost:8080/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab
    " u; P5 g# y, d9 t+ Q通过"ipfs daemon"命令启动节点服务器,会将本地节点文件同步到外网,同步成功后,这时就可以访问如下网址来查看(如果访问失败,试着翻墙看看)。
    9 h* l" c9 \: X. p  P1 dhttps://ipfs.io/ipfs/QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab/ p! m6 ?. j0 Q; ?/ |) X
    ' J' |% V' q9 S4 H$ d' Q, @2 a; n
    5521305-47b7c5838326410f.png
    7 z, Y$ D+ e, S: ~0 x& W5 h9 V  N8 U! ^9 i: T- P( X
    查看IPFS文件内容
    : V5 ?: W0 u- p0 l9 B% b0 i' V8 K+ c& k, Z3 e- D# X. {. j
    如果访问成功的话,说明已经存储到IPFS网络中。目前IPFS网络暂未加入代币Filecoin机制,所以存储读取文件免费,速度也比较慢。  U. N1 n5 F; s, J8 }3 R& y) x
  • 下载IPFS节点的文件
    & l! v" w: _* Z9 ~  T& Q1 k6 O- ewenzildeiMac:ifps_test wenzil$ ipfs get QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2AbSaving file(s) to QmSVKEwPBTzw5QLzGUE8oN8J1r4cadMeieSw4Co1ozm2Ab 25 B / 25 B [========================================================] 100.00% 0s查看当前目录,发现多了一个"QmSV..."的文件"" `+ j3 z* a; f1 ]# a
    3 G, \3 r2 S( x1 g/ ~
    $ p0 N6 z, Y, x+ m* u( b
    5521305-eb55bb51ae418085.png
    $ F( d8 r* X. a! y3 H$ Y5 m& b. ]
    . k& E; t5 `8 G& t& U6 ^/ G下载IPFS节点的文件7 a4 k( w1 O* M
    1 ]  ?7 r; O  ^

    0 S6 e- v7 z2 Z  c
6.2 创建文件夹存储文件
  • ipfs命令新建文件夹
    ) l  e: `" l7 R9 {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 /文件夹名"可以删除文件夹。/ [8 u: Y4 }3 b7 z+ d
    - q% {' j- N. D$ t7 x( F
6.3 IPFS上传文件夹
  • ipfs命令添加文件夹
    " b" w. A$ G$ f$ E$ ^+ B先在本地创建一个文件夹和对应文件,如图:' ?: p1 O# }6 o' c
      |- @6 e- l0 J( `
    . x% e# t3 a) h
    5521305-3f47f331d7d63fb6.png
    % t. U4 C' F3 y2 \4 n' Q9 O2 w4 x( Z1 l4 @5 H6 r0 @
    本地创建文件夹及文件
    5 J& z3 V; W; ~+ `5 j3 v* N4 L9 W
    " o# y( N, F% C& z然后通过"ipfs add -r 文件夹"命令添加整个文件夹/ V0 M7 M$ C9 p% r2 w
    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$
  • 查看文件夹的文件内容7 i0 r1 `! s7 Q- d; i
    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对应文件夹
    3 ~8 s2 Q$ |6 Y# `) C9 n访问文件夹对应的IPFS地址:
    / }$ l; K. J6 q  Uhttps://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj
    2 H% R/ T  E4 L5 U( ]第一次访问的时候,需要同步数据到IPFS网络,等待时间有点久,慢到让你以为同步失败了。
    . c! m7 ^# I+ X$ t% {) K# C# {7 a! w+ \
    5521305-72d506bca193abec.png
    9 c- Q8 R* M& P6 {' F
    * @* t+ s& U3 v- U查看IPFS对应文件夹- m9 [. v; ^6 m1 s1 ^
    9 z  A! h) u; N" a0 q1 S, [
    访问文件夹对应的文件,如看到图片文件,访问ipfs网关:
    2 d" ?. X) e, n7 fhttps://ipfs.io/ipfs/QmdSd3xxKcwuMugyLCiLWzaeZKDkuM39R2tzyF3kBFDoaj/portrait.jpeg. S/ A7 w' x9 m( A

    7 H0 _1 b, L; y. a 5521305-b2de93582c9d0dac.png # _/ }* G1 b/ w

    : I& G. ~# Q/ L! ^8 M2 ]: r& |查看IPFS文件夹对应文件
      Y3 h/ V, I5 w* y" h. P
    $ m: T" Y- |1 {+ L2 @; S或者通过文件的Hash来访问,如访问txt文件的地址:
    $ V/ S5 i% o# |: w" C- ^1 y3 h8 q$ Whttps://ipfs.io/ipfs/QmPEWgwQEHD6qxm5cUivTEZ252T123DvQ5L6HyUDgViQvT
    9 y, q; y# Z4 A4 W3 N4 ?; x2 R2 W' O7 q4 p; I! T# |
    5521305-9f5f8194546ee968.png
    - ^* P/ I7 d% C2 Q3 @( k! K
    9 p7 h% a, d5 d4 r6 u$ g通过文件Hash访问查看
    9 K) j7 m( U8 u- U1 H
    , v+ E7 B; k9 K9 J+ J! ]6 h
    : _; x: h) m/ E  {
6.4 添加简单网页到IPFS节点
  • 网页效果和项目结构+ I  f3 l9 Y: a& m$ G* Q, C
    实现一个简单的实时显示系统当前时间的网页,效果如图:+ N( Z" L0 L) {5 n6 |1 S
    - R9 L0 o) O, M: x; h
    : J8 s! M" `5 l9 K
    5521305-13caff069d686e6e.png
    , ~  c' P9 T$ x" h0 b8 o1 `  M: ~- o0 G, G  l7 d, ?8 i
    IPFS添加简单网页( y- _, E& u( b/ A
    1 f/ d9 `! l% S7 }7 N5 ^
    工程结构如图:
    8 J* M& t3 s5 O( i, y9 y" _/ E" @8 F- Q

    2 ~! ^* ^$ }; ? 5521305-1f43ed03e72738db.png   b4 Z2 W: `1 R. X
    - h/ L0 U) j& n) V* u
    网页工程结构( {' s4 W% H, }6 S; U
    3 z9 T# `+ z# s5 _' N0 U/ c
    $ H! }. e5 \' r6 m- d8 o
实现代码比较简单,这里就不贴代码了。3 C1 b' U% d1 n* C& H, `( c
  • ipfs命令添加文件夹! \# Y9 P$ A3 S( _& g
    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"命令在新的终端窗口打开运行。. J% A$ [- w0 \0 g( F$ @+ _
    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对应文件
    % c6 n/ n9 Z) P浏览器访问ipfs网关:1 }% |5 Y3 o5 ?  F: m3 y& |
    https://ipfs.io/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD/
    8 e! Y3 c* U+ I& i/ ^4 N. W7 w
    0 A6 i% J9 p& H 5521305-f507c2fadf344358.png   T7 {" c$ w& [& u1 W0 E

    : e0 X' B6 I* w3 f查看IPFS对应网页
    # ~& L/ d1 B. ]( k8 W& d1 v, @# d& B- c; ~

    , W$ P, a& L  p% [- m/ y
6.5 IPNS绑定节点名
  • IPNS绑定节点操作
    ! c. Y4 R: c  L' E7 t' `' S每次修改文件内容后,文件的哈希值就会发生变化。对于网站而言,发布后可能还需要做修改,这时需要IPNS绑定节点名。每次更新网站内容后,重新publish一次更新发布到IPNS即可。
    7 ?' \9 t2 p7 x' p9 D刚才的html根目录的哈希值是QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD,操作如下:; y3 N. C/ K' K! h0 J
    wenzildeiMac:study wenzil$ ipfs name publish QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDDPublished to QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz: /ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 查看当前节点
    4 L$ p1 t! c* R7 h( q1 twenzildeiMac: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"
    9 O: q2 m: T0 y' M1 ^9 V
  • 验证节点& |1 y" u5 O/ x, a+ U. k
    命令为:"ipfs name resolve 节点ID“% m8 Q, Y$ B+ Y. k. {7 p( `+ o0 U! ?
    wenzildeiMac:study wenzil$ ipfs name resolve QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/ipfs/QmeG6LKmEfF5s62cySE9ZnU8EifmU46CQTixipfzsZspDD
  • 访问IPNS对应文件
    - y- @# G! p9 b6 w5 a+ l浏览器访问ipfs网关:6 d3 i; v1 P; ^4 I* _; s
    https://ipfs.io/ipns/QmcXWJqPjCgr1wrReWu2zUT41E5FrrXp2uyyNZRr7jXXrz/
    + M" s# t! i1 B6 t$ K/ n4 q8 y$ f: k+ Z
; q, U( {* D* a+ y
5521305-34805df9bb0347e0.png 1 J5 H7 ]5 q0 \7 ?- n

5 h$ f  S4 l) o查看IPNS对应网页5 K; `6 A5 x: {5 H5 R/ m, c( b

. t) F1 Q1 g6 U; b1 S7、IPFS与以太坊DApp开发实战
  • IPFS与以太坊DApp结合的好处: T% r5 d6 O( a; h3 @8 K! f
    在以太坊平台上,往区块链写入数据需要花费以太币,调用智能合约执行每一行代码的时候,都需要一定量的gas交易费。区块链存储大数据成本很高,而且不合理。
    : M$ R/ x" ~7 A; ^  x; D可以先将文件存储到IPFS,然后得到文件的Hash存储到以太坊区块链中。读取文件的时候,从以太坊区块链中获取文件的Hash,再通过Hash来读取IPFS网络上的文件。0 |( C% j7 Q" D2 p: B  u2 Z
    使用官方提供的ipfs-api,可以很方便地在代码中操作节点将数据上传到IPFS,或者通过Hash从IPFS读取数据。$ r7 ]% e; _  Q- C/ E
    Truffle框架提供了快速搭建包含以太坊智能合约的React项目,可以通过"truffle unbox react"创建工程,然后安装ipfs-api依赖库。于是,可以在前端方便地调用IPFS的接口来读取、上传文件。9 F! b" y. O( M4 r
    truffle unbox react官网:
    ) r+ d' S/ n% p) g: J  ^http://truffleframework.com/boxes/react& |: O6 D2 B, Z8 }: N' o
  • IPFS与DApp开发实战
    3 R- c- j# I( \. ^! n话不多说,开始进入实战开发+ v  q+ a( a2 G
    7.1 安装Truffle unbox react新建一个空目录"ipfs_dapp",然后执行安装命令
    8 t: ]3 |$ L% J3 ]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",修改后完整代码:
    ! W& ?/ ?6 d3 p! S6 Y. K5 U0 o8 \/ W1 ]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"3 O# C& f7 M. U' f0 M9 U- B' M
    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"进行智能合约的部署" b$ F5 ~- A+ j: _- u* N/ w: ]
    7 t* d* B- Q* f4 W  A1 L
    5521305-e9cbe2a2b1d0327b.png # p7 e. F) u. V9 e; P$ Q
      y. |6 _3 Y3 I( G. h( N0 |
    Remix-IDE部署智能合约1 H9 a0 {. g) y8 Z0 @: ~2 f

    ' H4 T1 o) D/ a9 x' {0 g$ l; l! u/ K/ B4 X4 O5 C/ S/ S1 W
    5521305-1c0743601b91144b.png ' ?5 r( C  S' Y$ N- ~' x! y1 n# j

    * p2 f. |0 y7 H" i2 w: Q" y1 V: `6 a/ {Remix-IDE部署智能合约-确认+ m6 ~1 [( |# q1 x6 T% |

    ) a# c# }# s) P" H然后复制智能合约地址,App.js文件中会用到合约地址为:"0xb177d6cf6916f128c9931e610c63208d9c5a40f3"8 f+ n5 y. i& g% T% {6 H3 ^: W
    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"命令,结果如图:
    " A3 W1 [$ ?( z1 e4 k 5521305-4dba93598490e042.png ; D7 B8 |3 N6 t; E; @
    * O. K* C; y( y) _
    npm_start' }* v% X' w" T; J" a

    4 o7 D8 _7 s& `! Y2 S! M9 y会自动打开网页,然后上传一张本地图片,之后点击"图片哈希写入区块链"按钮" Y1 \0 K% l' K: }# G+ I; q; @8 v( h

    9 Y/ C  j" B, I! |/ h 5521305-c5e820e466316868.png ( @, X( }/ `! {' ], f, p- @
    " r8 e) [% G, B! B% p- e+ z& R1 l
    运行结果1. ]4 y$ q+ ^& R- Y
    & G2 P1 D9 _; c  \
    最终效果如图:
    + z, \# P; @* M0 ?$ R6 G) y
    ' y0 W- @/ P# y' Z! j& a7 Q% Q" b; C4 t  `0 f+ P$ @
    5521305-a13f100335acb2e5.png
    " G2 E- e* s4 T# o
    - G% r0 T9 M; K6 e8 c3 |8 n- d运行结果1 W" ~1 C* h+ {# ]' [3 w

    ( F' _9 j& A9 G访问IPFS网关:* ?; l) \8 \6 h0 |$ G
    https://ipfs.io/ipfs/QmbHptfJfyuGAZxstFYgAVfz33cytR1seTD3ZabBSDd8994 u# V4 ^; ~6 O% p/ C
    发现图片已经成功写入IPFS,如图:3 v) p( @1 p: w' Q% Q! B( ^/ [
    5 r+ ~- `/ }3 p/ u6 M
    # y: B1 I" _- _, @& M" ^+ k, `0 q$ j
    5521305-583743843cc663c0.png ( l4 M+ a- e* U3 X7 C$ s

    9 W1 a6 c# q# x' x0 z" r& D4 S运行结果3  z. p; [- L8 K% U# ?
    8 Q) `/ e% l- V9 @0 M* d
    备注:本地IPFS网关端口默认为8080,我的电脑上端口冲突了,系统自动修改为8082。0 Q8 ?  j! E& J4 ~9 k3 S# I
    搞定,收工。
    # a6 }3 U9 ]4 X* H; Z2 G& ^PS:刚入坑的小白,很多不懂,还请各位大佬多赐教,谢谢!, u3 ]1 {0 {) g+ C4 k
    & M% V* y. _9 I6 n- |
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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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