【IPFS学习笔记】大数据搬上区块链—Ubuntu部署IPFS实践

一、IPFS简介

IPFS(InterPlanetary File System)是一个点对点的分布式超媒体分发协议,它整合了过去几年最好的分布式系统思路,为所有人提供全球统一的可寻址空间,包括Git、自证明文件系统SFS、BitTorrent和DHT,同时也被认为是最有可能取代HTTP的新一代互联网协议。

IPFS用基于内容的寻址替代传统的基于域名的寻址,用户不需要关心服务器的位置,不用考虑文件存储的名字和路径。我们将一个文件放到IPFS节点中,将会得到基于其内容计算出的唯一加密哈希值。哈希值直接反映文件的内容,哪怕只修改1比特,哈希值也会完全不同。当IPFS被请求一个文件哈希时,它会使用一个分布式哈希表找到文件所在的节点,取回文件并验证文件数据。

IPFS是通用目的的基础架构,基本没有存储上的限制。大文件会被切分成小的分块,下载的时候可以从多个服务器同时获取。IPFS的网络是不固定的、细粒度的、分布式的网络,可以很好的适应内容分发网络的要求。这样的设计可以很好的共享各类数据,包括图像、视频流、分布式数据库、整个操作系统、模块链、8英寸软盘的备份,还有静态网站。

IPFS提供了一个友好的WEB访问接口,用户可以通过http://ipfs.io/ipfs/哈希串(默克尔链接)获取IPFS网络中的内容,也许在不久的将来,IPFS协议将会彻底替代传统的HTTP协议。

二、IPFS本地环境安装

2.1、下载安装包

打开https://dist.ipfs.io/#go-ipfs,页面会自动根据你的操作系统提供适合的下载安装包,点击下载按钮即可。
笔者是在Ubuntu下安装,所以下载go-ipfs的地址为:https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz(目录为:https://dist.ipfs.io/go-ipfs/,可以下面查找相关版本)
通过wget命令下载报错,提示拒绝连接,接下来在浏览器中手工下载。

2.2、安装

我们将压缩包上传到家目录,如:/home/simon/,然后解压。

$ tar xvfz go-ipfs_v0.4.15_linux-amd64.tar.gz
go-ipfs/build-log
go-ipfs/install.sh
go-ipfs/ipfs
go-ipfs/LICENSE
go-ipfs/README.md

$ cd go-ipfs
$ sudo mv ipfs /usr/local/bin/ipfs
$ ipfs version #查看版本
ipfs version 0.4.15
$ 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
  
  Use 'ipfs <command> --help' to learn more about each command.
  
  ipfs uses a repository in the local file system. By default, the repo is
  located at ~/.ipfs. To change the repo location, set the $IPFS_PATH
  environment variable:
  
    export IPFS_PATH=/path/to/ipfsrepo
  
  EXIT STATUS
  
  The CLI will exit with one of the following values:
  
  0     Successful execution.
  1     Failed executions.

看到版本号或帮助信息了,说明我们已经安装成功了。

三、项目配置

3.1、创建ipfs节点

为了运行项目,我们需要通过在本地建立一个IPFS节点。

$ ipfs init

initializing IPFS node at /home/simon/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR
to get started, enter:

    ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme #这一行记录下来,稍后我们还会用到

$ cd /home/simon/
$ ll -a
drwxrwxr-x  5 simon simon     4096 5月  15 18:39 .ipfs/ #多出了这样一个文件夹
#......其它文件,略

ipfs在家目录/home/simon/下创建一个.ipfs文件夹,通过ll -a可以查看到。

3.2、修改节点默认存储空间

假设我们现在需要将本地节点的可使用硬盘容量设置成20G,

$ cd /home/simon/.ipfs
$ export EDITOR=/usr/bin/vim  #定义默认编辑器,也可以修改成/usr/bin/vi
$ ipfs config edit #修改ipfs配置文件

搜索StorageMax关键词,定位到第7行,将默认的10GB修改成20GB,保存即可。

3.3、查看节点id
$ ipfs id
{
    "ID": "QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR",
    "PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCkqFba44pvyyFdUlaHaSUeggzP3jCJIuk13fvCpV4F132M0hTpP9ZX7JvvtBO4KY68Y+TshEXJTtVX8dApQNemhitmleiOs+ADcONLJ4y2l+bydraThh+XEq1XdfpjIUL4Ud0tm7Z47zdQFilzmZu5CFfKWt7ad9Ua8HKilasn1Ic6VLmKcNaK5+0YA58tcn8EJcudmr8orwZXKRNl8InS4d2eawpU2xSv9PUFVEb4UGheg/6EghNDjABcWBR6Z6RyRvGYU5q770DdObmRJTf1PJmyIX4yxHL2WWCaKlPEUXNQROV/Pb+3Mu0UsJGMriAfq40L8nZkF0egqUQB0eCvAgMBAAE=",
    "Addresses": null,
    "AgentVersion": "go-ipfs/0.4.15/",
    "ProtocolVersion": "ipfs/0.1.0"
}

QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR即我们的节点ID,与我们的身份证一样,表示节点在ipfs网络中的唯一标识。

3.4 新建测试文件并添加到本地节点

3.4.1 文件存储测试
在家目录/home/simon/test下新建一个文件文件file.txt

$ cd ~
$ mkdir test
$ cd test
$ vim file.txt
#输入
Hello,欧阳!
#保存
$ ipfs add file.txt #将文件添加到本地节点
added QmYRn59kceZAYG7ARsgCFwNBiwqoHwiw7idGsonAAgkiJC file.txt
$ ipfs cat QmYRn59kceZAYG7ARsgCFwNBiwqoHwiw7idGsonAAgkiJC #查看文件写入情况
Hello,欧阳!

可以看到我们已经将 file.txt 加入到本地节点中,一会在我们启动节点服务器并将本地节点内容同步到IPFS网络上时,便可以通过https://ipfs.io/ipfs/QmYRn59kceZAYG7ARsgCFwNBiwqoHwiw7idGsonAAgkiJC进行访问。

3.4.2 图片存储测试
如果我们需要存储图片咋办?我们来上传一张图片colorbay.jpg/home/simon/test目录下,

$ ipfs add ./colorbay.jpg #将当前目录下的图片添加到本地节点
added QmakjbW9kUdSnwQCeTiGDvXErhPYi6kNNqaSdGsubz6Tsk colorbay.jpg

可以看到我们的图片已经生成了哈希值,同样的,一会在我们启动节点服务器并将本地节点内容同步到IPFS网络上时,便可以通过https://ipfs.io/ipfs/QmakjbW9kUdSnwQCeTiGDvXErhPYi6kNNqaSdGsubz6Tsk进行访问。(其他文件格式的测试,略)

如果我们要对file.txtcolorbay.jpg的内容做了修改咋办?
答:那我们可以在本地修改好文件,重新执行ipfs add 文件名,生成新的哈希值即可。

3.5、启动节点服务器
$ ipfs daemon

Initializing daemon...
Successfully raised file descriptor limit to 2048.
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.60.147/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit/ipfs/QmQSh8D1aV5ASF3b1mFChpeCyH4QB1EdzDm8pZJ2U1GKSR
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.60.147/tcp/4001
Swarm announcing /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网络中,稍后我们可以通过上面的文件网址在浏览器中进行访问了。

如果打不开,可以耐心等待一会,多刷新几次,因为节点同步数据需要一点时间。

3.6、跨域资源共享CORS配置

为了后续开发方便,我们还需要对跨域资源共享(CORS)进行配置,将3.5小节中的窗口按ctrl + c 退出 ipfs,然后依次运行下面的命令进行跨域配置即可。

$ 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"]'
3.7、验证

再次启动节点服务器,

$ ipfs daemon

新开一个终端窗口,

$ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║     ██║     ███████║
╚═╝╚═╝     ╚═╝     ╚══════╝

If you're seeing this, you have successfully installed
IPFS 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

在Ubuntu中,在浏览器中输入下面的网址http://localhost:5001/webui,可以看到我们本地的节点信息,以及全球的节点信息,也可以查询到时我们上面文件的哈希对应的文件内容。

总结

有了IPFS这个协议,弥补了区块链只能携带少量数据的缺陷。如果我们需要把大文件上到区块链中,那我们可以先将文件上传到IPFS中生成一个唯一标识(哈希),再将这个唯一标识写入区块链中,这个方案让下一代互联网实现价值传递变得无限可能!

学习阶段,文章有误之处,欢迎指正!

本文学习内容参考孔壹学院视频教程,文字原创整理,转载请注明出处:https://www.jianshu.com/p/c436e90d4354
欢迎加微信xinmin-yang与我一起学习交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 在B站看了黎跃春老师的教学视频,结合网上的资源和自己的操作整理的笔记,知识无价,感谢分享! 1.IPFS: IPF...
    花爬满篱笆阅读 2,242评论 1 1
  • 一、IPFS简介 IPFS(InterPlanetary File System)是一个点对点的分布式超媒体分发协...
    我是李小胖阅读 2,806评论 0 3
  • 1 关于ipfs 官方网站:https://ipfs.io/ github: https://github.com...
    foochane阅读 3,691评论 0 1
  • 2018年,最火爆且值得期待的区块链项目莫过于EOS和IPFS。EOS在最近写的一篇《EOS简介与环境搭建》有介绍...
    良__阅读 42,577评论 16 82
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,401评论 16 21