第6章 【IPFS一问一答】IPFS的版本控制系统是怎样的?

6 IPFS的版本控制系统是怎样的?

IPFS的文件版本控制系统是基于Git创建的。我们先分析下Git。

6.1 IPFS之技术背景Git版本控制系统

参考视频 https://ihower.tw/git/index.html

git学习的概念:

  1. 工作区:当前你编辑文件的区域就是工作区,比如你的目录是./gitworkshop,那么这个目录下的内容就是你的工作区。
  2. 版本库:记录了你工程某次提交的完整状态和内容,这意味着你的数据永远不会丢失。
  3. 暂存区:暂存区在版本库中,git add之后的数据会先存储到这里,等git commit之后,数据移到分支下,并清空暂存区。
  4. git有四大物件,分别是blob,tree,commit和refs(或者叫tag)。 4.1 blob blob是对文件内容的保存。当git add某个文件时,数据会保存到版本库中的objects中,如下图中的61,就是我刚添加的文件之后产生的blob。

4.2 tree git的数据存储都是以tree的形式存储的。如下图: 4.3 commit 当执行commit后,暂存区的内容会被提交到git版本库,形成最新版本,并进行快照。如下图,最终stage中的数据被提交到master分支下。

4.4 refs refs是References的缩写。引用是变量名(名字),值指向commit对象,方便追踪代码的变化。如下图,每个版本都有自己的根hash,refs也就是HEAD指向master中的根hash所对应的内容。

git只会对内容有变化的数据进行再存储,未改变的数据不作处理。如下图 分析上图:文件总共包含3个,其中my_dir下的my_file.txt和hello.txt中的内容一样,所以只存储一份。接下来我们修改了my_dir文件夹下的my_file.txt文件。由于内容发生了变化,当commit后,就会产生新的根hash,也就是新的版本内容。

6.2 IPFS版本控制系统

IPFS版本控制几乎和git一样。下图是它的版本库内容。

我们在执行ipfs init时会产生这个./ipfs的隐藏文件,里面的内容就是上图显示的。当添加一个全新的文件内容时,datastore中的有些内容将会发生变化,如版本,ldb,这里主要是树结构的存储发生了变化,除此,新的数据内容将会以碎片的形式被存储在blocks中。在blocks中的数据是没有重复的。

每个block数据对应一个唯一的hash值。

一个目录文件,可能包含多个文件和其他目录文件,被提交后,返回很多hash值,其中最后那个是整个目录文件的hash值,也就是根hash,这个根hash下有树hash和叶子hash。

ipfs修改数据或检索数据都和git一样。