IPFS基础篇之dags、objects、blocks

A peer-to-peer hypermedia protocol
to make the web faster, safer, and more open.

文章参照官网例子

Blocks理解

观察ipfs add 命令会看到这样一个描述

Adds contents of to ipfs. Use -r to add directories.
Note that directories are added recursively, to form the ipfs
MerkleDAG.

add 命令将文件或者目录加入到ipfs中,形成了一个Merke DAG(directed acyclic graph),它遵循unixfs 的数据格式(protobuf),格式内容如下:

message Data {
    enum DataType {
        Raw = 0;
        Directory = 1;
        File = 2;
        Metadata = 3;
        Symlink = 4;
        HAMTShard = 5;
    }

    required DataType Type = 1;
    optional bytes Data = 2;
    optional uint64 filesize = 3;
    repeated uint64 blocksizes = 4;

    optional uint64 hashType = 5;
    optional uint64 fanout = 6;
}

当文件的内容超过256k或者add的是一个目录时,文件将会被拆分成block存储,并使用link nodes重排列成类似tree的一种结构。add命令返回的hash值其实是形成的DAG的root的hash值。当使用ipfs ls命令查看该hash值时,可以看到它包含的block。

举例说明:

  1. 生成文件
> dd if=/dev/zero of=test bs=258k count=1
1+0 records in
1+0 records out
264192 bytes transferred in 0.000474 secs (557395152 bytes/sec)

这将会生成一个名称为test,大小为258k的文件

  1. 添加到ipfs
> ipfs add test
added QmbZHydHNsDVdQJ5hYbCGAJCUPLF8vLdQDgSdxgHNjVKNY test
  1. 查看
> ipfs ls QmbZHydHNsDVdQJ5hYbCGAJCUPLF8vLdQDgSdxgHNjVKNY
QmRk1rduJvo5DfEYAaLobS2za9tDszk35hzaNSDCJ74DA7 262158
Qmcpc1Kk8Hhj3rVSnZGSrxzP4Fcp48cEARxMXxkHryUNJw 2059

可以看到,该文件被拆分成两个block,并且给出了两个块分别的大小

Block如何操作

最好是别使用ipfs cat查看block对应的hash值 (:oops),因为这会在你的控制台打印出一堆二进制数据。。
可以使用stat查看每个hash值对应block的大小,该大小不会包含子块的

> ipfs block stat QmbZHydHNsDVdQJ5hYbCGAJCUPLF8vLdQDgSdxgHNjVKNY
Key: QmbZHydHNsDVdQJ5hYbCGAJCUPLF8vLdQDgSdxgHNjVKNY
Size: 102

Blocks 与 Objects

在IPFS中,所谓的block指的是一块单独的数据单元,通过hash值引用。block可以是任何数据的排序,数据的组成顺序与其无关。而对于object来说,它指的是遵循了Merke DAG protobuf 数据格式的block,它是可以通过ipfs object 命令反序列化以及重组成的。任何给定的hash代表的是一个object或者block

创建一个block

创建自己的block非常简单,使用命令

> echo "block test " | ipfs block put 
QmWJiHNL2Lu1nMQW61cwhweBaEpCoiETbL53CjxEyZsHov
> ipfs block get QmWJiHNL2Lu1nMQW61cwhweBaEpCoiETbL53CjxEyZsHov
block test

要注意的是,自己创建block不能用ipfs cat命令查看,因为ipfs cat查看的是基于unixfs data 格式的数据

你可能感兴趣的:(IPFS基础篇之dags、objects、blocks)