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

在上一篇文章中,我们指出在 builder/builder.js 文件中调用调用 pull 函数进行保存文件,这篇文章我们就来详细研究下这个过程。
1.设置源流为 file.content。
2.调用 chunker 流,对保存的内容进行分块。通过前面的文章,我们知道 chunker 流的默认实现为 chunker/fixed-size.js,它是一个 pull-through 流。这个流提供了两个函数,分别称为 onData 和 onEnd,前者在每次数据到来时调用,后者当数据发送完成时调用。fixed-size.js 在初始化时,根据选项中指定的 maxChunkSize 属性设置每一个区块的大小。下面,我们来看下它的在它的 onData 和 onEnd 两个方法。
onData 函数处理如下:
每次收到数据之后就保存在 BufferList 中,同时把当前数据长度也加上读取到数据的长度。bl.append(buffer) currentLength += buffer.length
如果当前数据长度大于等于规定的区块大小时,那么就进行下面的循环处理,直到当前数据长度小于规定的区块大小。
从缓冲列表中取得规定的区块大小数据到队列中。
this.queue(bl.slice(0, maxSize))
如果缓冲列表的长度刚好等于规定的区块大小,那么重新一个新的缓冲区列表,并将当前数据长度设置为 0;否则,生成一个新的缓冲区列表,并从老缓冲区中区块大小处把数据读取到新的缓冲区列表中(0 到区块大小处的数据已经在上面读取过),同时设置其为老的缓冲区列表,并更新当前数据长度设减去前一步读取到区块大小长度,从而更缓冲区列表及其长度。
if (maxSize === bl.length) {
  bl = new BufferList()
  currentLength = 0
} else {
  const newBl = new BufferList()
  newBl.append(bl.shallowSlice(maxSize))
  bl = newBl
  currentLength -= maxSize
}
看完了 onData 方法,接下来我们再看 onEnd 函数,这个函数首先检查缓冲列表中是否有数据(少于区块大小),如果有则同样保存到队列中。
  if (currentLength) {
    this.queue(bl.slice(0, currentLength))
    emitted = true
  }
  if (!emitted) {
    this.queue(Buffer.alloc(0))
  }
  this.queue(null)
以上就 IPFS 中固定分块的逻辑,其实也很简单。
3.调用 paraMap 流(类型为 pull-paramap),对每一个分块进行处理。当前面的流对文件进行分块之后,每一个分区都会下一个流进行拉取,在这里就是这个函数,我们看下这个函数是如何处理每一个分块的。它的主体是一个 waterfall 函数,这个函数正如其名字所示,每一个函数都进行各自的处理,并把结果传递给下一个函数,我们看下它的几个处理函数。
首先,我们来看第一个函数,它主要用来创建 DAGNode,并把相关信息传递给第二个函数,它的执行逻辑如下:
生成一个 UnixFS 对象。
const file = new UnixFS(options.leafType, buffer)
UnixFS 是一种基于协议缓冲区的格式,用于描述IPFS中的文件,目录和符号链接。目前它支持:原始数据、目录、文件、原数据、符号连接、hamt-sharded-directory 等几种类型。
leafType 默认为文件,在文件初始化时通过默认选项 defaultOptions 指定的。
调用 DAGNode.create 静态方法,创建 DAGNode 节点,成功之后,把相信信息传递下一个函数。
DAGNode.create(file.marshal(), [], (err, node) => {
  if (err) {
    return cb(err)
  }
  cb(null, {
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值