zoukankan      html  css  js  c++  java
  • IPFS初窥

    虽然区块链有很多令人兴奋的特性,但是也有其固有的缺点。比如,文件或者长度较长的文本信息就不适合存储在链上。那么如何解决这个缺点呢?一个解决方案就是IPFS(Interplanetary File System)——星际文件系统。

    本文作为简介篇不打算涉及网络及数据结构相关知识(比如什么是协议、什么是树、什么是图……),不过我相信各位看官既然能找到本文网络基础应该不是问题。

    为什么需要IPFS?

    说这个之前,我们看看现在互联网基石 —— HTTP协议,网址(URL)由几部份构成:

    1. 协议
    2. 服务器地址(IP地址,或者域名)
    3. 端口
    4. 路径
    5. 参数

    HTTP是路径(位置)导向的、中心化的,而IPFS则是资源导向的、分布式的。以网站举例,如果某个网站服务器关闭,那么如果没有其他三方对其进行过快照的话,基本就是再也看不到上面的内容了。而IPFS则不然,只要IPFS网络中有对应的副本,则不会因为某个”人”删除资源而导致无法访问。(单点问题)

    老司机应该觉得眼熟,这不就和BT种子类似么?是的,IPFS结合了Git版本系统、Bittorrent、DHT等技术。也正因如此,IPFS刚好可以用来弥补区块链不适合存储文件或长文本这个缺陷。

    基于路径导向还会导致某些安全问题,假定你需要下载http://www.aa.com/file.zip这个文件,如果这个文件被替换成木马病毒一类的,客户端是无法判断数据是否被更改的。换言之,客户端只知道”在哪里”,而不知道”是什么”。

    此外,随着媒体类资源如音频、视频越发流行,带宽资源也越发成为限制HTTP传输速度的瓶颈。而如果你需要的资源在IPFS存在,则会自动选择一个最近的下载,传输速度大大提升。

    什么是IPFS?

    官网原话:

    IPFS aims to replace HTTP and build a better web for all of us.

    翻译过来就是:IPFS是来干掉现有HTTP协议、带领农奴翻身的。所以咧,官网就被”墙”了。但从技术角度,更好的解释在白皮书中。

    白皮书标题就3点:

    • 内容寻址:通过文件内容生成唯一哈希值来标识文件,而不是通过文件保存位置来标识。相同内容的文件在系统中只会存在一份,节约存储空间。
    • 版本化:可追溯文件修改历史。(参照git、svn)
    • 点对点文件系统:P2P保存各种各样类型的数据。

    涉及的技术点有5个:

    1. 分布式哈希表(DHT)
    2. 块交换
    3. Merkle DAG
    4. 版本控制系统
    5. 自验证文件系统(SFS)

    上面的技术点基本每个都能写一系列文章,这里就简单说一下,如果有时间以后再补充完善。(没错,我又开始挖坑了!)

    DHT被广泛用于维护协调p2p网络的元数据,比如BitTorrent中的MainlineDHT就追踪了torrent网络中节点的集合。而IPFS中则是结合了Coral DSHTS/Kademlia DHT,这两个都是Kademlia DHT的扩展。(再简单说就是用来查找节点的。)

    块交换,IPFS在BitTorrent的基础上实现了更通用的版本——BitSwap,这也是Filecoin的基础。

    Merkle DAG,如果涉及过轻钱包应用的应该知道Merkle Tree,在Merkle Tree中每个父节点的值都是其子节点值的哈希。Merkle DAG则是Merkle Tree和有向无环图(DAG)的结合体,广义上所有数据都在Merkle DAG进行建模,这是保证数据正确、安全传输的关键点。

    版本控制,这个不用多说了吧?

    自验证文件系统(Self-certifying File System,SFS)是一种不需要特殊权限的分布式文件系统,因为每个用户上传是生成的文件名已经是经过其私钥签名过的了。在这个基础上,又可以引出星际命名空间(InterPlanetary Name Space,IPNS)的概念。之前说过IPFS上的文件哈希后都是唯一识别的,推广开来,每个节点也有公钥、私钥和节点ID,节点ID是其公钥的哈希值,节点可以使用私钥来对其发布的数据签名,其他用户检索时,可以检查发送者的公钥来验证数据真实性。

    如何使用IPFS?

    首先下载go-ipfs,我这里直接使用linux版本的,解压后执行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    go-ipfs❯ sudo sh install.sh
    [sudo] password for roy:
    Moved ./ipfs to /usr/local/bin

    go-ipfs❯ ipfs init
    initializing IPFS node at /home/roy/.ipfs
    generating 2048-bit RSA keypair...done
    peer identity: QmcWR5hMnF7LNqNJBC6fxSBdXRUBgJEnXca3MHWN8kpdXC
    to get started, enter:

    ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

    go-ipfs❯ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
    Hello and Welcome to IPFS!

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

    If you 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
    ./ 大专栏  IPFS初窥security-notes

    建议使用提示中的哦命令看看quick-start,常用操作都在里面了。

    然后启动ipfs服务:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    go-ipfs❯ 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/172.17.0.1/tcp/4001
    Swarm listening on /ip4/172.18.0.1/tcp/4001
    Swarm listening on /ip4/192.168.1.104/tcp/4001
    Swarm listening on /ip4/192.168.124.1/tcp/4001
    Swarm listening on /ip6/::1/tcp/4001
    Swarm listening on /p2p-circuit/ipfs/QmcWR5hMnF7LNqNJBC6fxSBdXRUBgJEnXca3MHWN8kpdXC
    Swarm announcing /ip4/100.64.109.213/tcp/12182
    Swarm announcing /ip4/127.0.0.1/tcp/4001
    Swarm announcing /ip4/172.17.0.1/tcp/4001
    Swarm announcing /ip4/172.18.0.1/tcp/4001
    Swarm announcing /ip4/192.168.1.104/tcp/4001
    Swarm announcing /ip4/192.168.124.1/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

    然后访问http://localhost:5001/webui可以查看系统信息、创建文件夹、添加文件等。

    添加个文件:

    1
    2
    3
    4
    5
    ~ » mkdir roy_test
    ~ » echo "www.hi-roy.com" > roy_test/roy.txt
    ~ » ipfs add -r roy_test
    added QmTbyi4XTyG8PrJo7KDcexNGxBJNKfJCwjfmY4HmtENqYd roy_test/roy.txt
    added QmUK6CHzQyn2CWpHumysxhQXjzi4dA373DYLD2zgj8n7kx roy_test

    然后测试下文件是否添加成功:

    1
    2
    3
    4
    5
    ipfs ls QmUK6CHzQyn2CWpHumysxhQXjzi4dA373DYLD2zgj8n7kx
    QmTbyi4XTyG8PrJo7KDcexNGxBJNKfJCwjfmY4HmtENqYd 23 roy.txt

    ipfs cat /ipfs/QmTbyi4XTyG8PrJo7KDcexNGxBJNKfJCwjfmY4HmtENqYd
    www.hi-roy.com

    也可以通过本地网关访问http://localhost:8080/ipfs/QmTbyi4XTyG8PrJo7KDcexNGxBJNKfJCwjfmY4HmtENqYd

    然后我们来修改一下文件:

    1
    2
    3
    4
    echo "www.hi-roy.com" >> roy_test/roy.txt
    echo "www.hi-roy.com" >> roy_test/roy.txt
    ipfs add roy_test/roy.txt
    added QmUcwEGLBhLKYG7X1DrbMbbSKSJ3GbDHWibymwXqUG1PCK roy.txt

    注意,修改文件后哈希值发生了变化,原来的文件依然存在。但每次更新文件都有一个新哈希也太麻烦了,这时可以使用上面说的IPNS了:

    1
    2
    ipfs name publish QmUK6CHzQyn2CWpHumysxhQXjzi4dA373DYLD2zgj8n7kx
    Published to QmcWR5hMnF7LNqNJBC6fxSBdXRUBgJEnXca3MHWN8kpdXC: /ipfs/QmUK6CHzQyn2CWpHumysxhQXjzi4dA373DYLD2zgj8n7kx

    这里我把文件夹的哈希值作为根发布,然后就可以使用ipns查看文件了:

    1
    2
    3
    4
    5
    ipfs cat /ipns/QmcWR5hMnF7LNqNJBC6fxSBdXRUBgJEnXca3MHWN8kpdXC/roy.txt

    www.hi-roy.com
    www.hi-roy.com
    www.hi-roy.com

    以后更新文件后再publish就可以了。不过 使用ipns会很慢

    使用IPFS时应该注意?

    永久性(Permanence)不等同于持久性(Persistence)。

    Objects are permanent。

    也就是说,你在IPFS网络中上传了某个文件,指向你这个文件的链接是永久不变的,但如果每个节点都觉得这个文件没什么价值而将其删除,那么这个文件是会”消失”的。

    IPFS的应用领域?

    白皮书3.8节提到了12个应用场景:

    1. 作为全球文件系统挂载到/ipfs/ipns下。
    2. 作为个人同步文件夹自动控制版本、推送、备份。
    3. 作为加密文件或者数据共享系统。
    4. 作为所有软件的版本控制器。
    5. 作为虚拟机的根文件系统。
    6. 作为VM的引导文件。
    7. 作为数据库:程序可以直接写入Merkle DAG数据模型,并获得IPFS提供的版本控制、缓存、分发功能。
    8. 作为一个加密的通信平台。
    9. 作为一个大文件完整性校验的CDN平台(不需要SSL)。
    10. 作为加密CDN。
    11. 作为网站CDN。
    12. 作为一个永远不会消失的网站。

    利用IPFS的项目比较多,但大多处于探索阶段,杀手级的目前还没出现。这里给大家介绍我认为比较有意思的:

    1. akasha,号称下一代社交网络,测试玩的话chrome浏览器可以装个MetaMask插件,并将网络设置为Rinkeby Test Network
    2. 基于IPFS的维基百科,维基百科镜像。
    3. livepeer,去中心化流媒体平台,可以贡献自己的带宽获取token。

    应用

    IPFS的缺点?

    目前觉得缺点有2个:

    1. 域名不友好,比如ipfs.io/ipns/Qmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/。当然可以引入域名系统DNS,但又会面临现有DNS系统的各种缺陷,比如域名污染等。

    2. 数据节点没动力维持网络数据的长期备份,如果所有的数据节点都将某份数据清除来节省空间,理论上这个文件最终会”消失”。为了缓解这个问题,引入了FileCoin来为IPFS添加经济激励,毕竟有句话叫做”无利不起早”么。

    写到这让我想起了《人月神话》中的经典台词:

    没有银弹。

  • 相关阅读:
    VMware WorkStation 用 VMTools 官方下载地址 windows-vmtools tools-windows
    LeetCode Golang 9.回文数
    CentOS6.5中配置Rabbitmq3.6.6集群方案
    python之lambda、filter、map、reduce的用法讲解
    跨主机容器之间通信实现方式:etcd+flanned
    mongo3.4安装
    centos 时区的更改 UTC TO CST
    Elasticsearch5安装
    docker1.*.*版本安装
    使用weave来实现多宿主机中的docker容器之间通信
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12256156.html
Copyright © 2011-2022 走看看