From 7e72b78875adf5d23b344db3851654f931529ce8 Mon Sep 17 00:00:00 2001 From: liyuechun Date: Tue, 21 Nov 2017 23:43:38 +0800 Subject: [PATCH] ipfs --- 2017/10/ipfs_first_post/index.html | 484 +++++++++++++++++++++++++++++ 404.html | 5 + README.md | 375 +++++++++++++++++++++- blog/index.html | 88 ++++++ blog/index.xml | 400 ++++++++++++++++++++++++ css/hyde.css | 285 +++++++++++++++++ css/poole.css | 403 ++++++++++++++++++++++++ css/syntax.css | 66 ++++ favicon.png | Bin 0 -> 183 bytes index.html | 480 ++++++++++++++++++++++++++++ index.xml | 400 ++++++++++++++++++++++++ qrcode_for_gh.jpg | Bin 0 -> 27797 bytes sitemap.xml | 22 ++ touch-icon-144-precomposed.png | Bin 0 -> 570 bytes 14 files changed, 3006 insertions(+), 2 deletions(-) create mode 100644 2017/10/ipfs_first_post/index.html create mode 100644 404.html create mode 100644 blog/index.html create mode 100644 blog/index.xml create mode 100755 css/hyde.css create mode 100755 css/poole.css create mode 100755 css/syntax.css create mode 100755 favicon.png create mode 100644 index.html create mode 100644 index.xml create mode 100644 qrcode_for_gh.jpg create mode 100644 sitemap.xml create mode 100755 touch-icon-144-precomposed.png diff --git a/2017/10/ipfs_first_post/index.html b/2017/10/ipfs_first_post/index.html new file mode 100644 index 0000000..64a65f6 --- /dev/null +++ b/2017/10/ipfs_first_post/index.html @@ -0,0 +1,484 @@ + + + + + + + + + + + + 【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建 · 区块链部落 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建

+ + + + +
+

孔壹学院:国内区块链职业教育引领品牌。

+ +

作者:黎跃春,孔壹学院创始人,区块链、高可用架构师

+ +

微信:liyc1215

+ +

区块链博客:http://liyuechun.org

+
+ +

在阅读这篇文章之前,你需要先学习【IPFS + 区块链 系列】 入门篇 - IPFS环境配置这篇文章。

+ +

目录

+ + + +

1. 如何在IPFS新增一个文件

+ +

1.1 新建file.txt文件

+ +

打开终端,切换到桌面,新建一个文件夹1121,切换到1121中,通过vi新建一个文件file.txt,文件里面输入春哥微信号liyc1215保存并且退出。

+ +
localhost:Desktop yuechunli$ pwd
+/Users/liyuechun/Desktop
+localhost:Desktop yuechunli$ mkdir 1121
+localhost:Desktop yuechunli$ cd 1121/
+localhost:1121 yuechunli$ vi file.txt
+localhost:1121 yuechunli$ cat file.txt
+liyc1215
+localhost:1121 yuechunli$
+
+ +

1.2 查看ipfs相关命令

+ +
localhost:1121 yuechunli$ ipfs help
+USAGE
+  ipfs - Global p2p merkle-dag filesystem.
+
+  ipfs [--config=<config> | -c] [--debug=<debug> | -D] [--help=<help>] [-h=<h>] [--local=<local> | -L] [--api=<api>] <command> ...
+
+SUBCOMMANDS
+  BASIC COMMANDS
+    init          Initialize ipfs local configuration
+    add <path>    Add a file to IPFS
+    cat <ref>     Show IPFS object data
+    get <ref>     Download IPFS objects
+    ls <ref>      List links from an object
+    refs <ref>    List hashes of links from an object
+
+  DATA STRUCTURE COMMANDS
+    block         Interact with raw blocks in the datastore
+    object        Interact with raw dag nodes
+    files         Interact with objects as if they were a unix filesystem
+    dag           Interact with IPLD documents (experimental)
+
+  ADVANCED COMMANDS
+    daemon        Start a long-running daemon process
+    mount         Mount an IPFS read-only mountpoint
+    resolve       Resolve any type of name
+    name          Publish and resolve IPNS names
+    key           Create and list IPNS name keypairs
+    dns           Resolve DNS links
+    pin           Pin objects to local storage
+    repo          Manipulate the IPFS repository
+    stats         Various operational stats
+    p2p           Libp2p stream mounting
+    filestore     Manage the filestore (experimental)
+
+  NETWORK COMMANDS
+    id            Show info about IPFS peers
+    bootstrap     Add or remove bootstrap peers
+    swarm         Manage connections to the p2p network
+    dht           Query the DHT for values or peers
+    ping          Measure the latency of a connection
+    diag          Print diagnostics
+
+  TOOL COMMANDS
+    config        Manage configuration
+    version       Show ipfs version information
+    update        Download and apply go-ipfs updates
+    commands      List all available commands
+
+ +

1.3 将file.txt添加到ipfs节点

+ +
localhost:1121 yuechunli$ ls
+file.txt
+localhost:1121 yuechunli$ ipfs add file.txt
+added QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T file.txt
+localhost:1121 yuechunli$ cat file.txt
+liyc1215
+localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T
+liyc1215
+localhost:1121 yuechunli$
+
+ +

当执行完ipfs add file.txt这个命令以后,会将file.txt添加到ipfs当前的节点中,并且会对file.txt文件生成一个唯一的hashQmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T,如果想查看本地ipfs节点的数据,可以通过ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T进行查看。

+ +

⚠️:当我试图通过http://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T进行数据访问时,无法访问,如下图所示:

+ +

+ +

⚠️:虽然数据已经添加到当前的你自己的IPFS节点中,但是并没有同步到IPFS网络,所以暂时在网络上无法访问。

+ +

⚠️:重要:接下来执行下面的命令同步节点数据到IPFS网络,再试图在网络上查看数据。

+ +
    +
  • 同步节点
  • +
+ +

新建一个终端,执行ipfs daemon

+ +
localhost:.ipfs yuechunli$ ipfs daemon
+Initializing daemon...
+Adjusting current ulimit to 2048...
+Successfully raised file descriptor limit to 2048.
+Swarm listening on /ip4/111.196.246.151/tcp/3637
+Swarm listening on /ip4/127.0.0.1/tcp/4001
+Swarm listening on /ip4/169.254.170.167/tcp/4001
+Swarm listening on /ip4/192.168.0.107/tcp/4001
+Swarm listening on /ip6/::1/tcp/4001
+API server listening on /ip4/127.0.0.1/tcp/5001
+Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
+Daemon is ready
+
+ +
    +
  • IPFS网络查看数据
  • +
+ +

浏览器访问https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T

+ +

黎跃春 微信

+ +

2. 通过ipfs创建目录存储文件

+ +

在着上面的步骤走,我们可以通过ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215查看添加到ipfs网络的file.txt文件的内容,如下:

+ +
localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T
+liyc1215
+localhost:1121 yuechunli$
+
+ +

当然,我们也可以通过ipfs的相关命令在ipfs的根目录下面创建文件夹,并且将file.txt文件移动或者拷贝到我们创建的文件夹中。

+ +

⚠️:cp不会改变文件hash,mv会改变hash寻址。

+ +
localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T
+liyc1215
+localhost:1121 yuechunli$ ipfs files mkdir /LiYueChun
+localhost:1121 yuechunli$ ipfs files cp /ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T /LiYueChun/file.txt
+localhost:1121 yuechunli$ ipfs files ls /
+LiYueChun
+localhost:1121 yuechunli$ ipfs files ls /LiYueChun/
+file.txt
+localhost:1121 yuechunli$ ipfs files read /LiYueChun/file.txt
+liyc1215
+localhost:1121 yuechunli$
+
+ +

3. 如何在IPFS新增一个目录

+ +

3.1 使用ipfs add -r可以上传一整个目录

+ +
localhost:1121 yuechunli$ ipfs add -r ipfs-tutorial/
+added QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc ipfs-tutorial/contactme.txt
+added QmfKdWsguobA3aDPvSxLB3Bq4HMKyqKSgFr2NFUuVH8n31 ipfs-tutorial/eth-fabric.png
+added QmXe8jTxTh5MZP6BK5cnj19mXNTKVMzNyUJZUHuYyr5dk1 ipfs-tutorial/gongzhonghao.png
+added QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek ipfs-tutorial
+
+ +

3.2 通过路径访问contactme.txt文件数据

+ +

如果我们上传的是目录,那么可以通过下面几种方式访问到contactme.txt文件的数据。

+ +
localhost:1121 yuechunli$ ipfs cat QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc
+微信:liyc1215
+区块链技术交流群:348924182
+公众号:区块链部落
+localhost:1121 yuechunli$ ipfs cat /ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc
+微信:liyc1215
+区块链技术交流群:348924182
+公众号:区块链部落
+localhost:1121 yuechunli$ ipfs cat /ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt
+微信:liyc1215
+区块链技术交流群:348924182
+公众号:区块链部落
+localhost:1121 yuechunli$
+
+ +

3.3 通过Hash查看数据IPFS网络数据

+ + + +

+ + + +

+ +

4. 创建简易的网页发布到IPFS

+ +

在这里我先自己写一个简单的网页给大家演示,先在桌面新建一个site文件夹,然后按照下面的步骤在site文件夹中建立index.htmlstyle.css文件。

+ +

4.1 创建一个index.html文件

+ +
<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>Hello IPFS!</title>
+  <link rel="stylesheet" href="./style.css" />
+</head>
+<body>
+  <h1>Hello IPFS!</h1>
+</body>
+</html>
+
+ +

4.2 创建一个style.css文件

+ +
h1 {
+  color: green;
+}
+
+ +

4.3 添加到ipfs

+ +
localhost:Desktop yuechunli$ ipfs add -r site/
+added QmWG5rbgT9H77TGq49RXNoqN8M7DNKMnMX425nkmCB6BjS site/index.html
+added QmfGLJ3mryLvicQqzdsghq4QRhptKJtBAPe7yDJxsBGSuy site/style.css
+added QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp site
+
+ +

最后一行是项目根目录的hash,你先通过ipfs daemon同步网络,然后可以通过https://ipfs.io/ipfs/<你的项目根目录hash>,即https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp访问项目。

+ +

4.4 网络同步

+ +
localhost:Desktop yuechunli$ ipfs daemon
+
+ +

4.5 访问网站

+ +

浏览器打开https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp,效果图如下:

+ +

+ +

4.6 发布到IPNS

+ +

当我们修改网站内容重新添加到ipfs时,hash会发生变化,当我们网站更新时,我们可以将网站发布到IPNS,在IPNS中,允许我们节点的域名空间中引用一个IPFS hash,也就是说我们可以通过节点ID对项目根目录的IPFS HASH进行绑定,以后我们访问网站时直接通过节点·ID访问即可,当我们更新博客时,重新发布到IPNS`即可。

+ +
localhost:~ yuechunli$ ipfs name publish QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp
+Published to QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP: /ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp
+localhost:~ yuechunli$ ipfs id
+{
+	"ID": "QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP"
+}
+
+ +

当我们执行ipfs name publish命令时,会返回我们的节点ID,你可以通过ipfs id进行查看验证是否是你的节点ID

+ +

⚠️:验证

+ +
$ ipfs name resolve <peerId>
+
+ +
localhost:~ yuechunli$ ipfs name resolve QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP
+/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp
+localhost:~ yuechunli$
+
+ +

⚠️:当然我们现在就可以通过IPNS进行访问了。

+ +
https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP
+
+ +

⚠️⚠️⚠️:注意上面是ipns而不是ipfs。

+ +

+ +

⚠️:如果你网站数据修改,需要重新发布到IPNS。

+ +

5. 发布个人博客

+ +

你可以通过Hugo按照官方文档创建一个漂亮的静态博客Hugo官方网站,当然你也可以自己编写,或者使用其他开源项目搭建。

+ +

5.1 搭建静态博客

+ +

大家可以自己搭建,也可以直接下载我的博客源码直接搭建。

+ +

源码地址:http://github.com/liyuechun/ipfs_blogger

+ +

5.2 节点ID替换

+ +
    +
  • 查看你的节点ID
  • +
+ +
localhost:ipfs_pin yuechunli$ ipfs id
+{
+	"ID": "《your peer id》"
+}
+localhost:ipfs_pin yuechunli$
+
+ +

在上面的源码中全局搜索将源码里面的QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP替换成你自己的ID

+ +

接下来重复4. 创建简易的网页发布到IPFS的操作步骤即可。

+ +

5.3 浏览博客

+ +

浏览器打开https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/查看项目效果。

+ +

IPFS 博客项目效果图

+ +

6. 下篇预报

+ +

6.1 ipfs + ethereumDapp开发入门

+ +

7. 技术交流

+ +
    +
  • 区块链技术交流QQ群:348924182
  • +
  • 进微信群请加微信:liyc1215
  • +
  • 「区块链部落」官方公众号
  • +
+ +

+ + + + + +
+ + +
+
+ +w + diff --git a/404.html b/404.html new file mode 100644 index 0000000..681e7ec --- /dev/null +++ b/404.html @@ -0,0 +1,5 @@ + + + Nope. + + \ No newline at end of file diff --git a/README.md b/README.md index 49a5dcf..f9d50b8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,373 @@ -# ipfs_blogger -【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建 +# 【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建 + +> 孔壹学院:国内区块链职业教育引领品牌。 +> +> 作者:黎跃春,孔壹学院创始人,区块链、高可用架构师 +> +> 微信:liyc1215 +> +> 区块链博客:http://liyuechun.org + +在阅读这篇文章之前,你需要先学习[【IPFS + 区块链 系列】 入门篇 - IPFS环境配置](http://liyuechun.org/2017/11/20/ipfs-blockchain/)这篇文章。 + +## 目录 + + +- [1. 如何在IPFS新增一个文件](#1-如何在IPFS新增一个文件) + - [1.1 新建file.txt文件](#11-新建file.txt文件) + - [1.2 查看ipfs相关命令](#12-查看ipfs相关命令) + - [1.3 将file.txt添加到ipfs节点](#13-将file.txt添加到ipfs节点) +- [2. 通过ipfs创建目录存储文件](#2-通过ipfs创建目录存储文件) +- [3. 如何在IPFS新增一个目录](#3-如何在IPFS新增一个目录) + - [3.1 使用ipfs add -r可以上传一整个目录](#31-使用ipfs add -r可以上传一整个目录) + - [3.2 通过路径访问contactme.txt文件数据](#32-通过路径访问contactme.txt文件数据) + - [3.3 通过Hash查看数据IPFS网络数据](#33-通过Hash查看数据IPFS网络数据) +- [4. 创建简易的网页发布到IPFS](#4-创建简易的网页发布到IPFS) + - [4.1 创建一个index.html文件](#41-创建一个index.html文件) + - [4.2 创建一个style.css文件](#42-创建一个style.css文件) + - [4.3 添加到ipfs](#43-添加到ipfs) + - [4.4 网络同步](#44-网络同步) + - [4.5 访问网站](#45-访问网站) + - [4.6 发布到IPNS](#46-发布到IPNS) +- [5. 发布个人博客](#5-发布个人博客) + - [5.1 搭建静态博客](#51-搭建静态博客) + - [5.2 节点ID替换](#52-节点ID替换) + - [5.3 浏览博客](#53-浏览博客) +- [6. 下篇预报](#6-下篇预报) + - [6.1 `ipfs + ethereum``Dapp`开发入门](#61-`ipfs + ethereum``Dapp`开发入门) + + +## 1. 如何在IPFS新增一个文件 + +### 1.1 新建file.txt文件 + +打开终端,切换到桌面,新建一个文件夹`1121`,切换到`1121`中,通过`vi`新建一个文件`file.txt`,文件里面输入春哥微信号`liyc1215`保存并且退出。 + +``` +localhost:Desktop yuechunli$ pwd +/Users/liyuechun/Desktop +localhost:Desktop yuechunli$ mkdir 1121 +localhost:Desktop yuechunli$ cd 1121/ +localhost:1121 yuechunli$ vi file.txt +localhost:1121 yuechunli$ cat file.txt +liyc1215 +localhost:1121 yuechunli$ +``` + +### 1.2 查看ipfs相关命令 + +``` +localhost:1121 yuechunli$ ipfs help +USAGE + ipfs - Global p2p merkle-dag filesystem. + + ipfs [--config= | -c] [--debug= | -D] [--help=] [-h=] [--local= | -L] [--api=] ... + +SUBCOMMANDS + BASIC COMMANDS + init Initialize ipfs local configuration + add Add a file to IPFS + cat Show IPFS object data + get Download IPFS objects + ls List links from an object + refs List hashes of links from an object + + DATA STRUCTURE COMMANDS + block Interact with raw blocks in the datastore + object Interact with raw dag nodes + files Interact with objects as if they were a unix filesystem + dag Interact with IPLD documents (experimental) + + ADVANCED COMMANDS + daemon Start a long-running daemon process + mount Mount an IPFS read-only mountpoint + resolve Resolve any type of name + name Publish and resolve IPNS names + key Create and list IPNS name keypairs + dns Resolve DNS links + pin Pin objects to local storage + repo Manipulate the IPFS repository + stats Various operational stats + p2p Libp2p stream mounting + filestore Manage the filestore (experimental) + + NETWORK COMMANDS + id Show info about IPFS peers + bootstrap Add or remove bootstrap peers + swarm Manage connections to the p2p network + dht Query the DHT for values or peers + ping Measure the latency of a connection + diag Print diagnostics + + TOOL COMMANDS + config Manage configuration + version Show ipfs version information + update Download and apply go-ipfs updates + commands List all available commands +``` + +### 1.3 将file.txt添加到ipfs节点 + +``` +localhost:1121 yuechunli$ ls +file.txt +localhost:1121 yuechunli$ ipfs add file.txt +added QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T file.txt +localhost:1121 yuechunli$ cat file.txt +liyc1215 +localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ +``` + +当执行完`ipfs add file.txt`这个命令以后,会将`file.txt`添加到`ipfs`当前的节点中,并且会对`file.txt`文件生成一个唯一的`hash``QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T`,如果想查看本地`ipfs`节点的数据,可以通过`ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T`进行查看。 + +**⚠️:**当我试图通过`http://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T`进行数据访问时,无法访问,如下图所示: + +![](http://om1c35wrq.bkt.clouddn.com/fangwen.gif) + +**⚠️:**虽然数据已经添加到当前的你自己的`IPFS`节点中,但是并没有同步到`IPFS`网络,所以暂时在网络上无法访问。 + +**⚠️:重要:接下来执行下面的命令同步节点数据到`IPFS`网络,再试图在网络上查看数据。** + +- 同步节点 + +新建一个终端,执行`ipfs daemon`。 + +``` +localhost:.ipfs yuechunli$ ipfs daemon +Initializing daemon... +Adjusting current ulimit to 2048... +Successfully raised file descriptor limit to 2048. +Swarm listening on /ip4/111.196.246.151/tcp/3637 +Swarm listening on /ip4/127.0.0.1/tcp/4001 +Swarm listening on /ip4/169.254.170.167/tcp/4001 +Swarm listening on /ip4/192.168.0.107/tcp/4001 +Swarm listening on /ip6/::1/tcp/4001 +API server listening on /ip4/127.0.0.1/tcp/5001 +Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 +Daemon is ready +``` + +- 从`IPFS`网络查看数据 + +浏览器访问[https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T](https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T) + +![黎跃春 微信](http://om1c35wrq.bkt.clouddn.com/WX20171121-105531@2x.png) + + +## 2. 通过ipfs创建目录存储文件 + +在着上面的步骤走,我们可以通过`ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215`查看添加到`ipfs`网络的`file.txt`文件的内容,如下: + +``` +localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ +``` + +当然,我们也可以通过`ipfs`的相关命令在`ipfs`的根目录下面创建文件夹,并且将`file.txt`文件**移动**或者**拷贝**到我们创建的文件夹中。 + +**⚠️:cp不会改变文件hash,mv会改变hash寻址。** + +``` +localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ ipfs files mkdir /LiYueChun +localhost:1121 yuechunli$ ipfs files cp /ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T /LiYueChun/file.txt +localhost:1121 yuechunli$ ipfs files ls / +LiYueChun +localhost:1121 yuechunli$ ipfs files ls /LiYueChun/ +file.txt +localhost:1121 yuechunli$ ipfs files read /LiYueChun/file.txt +liyc1215 +localhost:1121 yuechunli$ +``` + + + +## 3. 如何在IPFS新增一个目录 + +### 3.1 使用ipfs add -r可以上传一整个目录 + +``` +localhost:1121 yuechunli$ ipfs add -r ipfs-tutorial/ +added QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc ipfs-tutorial/contactme.txt +added QmfKdWsguobA3aDPvSxLB3Bq4HMKyqKSgFr2NFUuVH8n31 ipfs-tutorial/eth-fabric.png +added QmXe8jTxTh5MZP6BK5cnj19mXNTKVMzNyUJZUHuYyr5dk1 ipfs-tutorial/gongzhonghao.png +added QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek ipfs-tutorial +``` + +#### 3.2 通过路径访问contactme.txt文件数据 + +如果我们上传的是目录,那么可以通过下面几种方式访问到`contactme.txt`文件的数据。 + +``` +localhost:1121 yuechunli$ ipfs cat QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ ipfs cat /ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ ipfs cat /ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ +``` + +### 3.3 通过Hash查看数据IPFS网络数据 + +- **访问目录:**[https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek](https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek) + +![](http://om1c35wrq.bkt.clouddn.com/WX20171121-110959@2x.png) + +- **通过目录访问文件:**[https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt](https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt) +![](http://om1c35wrq.bkt.clouddn.com/WX20171121-111019@2x.png) + +- **通过文件hash直接访问:**[https://ipfs.io/ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc](https://ipfs.io/ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc) + +![](http://om1c35wrq.bkt.clouddn.com/WX20171121-113047@2x.png) + + +## 4. 创建简易的网页发布到IPFS + + +在这里我先自己写一个简单的网页给大家演示,先在桌面新建一个`site`文件夹,然后按照下面的步骤在`site`文件夹中建立`index.html`和`style.css`文件。 + +### 4.1 创建一个index.html文件 + +``` + + + + + Hello IPFS! + + + +

Hello IPFS!

+ + +``` + +### 4.2 创建一个style.css文件 + +``` +h1 { + color: green; +} +``` + +### 4.3 添加到ipfs + +``` +localhost:Desktop yuechunli$ ipfs add -r site/ +added QmWG5rbgT9H77TGq49RXNoqN8M7DNKMnMX425nkmCB6BjS site/index.html +added QmfGLJ3mryLvicQqzdsghq4QRhptKJtBAPe7yDJxsBGSuy site/style.css +added QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp site +``` + +最后一行是项目根目录的`hash`,你先通过`ipfs daemon`同步网络,然后可以通过`https://ipfs.io/ipfs/<你的项目根目录hash>`,即`https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp`访问项目。 + +### 4.4 网络同步 + +``` +localhost:Desktop yuechunli$ ipfs daemon +``` + +### 4.5 访问网站 + +浏览器打开[https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp](https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp),效果图如下: + +![](http://om1c35wrq.bkt.clouddn.com/WX20171121-210721@2x.png) + +### 4.6 发布到IPNS + +当我们修改网站内容重新添加到`ipfs`时,`hash`会发生变化,当我们网站更新时,我们可以将网站发布到IPNS,在IPNS中,允许我们节点的域名空间中引用一个`IPFS hash`,也就是说我们可以通过节点`ID`对项目根目录的`IPFS HASH`进行绑定,以后我们访问网站时直接通过节点·ID`访问即可,当我们更新博客时,重新发布到`IPNS`即可。 + +``` +localhost:~ yuechunli$ ipfs name publish QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +Published to QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP: /ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +localhost:~ yuechunli$ ipfs id +{ + "ID": "QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP" +} +``` + +当我们执行`ipfs name publish`命令时,会返回我们的节点`ID`,你可以通过`ipfs id`进行查看验证是否是你的节点`ID`。 + +**⚠️:验证** + +``` +$ ipfs name resolve +``` + +``` +localhost:~ yuechunli$ ipfs name resolve QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP +/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +localhost:~ yuechunli$ +``` + +**⚠️:**当然我们现在就可以通过`IPNS`进行访问了。 + +``` +https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP +``` + +**⚠️⚠️⚠️:注意上面是ipns而不是ipfs。** + +![](http://om1c35wrq.bkt.clouddn.com/WX20171121-212123@2x.png) + + +**⚠️:如果你网站数据修改,需要重新发布到IPNS。** + +## 5. 发布个人博客 + +你可以通过`Hugo`按照官方文档创建一个漂亮的静态博客[Hugo官方网站](http://gohugo.io/getting-started/quick-start/),当然你也可以自己编写,或者使用其他开源项目搭建。 + +### 5.1 搭建静态博客 + +大家可以自己搭建,也可以直接下载我的博客源码直接搭建。 + +源码地址:[http://github.com/liyuechun/ipfs_blogger](http://github.com/liyuechun/ipfs_blogger) + + +### 5.2 节点ID替换 + +- 查看你的节点ID + +``` +localhost:ipfs_pin yuechunli$ ipfs id +{ + "ID": "《your peer id》" +} +localhost:ipfs_pin yuechunli$ +``` + +在上面的源码中全局搜索将源码里面的`QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP`替换成你自己的`ID`。 + +接下来重复[4. 创建简易的网页发布到IPFS](#4-创建简易的网页发布到IPFS)的操作步骤即可。 + +### 5.3 浏览博客 + +浏览器打开[https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/](https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/)查看项目效果。 + +![IPFS 博客项目效果图](http://om1c35wrq.bkt.clouddn.com/WX20171121-215636@2x.png) + +## 6. 下篇预报 + +### 6.1 `ipfs + ethereum``Dapp`开发入门 + +## 7. 技术交流 + +- 区块链技术交流QQ群:`348924182` +- 进微信群请加微信:`liyc1215` +- 「区块链部落」官方公众号 + +![](http://om1c35wrq.bkt.clouddn.com/%E5%8C%BA%E5%9D%97%E9%93%BE%E9%83%A8%E8%90%BD.png) + + diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..769feb8 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + Blogs · 区块链部落 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blog/index.xml b/blog/index.xml new file mode 100644 index 0000000..9c18b2b --- /dev/null +++ b/blog/index.xml @@ -0,0 +1,400 @@ + + + + 区块链部落 + Hugo + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/blog/ + en-us + 黎跃春 + 2017 liyuechun + Mon, 30 Oct 2017 20:01:00 UTC + + + + 【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建 + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/2017/10/ipfs_first_post/ + Mon, 30 Oct 2017 20:01:00 UTC + 黎跃春 + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/2017/10/ipfs_first_post/ + + +<blockquote> +<p>孔壹学院:国内区块链职业教育引领品牌。</p> + +<p>作者:黎跃春,孔壹学院创始人,区块链、高可用架构师</p> + +<p>微信:liyc1215</p> + +<p>区块链博客:<a href="http://liyuechun.org">http://liyuechun.org</a></p> +</blockquote> + +<p>在阅读这篇文章之前,你需要先学习<a href="http://liyuechun.org/2017/11/20/ipfs-blockchain/">【IPFS + 区块链 系列】 入门篇 - IPFS环境配置</a>这篇文章。</p> + +<h2 id="目录">目录</h2> + +<ul> +<li><a href="#1-如何在IPFS新增一个文件">1. 如何在IPFS新增一个文件</a> + +<ul> +<li><a href="#11-新建file.txt文件">1.1 新建file.txt文件</a></li> +<li><a href="#12-查看ipfs相关命令">1.2 查看ipfs相关命令</a></li> +<li><a href="#13-将file.txt添加到ipfs节点">1.3 将file.txt添加到ipfs节点</a></li> +</ul></li> +<li><a href="#2-通过ipfs创建目录存储文件">2. 通过ipfs创建目录存储文件</a></li> +<li><a href="#3-如何在IPFS新增一个目录">3. 如何在IPFS新增一个目录</a> + +<ul> +<li><a href="#31-使用ipfs add -r可以上传一整个目录">3.1 使用ipfs add -r可以上传一整个目录</a></li> +<li><a href="#32-通过路径访问contactme.txt文件数据">3.2 通过路径访问contactme.txt文件数据</a></li> +<li><a href="#33-通过Hash查看数据IPFS网络数据">3.3 通过Hash查看数据IPFS网络数据</a></li> +</ul></li> +<li><a href="#4-创建简易的网页发布到IPFS">4. 创建简易的网页发布到IPFS</a> + +<ul> +<li><a href="#41-创建一个index.html文件">4.1 创建一个index.html文件</a></li> +<li><a href="#42-创建一个style.css文件">4.2 创建一个style.css文件</a></li> +<li><a href="#43-添加到ipfs">4.3 添加到ipfs</a></li> +<li><a href="#44-网络同步">4.4 网络同步</a></li> +<li><a href="#45-访问网站">4.5 访问网站</a></li> +<li><a href="#46-发布到IPNS">4.6 发布到IPNS</a></li> +</ul></li> +<li><a href="#5-发布个人博客">5. 发布个人博客</a> + +<ul> +<li><a href="#51-搭建静态博客">5.1 搭建静态博客</a></li> +<li><a href="#52-节点ID替换">5.2 节点ID替换</a></li> +<li><a href="#53-浏览博客">5.3 浏览博客</a></li> +</ul></li> +<li><a href="#6-下篇预报">6. 下篇预报</a> + +<ul> +<li><a href="#61-`ipfs + ethereum``Dapp`开发入门">6.1 <code>ipfs + ethereum</code><code>Dapp</code>开发入门</a></li> +</ul></li> +</ul> + +<h2 id="1-如何在ipfs新增一个文件">1. 如何在IPFS新增一个文件</h2> + +<h3 id="1-1-新建file-txt文件">1.1 新建file.txt文件</h3> + +<p>打开终端,切换到桌面,新建一个文件夹<code>1121</code>,切换到<code>1121</code>中,通过<code>vi</code>新建一个文件<code>file.txt</code>,文件里面输入春哥微信号<code>liyc1215</code>保存并且退出。</p> + +<pre><code>localhost:Desktop yuechunli$ pwd +/Users/liyuechun/Desktop +localhost:Desktop yuechunli$ mkdir 1121 +localhost:Desktop yuechunli$ cd 1121/ +localhost:1121 yuechunli$ vi file.txt +localhost:1121 yuechunli$ cat file.txt +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<h3 id="1-2-查看ipfs相关命令">1.2 查看ipfs相关命令</h3> + +<pre><code>localhost:1121 yuechunli$ ipfs help +USAGE + ipfs - Global p2p merkle-dag filesystem. + + ipfs [--config=&lt;config&gt; | -c] [--debug=&lt;debug&gt; | -D] [--help=&lt;help&gt;] [-h=&lt;h&gt;] [--local=&lt;local&gt; | -L] [--api=&lt;api&gt;] &lt;command&gt; ... + +SUBCOMMANDS + BASIC COMMANDS + init Initialize ipfs local configuration + add &lt;path&gt; Add a file to IPFS + cat &lt;ref&gt; Show IPFS object data + get &lt;ref&gt; Download IPFS objects + ls &lt;ref&gt; List links from an object + refs &lt;ref&gt; List hashes of links from an object + + DATA STRUCTURE COMMANDS + block Interact with raw blocks in the datastore + object Interact with raw dag nodes + files Interact with objects as if they were a unix filesystem + dag Interact with IPLD documents (experimental) + + ADVANCED COMMANDS + daemon Start a long-running daemon process + mount Mount an IPFS read-only mountpoint + resolve Resolve any type of name + name Publish and resolve IPNS names + key Create and list IPNS name keypairs + dns Resolve DNS links + pin Pin objects to local storage + repo Manipulate the IPFS repository + stats Various operational stats + p2p Libp2p stream mounting + filestore Manage the filestore (experimental) + + NETWORK COMMANDS + id Show info about IPFS peers + bootstrap Add or remove bootstrap peers + swarm Manage connections to the p2p network + dht Query the DHT for values or peers + ping Measure the latency of a connection + diag Print diagnostics + + TOOL COMMANDS + config Manage configuration + version Show ipfs version information + update Download and apply go-ipfs updates + commands List all available commands +</code></pre> + +<h3 id="1-3-将file-txt添加到ipfs节点">1.3 将file.txt添加到ipfs节点</h3> + +<pre><code>localhost:1121 yuechunli$ ls +file.txt +localhost:1121 yuechunli$ ipfs add file.txt +added QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T file.txt +localhost:1121 yuechunli$ cat file.txt +liyc1215 +localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<p>当执行完<code>ipfs add file.txt</code>这个命令以后,会将<code>file.txt</code>添加到<code>ipfs</code>当前的节点中,并且会对<code>file.txt</code>文件生成一个唯一的<code>hash</code><code>QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</code>,如果想查看本地<code>ipfs</code>节点的数据,可以通过<code>ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</code>进行查看。</p> + +<p><strong>⚠️:</strong>当我试图通过<code>http://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</code>进行数据访问时,无法访问,如下图所示:</p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/fangwen.gif" alt="" /></p> + +<p><strong>⚠️:</strong>虽然数据已经添加到当前的你自己的<code>IPFS</code>节点中,但是并没有同步到<code>IPFS</code>网络,所以暂时在网络上无法访问。</p> + +<p><strong>⚠️:重要:接下来执行下面的命令同步节点数据到<code>IPFS</code>网络,再试图在网络上查看数据。</strong></p> + +<ul> +<li>同步节点</li> +</ul> + +<p>新建一个终端,执行<code>ipfs daemon</code>。</p> + +<pre><code>localhost:.ipfs yuechunli$ ipfs daemon +Initializing daemon... +Adjusting current ulimit to 2048... +Successfully raised file descriptor limit to 2048. +Swarm listening on /ip4/111.196.246.151/tcp/3637 +Swarm listening on /ip4/127.0.0.1/tcp/4001 +Swarm listening on /ip4/169.254.170.167/tcp/4001 +Swarm listening on /ip4/192.168.0.107/tcp/4001 +Swarm listening on /ip6/::1/tcp/4001 +API server listening on /ip4/127.0.0.1/tcp/5001 +Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 +Daemon is ready +</code></pre> + +<ul> +<li>从<code>IPFS</code>网络查看数据</li> +</ul> + +<p>浏览器访问<a href="https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T">https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</a></p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-105531@2x.png" alt="黎跃春 微信" /></p> + +<h2 id="2-通过ipfs创建目录存储文件">2. 通过ipfs创建目录存储文件</h2> + +<p>在着上面的步骤走,我们可以通过<code>ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215</code>查看添加到<code>ipfs</code>网络的<code>file.txt</code>文件的内容,如下:</p> + +<pre><code>localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<p>当然,我们也可以通过<code>ipfs</code>的相关命令在<code>ipfs</code>的根目录下面创建文件夹,并且将<code>file.txt</code>文件<strong>移动</strong>或者<strong>拷贝</strong>到我们创建的文件夹中。</p> + +<p><strong>⚠️:cp不会改变文件hash,mv会改变hash寻址。</strong></p> + +<pre><code>localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ ipfs files mkdir /LiYueChun +localhost:1121 yuechunli$ ipfs files cp /ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T /LiYueChun/file.txt +localhost:1121 yuechunli$ ipfs files ls / +LiYueChun +localhost:1121 yuechunli$ ipfs files ls /LiYueChun/ +file.txt +localhost:1121 yuechunli$ ipfs files read /LiYueChun/file.txt +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<h2 id="3-如何在ipfs新增一个目录">3. 如何在IPFS新增一个目录</h2> + +<h3 id="3-1-使用ipfs-add-r可以上传一整个目录">3.1 使用ipfs add -r可以上传一整个目录</h3> + +<pre><code>localhost:1121 yuechunli$ ipfs add -r ipfs-tutorial/ +added QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc ipfs-tutorial/contactme.txt +added QmfKdWsguobA3aDPvSxLB3Bq4HMKyqKSgFr2NFUuVH8n31 ipfs-tutorial/eth-fabric.png +added QmXe8jTxTh5MZP6BK5cnj19mXNTKVMzNyUJZUHuYyr5dk1 ipfs-tutorial/gongzhonghao.png +added QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek ipfs-tutorial +</code></pre> + +<h4 id="3-2-通过路径访问contactme-txt文件数据">3.2 通过路径访问contactme.txt文件数据</h4> + +<p>如果我们上传的是目录,那么可以通过下面几种方式访问到<code>contactme.txt</code>文件的数据。</p> + +<pre><code>localhost:1121 yuechunli$ ipfs cat QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ ipfs cat /ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ ipfs cat /ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ +</code></pre> + +<h3 id="3-3-通过hash查看数据ipfs网络数据">3.3 通过Hash查看数据IPFS网络数据</h3> + +<ul> +<li><strong>访问目录:</strong><a href="https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek">https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek</a></li> +</ul> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-110959@2x.png" alt="" /></p> + +<ul> +<li><p><strong>通过目录访问文件:</strong><a href="https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt">https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt</a> +<img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-111019@2x.png" alt="" /></p></li> + +<li><p><strong>通过文件hash直接访问:</strong><a href="https://ipfs.io/ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc">https://ipfs.io/ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc</a></p></li> +</ul> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-113047@2x.png" alt="" /></p> + +<h2 id="4-创建简易的网页发布到ipfs">4. 创建简易的网页发布到IPFS</h2> + +<p>在这里我先自己写一个简单的网页给大家演示,先在桌面新建一个<code>site</code>文件夹,然后按照下面的步骤在<code>site</code>文件夹中建立<code>index.html</code>和<code>style.css</code>文件。</p> + +<h3 id="4-1-创建一个index-html文件">4.1 创建一个index.html文件</h3> + +<pre><code>&lt;!DOCTYPE html&gt; +&lt;html lang=&quot;en&quot;&gt; +&lt;head&gt; + &lt;meta charset=&quot;UTF-8&quot;&gt; + &lt;title&gt;Hello IPFS!&lt;/title&gt; + &lt;link rel=&quot;stylesheet&quot; href=&quot;./style.css&quot; /&gt; +&lt;/head&gt; +&lt;body&gt; + &lt;h1&gt;Hello IPFS!&lt;/h1&gt; +&lt;/body&gt; +&lt;/html&gt; +</code></pre> + +<h3 id="4-2-创建一个style-css文件">4.2 创建一个style.css文件</h3> + +<pre><code>h1 { + color: green; +} +</code></pre> + +<h3 id="4-3-添加到ipfs">4.3 添加到ipfs</h3> + +<pre><code>localhost:Desktop yuechunli$ ipfs add -r site/ +added QmWG5rbgT9H77TGq49RXNoqN8M7DNKMnMX425nkmCB6BjS site/index.html +added QmfGLJ3mryLvicQqzdsghq4QRhptKJtBAPe7yDJxsBGSuy site/style.css +added QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp site +</code></pre> + +<p>最后一行是项目根目录的<code>hash</code>,你先通过<code>ipfs daemon</code>同步网络,然后可以通过<code>https://ipfs.io/ipfs/&lt;你的项目根目录hash&gt;</code>,即<code>https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp</code>访问项目。</p> + +<h3 id="4-4-网络同步">4.4 网络同步</h3> + +<pre><code>localhost:Desktop yuechunli$ ipfs daemon +</code></pre> + +<h3 id="4-5-访问网站">4.5 访问网站</h3> + +<p>浏览器打开<a href="https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp">https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp</a>,效果图如下:</p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-210721@2x.png" alt="" /></p> + +<h3 id="4-6-发布到ipns">4.6 发布到IPNS</h3> + +<p>当我们修改网站内容重新添加到<code>ipfs</code>时,<code>hash</code>会发生变化,当我们网站更新时,我们可以将网站发布到IPNS,在IPNS中,允许我们节点的域名空间中引用一个<code>IPFS hash</code>,也就是说我们可以通过节点<code>ID</code>对项目根目录的<code>IPFS HASH</code>进行绑定,以后我们访问网站时直接通过节点·ID<code>访问即可,当我们更新博客时,重新发布到</code>IPNS`即可。</p> + +<pre><code>localhost:~ yuechunli$ ipfs name publish QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +Published to QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP: /ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +localhost:~ yuechunli$ ipfs id +{ + &quot;ID&quot;: &quot;QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP&quot; +} +</code></pre> + +<p>当我们执行<code>ipfs name publish</code>命令时,会返回我们的节点<code>ID</code>,你可以通过<code>ipfs id</code>进行查看验证是否是你的节点<code>ID</code>。</p> + +<p><strong>⚠️:验证</strong></p> + +<pre><code>$ ipfs name resolve &lt;peerId&gt; +</code></pre> + +<pre><code>localhost:~ yuechunli$ ipfs name resolve QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP +/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +localhost:~ yuechunli$ +</code></pre> + +<p><strong>⚠️:</strong>当然我们现在就可以通过<code>IPNS</code>进行访问了。</p> + +<pre><code>https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP +</code></pre> + +<p><strong>⚠️⚠️⚠️:注意上面是ipns而不是ipfs。</strong></p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-212123@2x.png" alt="" /></p> + +<p><strong>⚠️:如果你网站数据修改,需要重新发布到IPNS。</strong></p> + +<h2 id="5-发布个人博客">5. 发布个人博客</h2> + +<p>你可以通过<code>Hugo</code>按照官方文档创建一个漂亮的静态博客<a href="http://gohugo.io/getting-started/quick-start/">Hugo官方网站</a>,当然你也可以自己编写,或者使用其他开源项目搭建。</p> + +<h3 id="5-1-搭建静态博客">5.1 搭建静态博客</h3> + +<p>大家可以自己搭建,也可以直接下载我的博客源码直接搭建。</p> + +<p>源码地址:<a href="http://github.com/liyuechun/ipfs_blogger">http://github.com/liyuechun/ipfs_blogger</a></p> + +<h3 id="5-2-节点id替换">5.2 节点ID替换</h3> + +<ul> +<li>查看你的节点ID</li> +</ul> + +<pre><code>localhost:ipfs_pin yuechunli$ ipfs id +{ + &quot;ID&quot;: &quot;《your peer id》&quot; +} +localhost:ipfs_pin yuechunli$ +</code></pre> + +<p>在上面的源码中全局搜索将源码里面的<code>QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP</code>替换成你自己的<code>ID</code>。</p> + +<p>接下来重复<a href="#4-创建简易的网页发布到IPFS">4. 创建简易的网页发布到IPFS</a>的操作步骤即可。</p> + +<h3 id="5-3-浏览博客">5.3 浏览博客</h3> + +<p>浏览器打开<a href="https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/">https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/</a>查看项目效果。</p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-215636@2x.png" alt="IPFS 博客项目效果图" /></p> + +<h2 id="6-下篇预报">6. 下篇预报</h2> + +<h3 id="6-1-ipfs-ethereum-dapp-开发入门">6.1 <code>ipfs + ethereum</code><code>Dapp</code>开发入门</h3> + +<h2 id="7-技术交流">7. 技术交流</h2> + +<ul> +<li>区块链技术交流QQ群:<code>348924182</code></li> +<li>进微信群请加微信:<code>liyc1215</code></li> +<li>「区块链部落」官方公众号</li> +</ul> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/%E5%8C%BA%E5%9D%97%E9%93%BE%E9%83%A8%E8%90%BD.png" alt="" /></p> + + + + + + \ No newline at end of file diff --git a/css/hyde.css b/css/hyde.css new file mode 100755 index 0000000..2af6e03 --- /dev/null +++ b/css/hyde.css @@ -0,0 +1,285 @@ +/* + * __ __ + * /\ \ /\ \ + * \ \ \___ __ __ \_\ \ __ + * \ \ _ `\/\ \/\ \ /'_` \ /'__`\ + * \ \ \ \ \ \ \_\ \/\ \_\ \/\ __/ + * \ \_\ \_\/`____ \ \___,_\ \____\ + * \/_/\/_/`/___/> \/__,_ /\/____/ + * /\___/ + * \/__/ + * + * Designed, built, and released under MIT license by @mdo. Learn more at + * https://github.com/poole/hyde. + */ + + +/* + * Contents + * + * Global resets + * Sidebar + * Container + * Reverse layout + * Themes + */ + + +/* + * Global resets + * + * Update the foundational and global aspects of the page. + */ + +html { + font-family: "Fira Sans", sans-serif; + font-weight:300; + +} +@media (min-width: 48em) { + html { + font-size: 16px; + } +} +@media (min-width: 58em) { + html { + font-size: 20px; + } +} + +pre { + tab-size:4; +} + +/* + * Sidebar + * + * Flexible banner for housing site name, intro, and "footer" content. Starts + * out above content in mobile and later moves to the side with wider viewports. + */ + +.sidebar { + text-align: center; + padding: 2rem 1rem; + color: rgba(255,255,255,.5); + background-color: #300030; +} +@media (min-width: 48em) { + .sidebar { + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: 18rem; + text-align: left; + } +} + +/* Sidebar links */ +.sidebar a { + color: #fff; +} + +/* About section */ +.sidebar-about h1 { + color: #fff; + margin-top: 0; + font-weight:300; +} + +/* Sidebar nav */ +.sidebar-nav { + margin-top: 2rem; + margin-bottom: 2rem; + padding-left: 0; + list-style: none; +} + +.subnav { + list-style: none; + padding-left: 0; +} + +.sidebar-nav-item { + display: block; +} +a.sidebar-nav-item:hover, +a.sidebar-nav-item:focus { + text-decoration: underline; +} +.sidebar-nav-item.active { + font-weight: bold; +} + +/* Sticky sidebar + * + * Add the `sidebar-sticky` class to the sidebar's container to affix it the + * contents to the bottom of the sidebar in tablets and up. + */ + +@media (min-width: 48em) { + .sidebar-sticky { + position: absolute; + right: 1rem; + top: 1rem; + left: 1rem; + } +} + + +/* Container + * + * Align the contents of the site above the proper threshold with some margin-fu + * with a 25%-wide `.sidebar`. + */ + +.content { + padding-top: 2rem; + padding-bottom: 2rem; +} + +@media (min-width: 48em) { + .content { + max-width: 38rem; + margin-left: 20rem; + margin-right: 2rem; + } +} + +@media (min-width: 64em) { + .content { + max-width: 44rem; + margin-left: 20rem; + margin-right: 2rem; + } +} + +.footnote { + font-size: 0.7em; + margin-top: 0.5rem; +} + +.go { + color: #444444; +} + +.badge { + display:inline; + vertical-align: bottom; +} + +.badges { + float: right; +} + +.brand { + font-size: 4.0em; + margin-bottom: 0; +} + +/* + * Reverse layout + * + * Flip the orientation of the page by placing the `.sidebar` on the right. + */ + +@media (min-width: 48em) { + .layout-reverse .sidebar { + left: auto; + right: 0; + } + .layout-reverse .content { + margin-left: 2rem; + margin-right: 20rem; + } +} + +@media (min-width: 64em) { + .layout-reverse .content { + margin-left: 4rem; + margin-right: 22rem; + } +} + + + +/* + * Themes + * + * As of v1.1, Hyde includes optional themes to color the sidebar and links + * within blog posts. To use, add the class of your choosing to the `body`. + */ + +/* Base16 (http://chriskempson.github.io/base16/#default) */ + +/* Red */ +.theme-base-08 .sidebar { + background-color: #ac4142; +} +.theme-base-08 .content a, +.theme-base-08 .related-posts li a:hover { + color: #ac4142; +} + +/* Orange */ +.theme-base-09 .sidebar { + background-color: #d28445; +} +.theme-base-09 .content a, +.theme-base-09 .related-posts li a:hover { + color: #d28445; +} + +/* Yellow */ +.theme-base-0a .sidebar { + background-color: #f4bf75; +} +.theme-base-0a .content a, +.theme-base-0a .related-posts li a:hover { + color: #f4bf75; +} + +/* Green */ +.theme-base-0b .sidebar { + background-color: #90a959; +} +.theme-base-0b .content a, +.theme-base-0b .related-posts li a:hover { + color: #90a959; +} + +/* Cyan */ +.theme-base-0c .sidebar { + background-color: #75b5aa; +} +.theme-base-0c .content a, +.theme-base-0c .related-posts li a:hover { + color: #75b5aa; +} + +/* Blue */ +.theme-base-0d .sidebar { + background-color: #6a9fb5; +} +.theme-base-0d .content a, +.theme-base-0d .related-posts li a:hover { + color: #6a9fb5; +} + +/* Magenta */ +.theme-base-0e .sidebar { + background-color: #aa759f; +} +.theme-base-0e .content a, +.theme-base-0e .related-posts li a:hover { + color: #aa759f; +} + +/* Brown */ +.theme-base-0f .sidebar { + background-color: #8f5536; +} +.theme-base-0f .content a, +.theme-base-0f .related-posts li a:hover { + color: #8f5536; +} diff --git a/css/poole.css b/css/poole.css new file mode 100755 index 0000000..c2f9e35 --- /dev/null +++ b/css/poole.css @@ -0,0 +1,403 @@ +/* + * ___ + * /\_ \ + * _____ ___ ___\//\ \ __ + * /\ '__`\ / __`\ / __`\\ \ \ /'__`\ + * \ \ \_\ \/\ \_\ \/\ \_\ \\_\ \_/\ __/ + * \ \ ,__/\ \____/\ \____//\____\ \____\ + * \ \ \/ \/___/ \/___/ \/____/\/____/ + * \ \_\ + * \/_/ + * + * Designed, built, and released under MIT license by @mdo. Learn more at + * https://github.com/poole/poole. + */ + + +/* + * Contents + * + * Body resets + * Custom type + * Messages + * Container + * Masthead + * Posts and pages + * Pagination + * Reverse layout + * Themes + */ + + +/* + * Body resets + * + * Update the foundational and global aspects of the page. + */ + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html, +body { + margin: 0; + padding: 0; +} + +html { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.5; +} +@media (min-width: 38em) { + html { + font-size: 20px; + } +} + +body { + color: #515151; + background-color: #fff; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +/* No `:visited` state is required by default (browsers will use `a`) */ +a { + color: #268bd2; + text-decoration: none; +} +/* `:focus` is linked to `:hover` for basic accessibility */ +a:hover, +a:focus { + text-decoration: underline; +} + +/* Headings */ +h1, h2, h3, h4, h5, h6 { + margin-bottom: .5rem; + font-weight: 400; + line-height: 1.25; + color: #313131; + text-rendering: optimizeLegibility; +} +h1 { + font-size: 2rem; +} +h2 { + margin-top: 1rem; + font-size: 1.5rem; +} +h3 { + margin-top: 1.5rem; + font-size: 1.25rem; +} +h4, h5, h6 { + margin-top: 1rem; + font-size: 1rem; +} + +/* Body text */ +p { + margin-top: 0; + margin-bottom: 1rem; +} + +strong { + color: #303030; +} + + +/* Lists */ +ul, ol, dl { + margin-top: 0; + margin-bottom: 1rem; +} + +dt { + font-weight: bold; +} +dd { + margin-bottom: .5rem; +} + +/* Misc */ +hr { + position: relative; + margin: 1.5rem 0; + border: 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #fff; +} + +abbr { + font-size: 85%; + font-weight: bold; + color: #555; + text-transform: uppercase; +} +abbr[title] { + cursor: help; + border-bottom: 1px dotted #e5e5e5; +} + +/* Code */ +code, +pre { + font-family: Menlo, Monaco, "Courier New", monospace; +} +code { + padding: .25em .5em; + font-size: 85%; + color: #bf616a; + background-color: #f9f9f9; + border-radius: 3px; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + padding: 1rem; + font-size: .8rem; + line-height: 1.4; + white-space: pre; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + background-color: #f9f9f9; +} +pre code { + padding: 0; + font-size: 100%; + color: inherit; + background-color: transparent; +} +.highlight { + margin-bottom: 1rem; + border-radius: 4px; +} +.highlight pre { + margin-bottom: 0; +} + +/* Quotes */ +blockquote { + padding: .5rem 1rem; + margin: .8rem 0; + color: #7a7a7a; + border-left: .25rem solid #e5e5e5; +} +blockquote p:last-child { + margin-bottom: 0; +} +@media (min-width: 30em) { + blockquote { + padding-right: 5rem; + padding-left: 1.25rem; + } +} + +img { + display: block; + margin: 0 0 1rem; + border-radius: 5px; + max-width: 100%; +} + +/* Tables */ +table { + margin-bottom: 1rem; + width: 100%; + border: 1px solid #e5e5e5; + border-collapse: collapse; +} +td, +th { + padding: .25rem .5rem; + border: 1px solid #e5e5e5; +} +tbody tr:nth-child(odd) td, +tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + + +/* + * Custom type + * + * Extend paragraphs with `.lead` for larger introductory text. + */ + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + + +/* + * Messages + * + * Show alert messages to users. You may add it to single elements like a `

`, + * or to a parent if there are multiple elements to show. + */ + +.message { + margin-bottom: 1rem; + padding: 1rem; + color: #717171; + background-color: #f9f9f9; +} + + +/* + * Container + * + * Center the page content. + */ + +.container { + max-width: 38rem; + padding-left: 1rem; + padding-right: 1rem; + margin-left: auto; + margin-right: auto; +} + + +/* + * Masthead + * + * Super small header above the content for site name and short description. + */ + +.masthead { + padding-top: 1rem; + padding-bottom: 1rem; + margin-bottom: 3rem; +} +.masthead-title { + margin-top: 0; + margin-bottom: 0; + color: #505050; +} +.masthead-title a { + color: #505050; +} +.masthead-title small { + font-size: 75%; + font-weight: 400; + color: #c0c0c0; + letter-spacing: 0; +} + + +/* + * Posts and pages + * + * Each post is wrapped in `.post` and is used on default and post layouts. Each + * page is wrapped in `.page` and is only used on the page layout. + */ + +.page, +.post { + margin-bottom: 4em; +} + +/* Blog post or page title */ +.page-title, +.post-title, +.post-title a { + color: #303030; +} +.page-title, +.post-title { + margin-top: 0; +} + +/* Meta data line below post title */ +.post-date { + display: block; + margin-top: -.5rem; + margin-bottom: 1rem; + color: #9a9a9a; +} + +/* Related posts */ +.related { + padding-top: 2rem; + padding-bottom: 2rem; + border-top: 1px solid #eee; +} +.related-posts { + padding-left: 0; + list-style: none; +} +.related-posts h3 { + margin-top: 0; +} +.related-posts li small { + font-size: 75%; + color: #999; +} +.related-posts li a:hover { + color: #268bd2; + text-decoration: none; +} +.related-posts li a:hover small { + color: inherit; +} + + +/* + * Pagination + * + * Super lightweight (HTML-wise) blog pagination. `span`s are provide for when + * there are no more previous or next posts to show. + */ + +.pagination { + overflow: hidden; /* clearfix */ + margin-left: -1rem; + margin-right: -1rem; + font-family: "PT Sans", Helvetica, Arial, sans-serif; + color: #ccc; + text-align: center; +} + +/* Pagination items can be `span`s or `a`s */ +.pagination-item { + display: block; + padding: 1rem; + border: 1px solid #eee; +} +.pagination-item:first-child { + margin-bottom: -1px; +} + +/* Only provide a hover state for linked pagination items */ +a.pagination-item:hover { + background-color: #f5f5f5; +} + +@media (min-width: 30em) { + .pagination { + margin: 3rem 0; + } + .pagination-item { + float: left; + width: 50%; + } + .pagination-item:first-child { + margin-bottom: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + .pagination-item:last-child { + margin-left: -1px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } +} diff --git a/css/syntax.css b/css/syntax.css new file mode 100755 index 0000000..1264b87 --- /dev/null +++ b/css/syntax.css @@ -0,0 +1,66 @@ +.hll { background-color: #ffffcc } + /*{ background: #f0f3f3; }*/ +.c { color: #999; } /* Comment */ +.err { color: #AA0000; background-color: #FFAAAA } /* Error */ +.k { color: #006699; } /* Keyword */ +.o { color: #555555 } /* Operator */ +.cm { color: #0099FF; font-style: italic } /* Comment.Multiline */ +.cp { color: #009999 } /* Comment.Preproc */ +.c1 { color: #999; } /* Comment.Single */ +.cs { color: #999; } /* Comment.Special */ +.gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #003300; } /* Generic.Heading */ +.gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */ +.go { color: #AAAAAA } /* Generic.Output */ +.gp { color: #000099; } /* Generic.Prompt */ +.gs { } /* Generic.Strong */ +.gu { color: #003300; } /* Generic.Subheading */ +.gt { color: #99CC66 } /* Generic.Traceback */ +.kc { color: #006699; } /* Keyword.Constant */ +.kd { color: #006699; } /* Keyword.Declaration */ +.kn { color: #006699; } /* Keyword.Namespace */ +.kp { color: #006699 } /* Keyword.Pseudo */ +.kr { color: #006699; } /* Keyword.Reserved */ +.kt { color: #007788; } /* Keyword.Type */ +.m { color: #FF6600 } /* Literal.Number */ +.s { color: #d44950 } /* Literal.String */ +.na { color: #4f9fcf } /* Name.Attribute */ +.nb { color: #336666 } /* Name.Builtin */ +.nc { color: #00AA88; } /* Name.Class */ +.no { color: #336600 } /* Name.Constant */ +.nd { color: #9999FF } /* Name.Decorator */ +.ni { color: #999999; } /* Name.Entity */ +.ne { color: #CC0000; } /* Name.Exception */ +.nf { color: #CC00FF } /* Name.Function */ +.nl { color: #9999FF } /* Name.Label */ +.nn { color: #00CCFF; } /* Name.Namespace */ +.nt { color: #2f6f9f; } /* Name.Tag */ +.nv { color: #003333 } /* Name.Variable */ +.ow { color: #000000; } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #FF6600 } /* Literal.Number.Float */ +.mh { color: #FF6600 } /* Literal.Number.Hex */ +.mi { color: #FF6600 } /* Literal.Number.Integer */ +.mo { color: #FF6600 } /* Literal.Number.Oct */ +.sb { color: #CC3300 } /* Literal.String.Backtick */ +.sc { color: #CC3300 } /* Literal.String.Char */ +.sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */ +.s2 { color: #CC3300 } /* Literal.String.Double */ +.se { color: #CC3300; } /* Literal.String.Escape */ +.sh { color: #CC3300 } /* Literal.String.Heredoc */ +.si { color: #AA0000 } /* Literal.String.Interpol */ +.sx { color: #CC3300 } /* Literal.String.Other */ +.sr { color: #33AAAA } /* Literal.String.Regex */ +.s1 { color: #CC3300 } /* Literal.String.Single */ +.ss { color: #FFCC33 } /* Literal.String.Symbol */ +.bp { color: #336666 } /* Name.Builtin.Pseudo */ +.vc { color: #003333 } /* Name.Variable.Class */ +.vg { color: #003333 } /* Name.Variable.Global */ +.vi { color: #003333 } /* Name.Variable.Instance */ +.il { color: #FF6600 } /* Literal.Number.Integer.Long */ + +.css .o, +.css .o + .nt, +.css .nt + .nt { color: #999; } diff --git a/favicon.png b/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..84cce4dd307a78a3a9455c4fed62b49b9c7e61ad GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%MS8k8hE&{2x^n4K(gM|lqy>f&TN57WCL9#mRrOU%@9M2v zw~lByu=VViq&Z7-h83rlMDLS8?zSQ~WwmG?M|puWCl{~GxYDGU!#GW<*Dv&0hD=YC eg9!tN0mC+9$z85`0v~~vFnGH9xvX + + + + + + + + + + + + 区块链部落 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + +
+
+ + + +
+

+ + 【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建 + +

+ + + + + + + + +
+

孔壹学院:国内区块链职业教育引领品牌。

+ +

作者:黎跃春,孔壹学院创始人,区块链、高可用架构师

+ +

微信:liyc1215

+ +

区块链博客:http://liyuechun.org

+
+ +

在阅读这篇文章之前,你需要先学习【IPFS + 区块链 系列】 入门篇 - IPFS环境配置这篇文章。

+ +

目录

+ + + +

1. 如何在IPFS新增一个文件

+ +

1.1 新建file.txt文件

+ +

打开终端,切换到桌面,新建一个文件夹1121,切换到1121中,通过vi新建一个文件file.txt,文件里面输入春哥微信号liyc1215保存并且退出。

+ +
localhost:Desktop yuechunli$ pwd
+/Users/liyuechun/Desktop
+localhost:Desktop yuechunli$ mkdir 1121
+localhost:Desktop yuechunli$ cd 1121/
+localhost:1121 yuechunli$ vi file.txt
+localhost:1121 yuechunli$ cat file.txt
+liyc1215
+localhost:1121 yuechunli$
+
+ +

1.2 查看ipfs相关命令

+ +
localhost:1121 yuechunli$ ipfs help
+USAGE
+  ipfs - Global p2p merkle-dag filesystem.
+
+  ipfs [--config=<config> | -c] [--debug=<debug> | -D] [--help=<help>] [-h=<h>] [--local=<local> | -L] [--api=<api>] <command> ...
+
+SUBCOMMANDS
+  BASIC COMMANDS
+    init          Initialize ipfs local configuration
+    add <path>    Add a file to IPFS
+    cat <ref>     Show IPFS object data
+    get <ref>     Download IPFS objects
+    ls <ref>      List links from an object
+    refs <ref>    List hashes of links from an object
+
+  DATA STRUCTURE COMMANDS
+    block         Interact with raw blocks in the datastore
+    object        Interact with raw dag nodes
+    files         Interact with objects as if they were a unix filesystem
+    dag           Interact with IPLD documents (experimental)
+
+  ADVANCED COMMANDS
+    daemon        Start a long-running daemon process
+    mount         Mount an IPFS read-only mountpoint
+    resolve       Resolve any type of name
+    name          Publish and resolve IPNS names
+    key           Create and list IPNS name keypairs
+    dns           Resolve DNS links
+    pin           Pin objects to local storage
+    repo          Manipulate the IPFS repository
+    stats         Various operational stats
+    p2p           Libp2p stream mounting
+    filestore     Manage the filestore (experimental)
+
+  NETWORK COMMANDS
+    id            Show info about IPFS peers
+    bootstrap     Add or remove bootstrap peers
+    swarm         Manage connections to the p2p network
+    dht           Query the DHT for values or peers
+    ping          Measure the latency of a connection
+    diag          Print diagnostics
+
+  TOOL COMMANDS
+    config        Manage configuration
+    version       Show ipfs version information
+    update        Download and apply go-ipfs updates
+    commands      List all available commands
+
+ +

1.3 将file.txt添加到ipfs节点

+ +
localhost:1121 yuechunli$ ls
+file.txt
+localhost:1121 yuechunli$ ipfs add file.txt
+added QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T file.txt
+localhost:1121 yuechunli$ cat file.txt
+liyc1215
+localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T
+liyc1215
+localhost:1121 yuechunli$
+
+ +

当执行完ipfs add file.txt这个命令以后,会将file.txt添加到ipfs当前的节点中,并且会对file.txt文件生成一个唯一的hashQmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T,如果想查看本地ipfs节点的数据,可以通过ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T进行查看。

+ +

⚠️:当我试图通过http://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T进行数据访问时,无法访问,如下图所示:

+ +

+ +

⚠️:虽然数据已经添加到当前的你自己的IPFS节点中,但是并没有同步到IPFS网络,所以暂时在网络上无法访问。

+ +

⚠️:重要:接下来执行下面的命令同步节点数据到IPFS网络,再试图在网络上查看数据。

+ +
    +
  • 同步节点
  • +
+ +

新建一个终端,执行ipfs daemon

+ +
localhost:.ipfs yuechunli$ ipfs daemon
+Initializing daemon...
+Adjusting current ulimit to 2048...
+Successfully raised file descriptor limit to 2048.
+Swarm listening on /ip4/111.196.246.151/tcp/3637
+Swarm listening on /ip4/127.0.0.1/tcp/4001
+Swarm listening on /ip4/169.254.170.167/tcp/4001
+Swarm listening on /ip4/192.168.0.107/tcp/4001
+Swarm listening on /ip6/::1/tcp/4001
+API server listening on /ip4/127.0.0.1/tcp/5001
+Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
+Daemon is ready
+
+ +
    +
  • IPFS网络查看数据
  • +
+ +

浏览器访问https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T

+ +

黎跃春 微信

+ +

2. 通过ipfs创建目录存储文件

+ +

在着上面的步骤走,我们可以通过ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215查看添加到ipfs网络的file.txt文件的内容,如下:

+ +
localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T
+liyc1215
+localhost:1121 yuechunli$
+
+ +

当然,我们也可以通过ipfs的相关命令在ipfs的根目录下面创建文件夹,并且将file.txt文件移动或者拷贝到我们创建的文件夹中。

+ +

⚠️:cp不会改变文件hash,mv会改变hash寻址。

+ +
localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T
+liyc1215
+localhost:1121 yuechunli$ ipfs files mkdir /LiYueChun
+localhost:1121 yuechunli$ ipfs files cp /ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T /LiYueChun/file.txt
+localhost:1121 yuechunli$ ipfs files ls /
+LiYueChun
+localhost:1121 yuechunli$ ipfs files ls /LiYueChun/
+file.txt
+localhost:1121 yuechunli$ ipfs files read /LiYueChun/file.txt
+liyc1215
+localhost:1121 yuechunli$
+
+ +

3. 如何在IPFS新增一个目录

+ +

3.1 使用ipfs add -r可以上传一整个目录

+ +
localhost:1121 yuechunli$ ipfs add -r ipfs-tutorial/
+added QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc ipfs-tutorial/contactme.txt
+added QmfKdWsguobA3aDPvSxLB3Bq4HMKyqKSgFr2NFUuVH8n31 ipfs-tutorial/eth-fabric.png
+added QmXe8jTxTh5MZP6BK5cnj19mXNTKVMzNyUJZUHuYyr5dk1 ipfs-tutorial/gongzhonghao.png
+added QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek ipfs-tutorial
+
+ +

3.2 通过路径访问contactme.txt文件数据

+ +

如果我们上传的是目录,那么可以通过下面几种方式访问到contactme.txt文件的数据。

+ +
localhost:1121 yuechunli$ ipfs cat QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc
+微信:liyc1215
+区块链技术交流群:348924182
+公众号:区块链部落
+localhost:1121 yuechunli$ ipfs cat /ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc
+微信:liyc1215
+区块链技术交流群:348924182
+公众号:区块链部落
+localhost:1121 yuechunli$ ipfs cat /ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt
+微信:liyc1215
+区块链技术交流群:348924182
+公众号:区块链部落
+localhost:1121 yuechunli$
+
+ +

3.3 通过Hash查看数据IPFS网络数据

+ + + +

+ + + +

+ +

4. 创建简易的网页发布到IPFS

+ +

在这里我先自己写一个简单的网页给大家演示,先在桌面新建一个site文件夹,然后按照下面的步骤在site文件夹中建立index.htmlstyle.css文件。

+ +

4.1 创建一个index.html文件

+ +
<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>Hello IPFS!</title>
+  <link rel="stylesheet" href="./style.css" />
+</head>
+<body>
+  <h1>Hello IPFS!</h1>
+</body>
+</html>
+
+ +

4.2 创建一个style.css文件

+ +
h1 {
+  color: green;
+}
+
+ +

4.3 添加到ipfs

+ +
localhost:Desktop yuechunli$ ipfs add -r site/
+added QmWG5rbgT9H77TGq49RXNoqN8M7DNKMnMX425nkmCB6BjS site/index.html
+added QmfGLJ3mryLvicQqzdsghq4QRhptKJtBAPe7yDJxsBGSuy site/style.css
+added QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp site
+
+ +

最后一行是项目根目录的hash,你先通过ipfs daemon同步网络,然后可以通过https://ipfs.io/ipfs/<你的项目根目录hash>,即https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp访问项目。

+ +

4.4 网络同步

+ +
localhost:Desktop yuechunli$ ipfs daemon
+
+ +

4.5 访问网站

+ +

浏览器打开https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp,效果图如下:

+ +

+ +

4.6 发布到IPNS

+ +

当我们修改网站内容重新添加到ipfs时,hash会发生变化,当我们网站更新时,我们可以将网站发布到IPNS,在IPNS中,允许我们节点的域名空间中引用一个IPFS hash,也就是说我们可以通过节点ID对项目根目录的IPFS HASH进行绑定,以后我们访问网站时直接通过节点·ID访问即可,当我们更新博客时,重新发布到IPNS`即可。

+ +
localhost:~ yuechunli$ ipfs name publish QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp
+Published to QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP: /ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp
+localhost:~ yuechunli$ ipfs id
+{
+	"ID": "QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP"
+}
+
+ +

当我们执行ipfs name publish命令时,会返回我们的节点ID,你可以通过ipfs id进行查看验证是否是你的节点ID

+ +

⚠️:验证

+ +
$ ipfs name resolve <peerId>
+
+ +
localhost:~ yuechunli$ ipfs name resolve QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP
+/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp
+localhost:~ yuechunli$
+
+ +

⚠️:当然我们现在就可以通过IPNS进行访问了。

+ +
https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP
+
+ +

⚠️⚠️⚠️:注意上面是ipns而不是ipfs。

+ +

+ +

⚠️:如果你网站数据修改,需要重新发布到IPNS。

+ +

5. 发布个人博客

+ +

你可以通过Hugo按照官方文档创建一个漂亮的静态博客Hugo官方网站,当然你也可以自己编写,或者使用其他开源项目搭建。

+ +

5.1 搭建静态博客

+ +

大家可以自己搭建,也可以直接下载我的博客源码直接搭建。

+ +

源码地址:http://github.com/liyuechun/ipfs_blogger

+ +

5.2 节点ID替换

+ +
    +
  • 查看你的节点ID
  • +
+ +
localhost:ipfs_pin yuechunli$ ipfs id
+{
+	"ID": "《your peer id》"
+}
+localhost:ipfs_pin yuechunli$
+
+ +

在上面的源码中全局搜索将源码里面的QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP替换成你自己的ID

+ +

接下来重复4. 创建简易的网页发布到IPFS的操作步骤即可。

+ +

5.3 浏览博客

+ +

浏览器打开https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/查看项目效果。

+ +

IPFS 博客项目效果图

+ +

6. 下篇预报

+ +

6.1 ipfs + ethereumDapp开发入门

+ +

7. 技术交流

+ +
    +
  • 区块链技术交流QQ群:348924182
  • +
  • 进微信群请加微信:liyc1215
  • +
  • 「区块链部落」官方公众号
  • +
+ +

+ +
+ + +
+ + + + diff --git a/index.xml b/index.xml new file mode 100644 index 0000000..e04cd71 --- /dev/null +++ b/index.xml @@ -0,0 +1,400 @@ + + + + 区块链部落 + Hugo + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/ + en-us + 黎跃春 + 2017 liyuechun + Mon, 30 Oct 2017 20:01:00 UTC + + + + 【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建 + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/2017/10/ipfs_first_post/ + Mon, 30 Oct 2017 20:01:00 UTC + 黎跃春 + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/2017/10/ipfs_first_post/ + + +<blockquote> +<p>孔壹学院:国内区块链职业教育引领品牌。</p> + +<p>作者:黎跃春,孔壹学院创始人,区块链、高可用架构师</p> + +<p>微信:liyc1215</p> + +<p>区块链博客:<a href="http://liyuechun.org">http://liyuechun.org</a></p> +</blockquote> + +<p>在阅读这篇文章之前,你需要先学习<a href="http://liyuechun.org/2017/11/20/ipfs-blockchain/">【IPFS + 区块链 系列】 入门篇 - IPFS环境配置</a>这篇文章。</p> + +<h2 id="目录">目录</h2> + +<ul> +<li><a href="#1-如何在IPFS新增一个文件">1. 如何在IPFS新增一个文件</a> + +<ul> +<li><a href="#11-新建file.txt文件">1.1 新建file.txt文件</a></li> +<li><a href="#12-查看ipfs相关命令">1.2 查看ipfs相关命令</a></li> +<li><a href="#13-将file.txt添加到ipfs节点">1.3 将file.txt添加到ipfs节点</a></li> +</ul></li> +<li><a href="#2-通过ipfs创建目录存储文件">2. 通过ipfs创建目录存储文件</a></li> +<li><a href="#3-如何在IPFS新增一个目录">3. 如何在IPFS新增一个目录</a> + +<ul> +<li><a href="#31-使用ipfs add -r可以上传一整个目录">3.1 使用ipfs add -r可以上传一整个目录</a></li> +<li><a href="#32-通过路径访问contactme.txt文件数据">3.2 通过路径访问contactme.txt文件数据</a></li> +<li><a href="#33-通过Hash查看数据IPFS网络数据">3.3 通过Hash查看数据IPFS网络数据</a></li> +</ul></li> +<li><a href="#4-创建简易的网页发布到IPFS">4. 创建简易的网页发布到IPFS</a> + +<ul> +<li><a href="#41-创建一个index.html文件">4.1 创建一个index.html文件</a></li> +<li><a href="#42-创建一个style.css文件">4.2 创建一个style.css文件</a></li> +<li><a href="#43-添加到ipfs">4.3 添加到ipfs</a></li> +<li><a href="#44-网络同步">4.4 网络同步</a></li> +<li><a href="#45-访问网站">4.5 访问网站</a></li> +<li><a href="#46-发布到IPNS">4.6 发布到IPNS</a></li> +</ul></li> +<li><a href="#5-发布个人博客">5. 发布个人博客</a> + +<ul> +<li><a href="#51-搭建静态博客">5.1 搭建静态博客</a></li> +<li><a href="#52-节点ID替换">5.2 节点ID替换</a></li> +<li><a href="#53-浏览博客">5.3 浏览博客</a></li> +</ul></li> +<li><a href="#6-下篇预报">6. 下篇预报</a> + +<ul> +<li><a href="#61-`ipfs + ethereum``Dapp`开发入门">6.1 <code>ipfs + ethereum</code><code>Dapp</code>开发入门</a></li> +</ul></li> +</ul> + +<h2 id="1-如何在ipfs新增一个文件">1. 如何在IPFS新增一个文件</h2> + +<h3 id="1-1-新建file-txt文件">1.1 新建file.txt文件</h3> + +<p>打开终端,切换到桌面,新建一个文件夹<code>1121</code>,切换到<code>1121</code>中,通过<code>vi</code>新建一个文件<code>file.txt</code>,文件里面输入春哥微信号<code>liyc1215</code>保存并且退出。</p> + +<pre><code>localhost:Desktop yuechunli$ pwd +/Users/liyuechun/Desktop +localhost:Desktop yuechunli$ mkdir 1121 +localhost:Desktop yuechunli$ cd 1121/ +localhost:1121 yuechunli$ vi file.txt +localhost:1121 yuechunli$ cat file.txt +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<h3 id="1-2-查看ipfs相关命令">1.2 查看ipfs相关命令</h3> + +<pre><code>localhost:1121 yuechunli$ ipfs help +USAGE + ipfs - Global p2p merkle-dag filesystem. + + ipfs [--config=&lt;config&gt; | -c] [--debug=&lt;debug&gt; | -D] [--help=&lt;help&gt;] [-h=&lt;h&gt;] [--local=&lt;local&gt; | -L] [--api=&lt;api&gt;] &lt;command&gt; ... + +SUBCOMMANDS + BASIC COMMANDS + init Initialize ipfs local configuration + add &lt;path&gt; Add a file to IPFS + cat &lt;ref&gt; Show IPFS object data + get &lt;ref&gt; Download IPFS objects + ls &lt;ref&gt; List links from an object + refs &lt;ref&gt; List hashes of links from an object + + DATA STRUCTURE COMMANDS + block Interact with raw blocks in the datastore + object Interact with raw dag nodes + files Interact with objects as if they were a unix filesystem + dag Interact with IPLD documents (experimental) + + ADVANCED COMMANDS + daemon Start a long-running daemon process + mount Mount an IPFS read-only mountpoint + resolve Resolve any type of name + name Publish and resolve IPNS names + key Create and list IPNS name keypairs + dns Resolve DNS links + pin Pin objects to local storage + repo Manipulate the IPFS repository + stats Various operational stats + p2p Libp2p stream mounting + filestore Manage the filestore (experimental) + + NETWORK COMMANDS + id Show info about IPFS peers + bootstrap Add or remove bootstrap peers + swarm Manage connections to the p2p network + dht Query the DHT for values or peers + ping Measure the latency of a connection + diag Print diagnostics + + TOOL COMMANDS + config Manage configuration + version Show ipfs version information + update Download and apply go-ipfs updates + commands List all available commands +</code></pre> + +<h3 id="1-3-将file-txt添加到ipfs节点">1.3 将file.txt添加到ipfs节点</h3> + +<pre><code>localhost:1121 yuechunli$ ls +file.txt +localhost:1121 yuechunli$ ipfs add file.txt +added QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T file.txt +localhost:1121 yuechunli$ cat file.txt +liyc1215 +localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<p>当执行完<code>ipfs add file.txt</code>这个命令以后,会将<code>file.txt</code>添加到<code>ipfs</code>当前的节点中,并且会对<code>file.txt</code>文件生成一个唯一的<code>hash</code><code>QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</code>,如果想查看本地<code>ipfs</code>节点的数据,可以通过<code>ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</code>进行查看。</p> + +<p><strong>⚠️:</strong>当我试图通过<code>http://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</code>进行数据访问时,无法访问,如下图所示:</p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/fangwen.gif" alt="" /></p> + +<p><strong>⚠️:</strong>虽然数据已经添加到当前的你自己的<code>IPFS</code>节点中,但是并没有同步到<code>IPFS</code>网络,所以暂时在网络上无法访问。</p> + +<p><strong>⚠️:重要:接下来执行下面的命令同步节点数据到<code>IPFS</code>网络,再试图在网络上查看数据。</strong></p> + +<ul> +<li>同步节点</li> +</ul> + +<p>新建一个终端,执行<code>ipfs daemon</code>。</p> + +<pre><code>localhost:.ipfs yuechunli$ ipfs daemon +Initializing daemon... +Adjusting current ulimit to 2048... +Successfully raised file descriptor limit to 2048. +Swarm listening on /ip4/111.196.246.151/tcp/3637 +Swarm listening on /ip4/127.0.0.1/tcp/4001 +Swarm listening on /ip4/169.254.170.167/tcp/4001 +Swarm listening on /ip4/192.168.0.107/tcp/4001 +Swarm listening on /ip6/::1/tcp/4001 +API server listening on /ip4/127.0.0.1/tcp/5001 +Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 +Daemon is ready +</code></pre> + +<ul> +<li>从<code>IPFS</code>网络查看数据</li> +</ul> + +<p>浏览器访问<a href="https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T">https://ipfs.io/ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T</a></p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-105531@2x.png" alt="黎跃春 微信" /></p> + +<h2 id="2-通过ipfs创建目录存储文件">2. 通过ipfs创建目录存储文件</h2> + +<p>在着上面的步骤走,我们可以通过<code>ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215</code>查看添加到<code>ipfs</code>网络的<code>file.txt</code>文件的内容,如下:</p> + +<pre><code>localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<p>当然,我们也可以通过<code>ipfs</code>的相关命令在<code>ipfs</code>的根目录下面创建文件夹,并且将<code>file.txt</code>文件<strong>移动</strong>或者<strong>拷贝</strong>到我们创建的文件夹中。</p> + +<p><strong>⚠️:cp不会改变文件hash,mv会改变hash寻址。</strong></p> + +<pre><code>localhost:1121 yuechunli$ ipfs cat QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T +liyc1215 +localhost:1121 yuechunli$ ipfs files mkdir /LiYueChun +localhost:1121 yuechunli$ ipfs files cp /ipfs/QmbrevseVQKf1vsYMsxCscRf6D7S2dftYpHwxkYf94pc7T /LiYueChun/file.txt +localhost:1121 yuechunli$ ipfs files ls / +LiYueChun +localhost:1121 yuechunli$ ipfs files ls /LiYueChun/ +file.txt +localhost:1121 yuechunli$ ipfs files read /LiYueChun/file.txt +liyc1215 +localhost:1121 yuechunli$ +</code></pre> + +<h2 id="3-如何在ipfs新增一个目录">3. 如何在IPFS新增一个目录</h2> + +<h3 id="3-1-使用ipfs-add-r可以上传一整个目录">3.1 使用ipfs add -r可以上传一整个目录</h3> + +<pre><code>localhost:1121 yuechunli$ ipfs add -r ipfs-tutorial/ +added QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc ipfs-tutorial/contactme.txt +added QmfKdWsguobA3aDPvSxLB3Bq4HMKyqKSgFr2NFUuVH8n31 ipfs-tutorial/eth-fabric.png +added QmXe8jTxTh5MZP6BK5cnj19mXNTKVMzNyUJZUHuYyr5dk1 ipfs-tutorial/gongzhonghao.png +added QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek ipfs-tutorial +</code></pre> + +<h4 id="3-2-通过路径访问contactme-txt文件数据">3.2 通过路径访问contactme.txt文件数据</h4> + +<p>如果我们上传的是目录,那么可以通过下面几种方式访问到<code>contactme.txt</code>文件的数据。</p> + +<pre><code>localhost:1121 yuechunli$ ipfs cat QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ ipfs cat /ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ ipfs cat /ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt +微信:liyc1215 +区块链技术交流群:348924182 +公众号:区块链部落 +localhost:1121 yuechunli$ +</code></pre> + +<h3 id="3-3-通过hash查看数据ipfs网络数据">3.3 通过Hash查看数据IPFS网络数据</h3> + +<ul> +<li><strong>访问目录:</strong><a href="https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek">https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek</a></li> +</ul> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-110959@2x.png" alt="" /></p> + +<ul> +<li><p><strong>通过目录访问文件:</strong><a href="https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt">https://ipfs.io/ipfs/QmSsjQDVw1fvmG5RsZMgp2GjihiXn2zDv64mfHZN3AREek/contactme.txt</a> +<img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-111019@2x.png" alt="" /></p></li> + +<li><p><strong>通过文件hash直接访问:</strong><a href="https://ipfs.io/ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc">https://ipfs.io/ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc</a></p></li> +</ul> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-113047@2x.png" alt="" /></p> + +<h2 id="4-创建简易的网页发布到ipfs">4. 创建简易的网页发布到IPFS</h2> + +<p>在这里我先自己写一个简单的网页给大家演示,先在桌面新建一个<code>site</code>文件夹,然后按照下面的步骤在<code>site</code>文件夹中建立<code>index.html</code>和<code>style.css</code>文件。</p> + +<h3 id="4-1-创建一个index-html文件">4.1 创建一个index.html文件</h3> + +<pre><code>&lt;!DOCTYPE html&gt; +&lt;html lang=&quot;en&quot;&gt; +&lt;head&gt; + &lt;meta charset=&quot;UTF-8&quot;&gt; + &lt;title&gt;Hello IPFS!&lt;/title&gt; + &lt;link rel=&quot;stylesheet&quot; href=&quot;./style.css&quot; /&gt; +&lt;/head&gt; +&lt;body&gt; + &lt;h1&gt;Hello IPFS!&lt;/h1&gt; +&lt;/body&gt; +&lt;/html&gt; +</code></pre> + +<h3 id="4-2-创建一个style-css文件">4.2 创建一个style.css文件</h3> + +<pre><code>h1 { + color: green; +} +</code></pre> + +<h3 id="4-3-添加到ipfs">4.3 添加到ipfs</h3> + +<pre><code>localhost:Desktop yuechunli$ ipfs add -r site/ +added QmWG5rbgT9H77TGq49RXNoqN8M7DNKMnMX425nkmCB6BjS site/index.html +added QmfGLJ3mryLvicQqzdsghq4QRhptKJtBAPe7yDJxsBGSuy site/style.css +added QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp site +</code></pre> + +<p>最后一行是项目根目录的<code>hash</code>,你先通过<code>ipfs daemon</code>同步网络,然后可以通过<code>https://ipfs.io/ipfs/&lt;你的项目根目录hash&gt;</code>,即<code>https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp</code>访问项目。</p> + +<h3 id="4-4-网络同步">4.4 网络同步</h3> + +<pre><code>localhost:Desktop yuechunli$ ipfs daemon +</code></pre> + +<h3 id="4-5-访问网站">4.5 访问网站</h3> + +<p>浏览器打开<a href="https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp">https://ipfs.io/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp</a>,效果图如下:</p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-210721@2x.png" alt="" /></p> + +<h3 id="4-6-发布到ipns">4.6 发布到IPNS</h3> + +<p>当我们修改网站内容重新添加到<code>ipfs</code>时,<code>hash</code>会发生变化,当我们网站更新时,我们可以将网站发布到IPNS,在IPNS中,允许我们节点的域名空间中引用一个<code>IPFS hash</code>,也就是说我们可以通过节点<code>ID</code>对项目根目录的<code>IPFS HASH</code>进行绑定,以后我们访问网站时直接通过节点·ID<code>访问即可,当我们更新博客时,重新发布到</code>IPNS`即可。</p> + +<pre><code>localhost:~ yuechunli$ ipfs name publish QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +Published to QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP: /ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +localhost:~ yuechunli$ ipfs id +{ + &quot;ID&quot;: &quot;QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP&quot; +} +</code></pre> + +<p>当我们执行<code>ipfs name publish</code>命令时,会返回我们的节点<code>ID</code>,你可以通过<code>ipfs id</code>进行查看验证是否是你的节点<code>ID</code>。</p> + +<p><strong>⚠️:验证</strong></p> + +<pre><code>$ ipfs name resolve &lt;peerId&gt; +</code></pre> + +<pre><code>localhost:~ yuechunli$ ipfs name resolve QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP +/ipfs/QmdVEGkT5u7LtzzatTrn8JGNEF3fpuMPVs2rPCfvqRykRp +localhost:~ yuechunli$ +</code></pre> + +<p><strong>⚠️:</strong>当然我们现在就可以通过<code>IPNS</code>进行访问了。</p> + +<pre><code>https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP +</code></pre> + +<p><strong>⚠️⚠️⚠️:注意上面是ipns而不是ipfs。</strong></p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-212123@2x.png" alt="" /></p> + +<p><strong>⚠️:如果你网站数据修改,需要重新发布到IPNS。</strong></p> + +<h2 id="5-发布个人博客">5. 发布个人博客</h2> + +<p>你可以通过<code>Hugo</code>按照官方文档创建一个漂亮的静态博客<a href="http://gohugo.io/getting-started/quick-start/">Hugo官方网站</a>,当然你也可以自己编写,或者使用其他开源项目搭建。</p> + +<h3 id="5-1-搭建静态博客">5.1 搭建静态博客</h3> + +<p>大家可以自己搭建,也可以直接下载我的博客源码直接搭建。</p> + +<p>源码地址:<a href="http://github.com/liyuechun/ipfs_blogger">http://github.com/liyuechun/ipfs_blogger</a></p> + +<h3 id="5-2-节点id替换">5.2 节点ID替换</h3> + +<ul> +<li>查看你的节点ID</li> +</ul> + +<pre><code>localhost:ipfs_pin yuechunli$ ipfs id +{ + &quot;ID&quot;: &quot;《your peer id》&quot; +} +localhost:ipfs_pin yuechunli$ +</code></pre> + +<p>在上面的源码中全局搜索将源码里面的<code>QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP</code>替换成你自己的<code>ID</code>。</p> + +<p>接下来重复<a href="#4-创建简易的网页发布到IPFS">4. 创建简易的网页发布到IPFS</a>的操作步骤即可。</p> + +<h3 id="5-3-浏览博客">5.3 浏览博客</h3> + +<p>浏览器打开<a href="https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/">https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/</a>查看项目效果。</p> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/WX20171121-215636@2x.png" alt="IPFS 博客项目效果图" /></p> + +<h2 id="6-下篇预报">6. 下篇预报</h2> + +<h3 id="6-1-ipfs-ethereum-dapp-开发入门">6.1 <code>ipfs + ethereum</code><code>Dapp</code>开发入门</h3> + +<h2 id="7-技术交流">7. 技术交流</h2> + +<ul> +<li>区块链技术交流QQ群:<code>348924182</code></li> +<li>进微信群请加微信:<code>liyc1215</code></li> +<li>「区块链部落」官方公众号</li> +</ul> + +<p><img src="http://om1c35wrq.bkt.clouddn.com/%E5%8C%BA%E5%9D%97%E9%93%BE%E9%83%A8%E8%90%BD.png" alt="" /></p> + + + + + + \ No newline at end of file diff --git a/qrcode_for_gh.jpg b/qrcode_for_gh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e147a9a79e6d7d6797c493e1f5545bac8a871a77 GIT binary patch literal 27797 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 literal 0 HcmV?d00001 diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..0caf2d4 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,22 @@ + + + + + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/2017/10/ipfs_first_post/ + 2017-10-30T20:01:00+00:00 + + + + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/blog/ + 2017-10-30T20:01:00+00:00 + 0 + + + + https://ipfs.io/ipns/QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP/ + 2017-10-30T20:01:00+00:00 + 0 + + + \ No newline at end of file diff --git a/touch-icon-144-precomposed.png b/touch-icon-144-precomposed.png new file mode 100755 index 0000000000000000000000000000000000000000..19323de1ee3aa16ca05e222a3aecdb5d6251b578 GIT binary patch literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q2}owBl)eX2k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+81HzxIEGZ*dUMAxuPH$0z{6W5pO}33{8R+o-182kbX-^L zyVq(_$?dkxymG3UulmYkZQng|_TB%H6+f@$X}ox(sO!gN*I(XMWl&3CV)Hq`!ZV|R zQ^J5z*dT#PE#Ux*&w&Qc84W-#BQsdR`YZ0c*7hGyzP-(R-^@)q@BgmIoOSu-mM4k7 z_PyVAPWBm}_ca5a%STtO`ef7p>HF{H*W=e;f4M#-GVJ=-KZjccjuqBCdwV{A>j&{) zNoP;8Uw;1+NV!}-@9{-55RcuMuKC?xyXVEu^Upv3@xAuibVF;`Ck-a$z;_$0TLl*N z966iDoYVR3_uoIh)9U9{yL+!sPp!0&$rIbGv-)+_zeFdF#}@Z=_zoBBj9C>W*49B zfA@zWXZPJ@);|C4me{h+n3$n*s-2HGCoG$9$11@vE!bP|@u3yZfQf;@)78&qol`;+ E0G>zh-v9sr literal 0 HcmV?d00001