IPFS的文件版本控制系统是基于Git创建的。我们先分析下Git。
参考视频 https://ihower.tw/git/index.html
git学习的概念:
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,也就是新的版本内容。
IPFS版本控制几乎和git一样。下图是它的版本库内容。
我们在执行ipfs init时会产生这个./ipfs的隐藏文件,里面的内容就是上图显示的。当添加一个全新的文件内容时,datastore中的有些内容将会发生变化,如版本,ldb,这里主要是树结构的存储发生了变化,除此,新的数据内容将会以碎片的形式被存储在blocks中。在blocks中的数据是没有重复的。
每个block数据对应一个唯一的hash值。
一个目录文件,可能包含多个文件和其他目录文件,被提交后,返回很多hash值,其中最后那个是整个目录文件的hash值,也就是根hash,这个根hash下有树hash和叶子hash。
ipfs修改数据或检索数据都和git一样。