IPFS(三)源码解读之-add

本文详细解析了IPFS中`add`命令的实现过程,包括如何将文件通过块的方式存储到本地blockstore,以及命令行工具`core/commands/add.go`的主要功能。在`addAllAndPin`方法中遍历文件路径,读取内容并调用`fileAdder.AddFile(file)`进行上传。整个过程中,文件并未加密,而是以原文形式存储。同时,文章还介绍了`AddCmd`的配置选项,如深度限制、输出选项、块生成策略等。
摘要由CSDN通过智能技术生成

Add 所作的事其实就是将文件传到IPFS上,通过块的方式存到本地blockstore中。

在ipfs的安装目录的blocks目录下保存了当前本地节点所存储的所有的块数据,具体有没有对数据加密,我也没有仔细去看

Ps:我去看了一下,并没有加密,原文存储,这里需要批评一下…

首先,add的入口在core/commands/add.go文件,这是一个命令行工具,主要作用是提供交互以及命令的一下定义和相关配置对应的不同功能的解析,这里真的只是解析,然后保存到AddedObject这个对象中,这个对象的作用就是当上传是的关于文件的一下配置信息,和一些操作。

type AddedObject struct {
   
   Name        string
   Hash        string `json:",omitempty"`
   Bytes       int64  `json:",omitempty"`
   Size        string `json:",omitempty"`
   VID         string `json:",omitempty"`
   VersionInfo *utils.VersionInfo
}

然后,通过下面这种看起来很奇怪的方式去上传文件的数据量,具体后面的块生成部分我们不去探讨,这里只看是怎么从本地读取到节点,并将这个流送入块中的

其实下面做的事非常简单,先定义好addAllAndPin这个方法,这个方法最主要的作用就是对文件路径进行遍历,也就是我们在命令行输入的路径,读取文件内容,通过fileAdder.AddFile(file)将文件写入到下一步

而下面的协程用于监听上传是否完成,是否有错误。并将错误信息丢入errCh管道,并且关闭output这个管道,

作用在于这两个管道被用于向控制台输出。output是输出上传情况,上传完成后的块hash等,errCh就是错误信息

addAllAndPin := func(f files.File) error {
   
   // Iterate over each top-level file and add individually. Otherwise the
   // single files.File f is treated as a directory, affecting hidden file
   // semantics.
   for {
   
      file, err := f.NextFile()
      if err == io.EOF {
   
         // Finished the list of files.
         break
      } else if err != nil {
   
         return err
      }
      if err := fileAdder.AddFile(file); err != nil {
   
         return err
      }
   }

   // copy intermediary nodes from editor to our actual dagservice
   _, err := fileAdder.Finalize()
   if err != nil {
   
      return err
   }

   if hash {
   
      return nil
   }

   return fileAdder.PinRoot()
}

errCh := make(chan error)
go func() {
   
   var err error
   defer func() {
    errCh <- e
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值