ipfs的源码解读以及原理介绍

简介 最近有人捅了马蜂窝整个互联网圈子里一时间热闹无比。数据造假与版权侵犯让相当一部分人咬牙切齿又无可奈何。更可恨又无奈的是看着关注度与热度的不断升级相关方立马整理服务器清楚记录毁...

简介

最近有人捅了马蜂窝整个互联网圈子里一时间热闹无比。数据造假与版权侵犯让相当一部分人咬牙切齿又无可奈何。更可恨又无奈的是看着关注度与热度的不断升级相关方立马整理服务器清楚记录毁尸灭迹。

难道这就是互联网技术应该有的样子吗 我想一定不是。随着此类时间的不断发生越来越多的技术geek站出来开始做一些不同的事情开始思考如何从技术上根本上解决此类问题而不是依赖媒体和良心。 这其中IPFS不仅是先驱也是佼佼者。

加入IPFS网络

在之前我们介绍了ipfs init也就是ipfs初始化。通过初始化我们创建了一个本地的离线IPFS节点在这个离线节点中我们也可以做一些简单的操作。比如添加文件、查看文件内容、查看版本、查看配置等。

IPFS是分布式的全球存储网络。也就是说可以随时跟全球的计算机进行通信并做数据交换。显而易见离线的情况下肯定无法跟其他节点进行通信对不对 所以需要加入到IPFS网络中。在IPFS中要加入到网络中相当简单只需要运行一个简单的命令就能实现。没错它就是强大的ipfs daemon 命令。
简单执行ipfs daemon会占用一个终端由于后续很多操作都是需要ipfs在线模式的所以这里介绍一个简单的命令让ipfs在后台运行。nohup ipfs daemon & 运行这个命令ipfs会在后台运行。这样我们就连接到了ipfs全球网络。

我们可以做一个简单的验证打开浏览器输入

  • 127.0.0.1:5001/ipfs/webui

或者终端输入如下命令

  • ipfs swarm peers
    

我想肯定有人想问它是如何连接的原理是什么

IPFS Daemon源码解析

接下来我们来看看ipfs daemon的源码看看其究竟干了什么事情

如下图所示找到对应的代码文件打开

Debug配置文件

后面我们会debug所以修改debug配置文件。

  • {
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "auto", "remotePath": "", "port": 2345, "host": "127.0.0.1", "program": "${fileDirname}", "env": {}, "args": [ "daemon"
    ], "showLog": true
    } ] }

在源码里面有一段英文的LongDescription, 建议大家仔细阅读下 此外也可以在终端执行命令ipfs daemon --help 来查看。

查看IPFS源码

  • // ============ 检查是否已经初始化   【1】
    initialize, _ := req.Options[initOptionKwd].(bool) ... // 打开初始化跟目录 /.ipfs 【2】
    repo, err := fsrepo.Open(cctx.ConfigRoot) ... // ============ 读取配置 【3】
    cfg, err := cctx.GetConfig() ... // ============ 根据配置生成一个新节点 【4】
    node, err := core.NewNode(req.Context, ncfg) if err != nil { log.Error("error from node construction: ", err) re.SetError(err, cmdkit.ErrNormal) return
    } node.SetLocal(false) if node.PNetFingerprint != nil { fmt.Println("Swarm is limited to private network of peers with the swarm key") fmt.Printf("Swarm key fingerprint: %x\n", node.PNetFingerprint) } // ============ 连接到IPFS网络 【5】
    printSwarmAddrs(node) // ============ 开启IPFS API服务 【6】
    // construct api endpoint - every time
    apiErrc, err := serveHTTPApi(req, cctx) if err != nil { re.SetError(err, cmdkit.ErrNormal) return
    } // ============= 开启Gateway网关服务 【7】
    // construct http gateway - if it is set in the config
    var gwErrc <-chan error if len(cfg.Addresses.Gateway) > 0 { var err error gwErrc, err = serveHTTPGateway(req, cctx) if err != nil { re.SetError(err, cmdkit.ErrNormal) return
    } } // ============= 输出IPFS Daemon ready 【8】
    fmt.Printf("Daemon is ready\n")

以上从【1】- 【8】是整个IPFS Daemon的启动过程。

  • 检查ipfs是否已经初始化如果没有初始化会以默认配置文件初始化。
  • 打开初始化的仓库也就是/.ipfs 目录
  • 读取配置文件
  • 根据配置文件生成一个新的ipfs节点
  • 连接到IPFS网络
    在IPFS中网络层是使用的P2P对等网络一个新的节点要连接到网络中时需要知道连接的默认节点。那么在运行ipfs daemon的时候其是如何知道其他节点并进行连接的

其实在ipfs init 也就是初始化的过程中ipfs已经添加了默认的节点在配置文件中可以用命令ipfs config Bootstrap 来查看。 如图所示:

正因此我们运行的本地节点就可以找到IPFS网络并连接到IPFS全球网络中与其他节点进行通信。既然说到这里我们能不能不让我们的节点连接到主网仅仅只是在自己的私有网络中通信呢 答案当然是可以的关于私有IPFS网络的搭建我放在下一节专门探讨下。

  • 开启API服务 
    在IPFS中很多通信都是通过API来进行的。API的会在本地的5001端口运行。unix下可以通过如下命令查看。
  •  lsof -i tcp:5001

或者使用telnet来测试

  • telnet localhost 5001
  • Trying ::1...
    telnet: connect to address ::1: Connection refused
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    
  • 开启Gateway网关
    通过gateway网关我们可以像访问普通的互联网网站一样来访问IPFS上的文件或者网站。可以说正是因为gateway网关的存在让用户感觉IPFS跟传统的web服务很相似在入口处没有引入过多新的概念或者变化。gateway将后面复杂的IPFS进行了封装并对普通用户透明是IPFS中至关重要的一部分。关于IPFS Gateway的使用以及如何利用IPFS替换Samba等文件共享服务器在局域网内做文件共享服务将在后续的使用案例中探讨。

  • 启动完成
    到这里整个IPFS的启动就算是完成了当然在这中间还有一些细节我这里没有列出来。大家可以自己在阅读源码梳理下整个过程。

关于本地节点的一些地址以及端口信息如果忘记可以通过配置文件来查看。

  • ipfs config Addresses
    
  • {
    "API": "/ip4/127.0.0.1/tcp/5001",
    "Announce": [],
    "Gateway": "/ip4/127.0.0.1/tcp/8080",
    "NoAnnounce": [],
    "Swarm": [
    "/ip4/0.0.0.0/tcp/4001",
    "/ip6/::/tcp/4001"
    ] }

当然上面的值是可以根据自己的意愿来修改的具体修改的方式在源码里面关于命令的那一段长描述里面可以看到。感兴趣的可以读读。

总结

在本篇中介绍了ipfs daemon, 在这里我通过八个步骤来阐述了整个启动过程。但大家都可以看出来在源代码的解析过程中并没有深入进去。主要原因是一深入进去内容就太多了。 由于 IPFS是p2p网络。所以在网络部分在往下跟就会到libp2p也就是IPFS的网络层。 所以这里不深入等到后面分析了libp2p之后在过来看这部分内容相信收获会更多。

  • 发表于 2019-10-31 16:03
  • 阅读 ( 5819 )
  • 分类:默认分类

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
威猛的小站长

124 篇文章

作家榜 »

  1. 威猛的小站长 124 文章
  2. Jonny 65 文章
  3. 江南烟雨 36 文章
  4. - Nightmare 33 文章
  5. doublechina 31 文章
  6. HJ社区-肖峰 29 文章
  7. 伪摄影 22 文章
  8. Alan 14 文章