精通IPFS:IPFS 保存内容之上篇

              本文重点:精通IPFS:IPFS 保存内容之上篇

              经过,我们已经明白了启动过程,从今天起,我会分析一些常见的命令或动作,希望大家喜欢。

              在开始真正分析这些命令/动作之前,先要对pullstream类库进行简单介绍,如果不熟悉这个类库,接下来就没办法进行。

              pull-stream是一个新型的流库,数据被从源中拉取到目的中,它有两种基本类型的流:Source源和Sink接收器。

              除此之外,有两种复合类型的流:Through通道流(比如转换)和Duplex双向流。 source流,这类流返回一个匿名函数,这个匿名函数被称为read函数,它被后续的sink流函数或through流函数调用,从而读取source流中的内容。 sink流,这类流最终都返回内部中的sink函数。

              这类流主要是读取数据,并且对每一个读取到的数据进行处理,如果流已经结束,则调用用户指定结束函数进行处理。

              through流,这类流的函数会返回嵌套的匿名函数,第一层函数接收一个source流的read函数或其他through函数返回的第一层函数为参数,第二层函数接收最终sink提供的写函数或其他through返回的第二层函数,第二层函数内部调用read函数,从而直接或间接从source中取得数据,获取数据后直接或间接调用sink函数,从而把数据写入到目的地址。

              在pull-streams中,数据在流动之前,必须有一个完整的管道,这意味着一个源、零个或多个通道、一个接收器。 但是仍然可以创建一个部分化的管道,这非常有用。

              也就是说可以创建一个完整的管道,比如pull(source,sink)=undefined,也可以部分化的管道,比如pull(through,sink)=sink,或者pull(through1,through2)=through,我们在下面会大量遇到这种部分化的管道。

              今天,我们看下第一个最常用的add命令/动作,我们使用IPFS就是为了把文件保存到IPFS,自然少不了保存操作,add命令就是干这个的,闲话少数,我们来看一段代码。

              const{createNode}=require(ipfs)constnode=createNode({libp2p:{config:{dht:{enabled:true}}}})(ready,async()={constcontent=`我爱黑萤`;constfilesAdded=({content:(content)},{chunkerOptions:{maxChunkSize:1000,avgChunkSize:1000}})(Addedfile:,filesAdded[0].path,filesAdded[0].hash)})这次我们没有完全使用默认配置,开启了DHT,看过我文章的读者都知道DHT是什么东东,这里不详细解释。 在程序中,通过调用IPFS节点的add方法来上传内容,内容可以是文件,也可以是直接的内容,两者有稍微的区别,在讲到相关代码时,我们指出这种区别的,这里我们为了简单直接上传内容为例来说明。

              add方法位于core/components/files-regular/文件中,在《精通IPFS:系统启动之概览》那篇文章中,我们说过,系统会把core/components/files-regular目录下的所有文件扩展到IPFS对象上面,这其中自然包括这里的文件。

              下面,我们直接看这个函数的执行流程。

              这个函数返回了一个内部定义的函数,在这个内部定义的函数中对参数做了一些处理,然后就调用内部的add函数,后者才是主体,它的逻辑如下:。