在昨天的文章里我们讲过了内容寻址HTTP和IPFS 、查找并获取文件和IPFS对象,今天我们继续往下说
原作:An Introduction to IPFS
作者:Dr. Christian Lundkvist, Director of Engineering, andJohn Lilic, ConsenSys Enterprise
翻译:伏神
原文地址:https://medium.com/@ConsenSys/an-introduction-to-ipfs-9bba4860abd0
文件系统(Filesystems)
IPFS可以很容易地表示由文件和目录组成的文件系统。
小文件(Small Files)
IPFS对象表示一个小文件(
我们可以使用命令ipfs add向IPFS添加一个小文件:
chris@chris-VBox:~/tmp$ipfs addtest_dir/hello.txt
added QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoGtest_dir/hello.txt
我们可以使用ipfs cat查看上述IPFS对象的文件内容:
chris@chris-VBox:~/tmp$ipfs catQmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG
Hello World!
查看ipfs对象底层结构可以使用以下命令:
chris@chris-VBox:~/tmp$ ipfs object getQmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG
{“Links”: [],
“Data”: “\u0008\u0002\u0012\rHelloWorld!\n\u0018\r”}
该文件对象的可视化表示如下图:
大文件(Large Files)
大文件(> 256kb)是由一个链接(Link)列表来表示的,列表中每个链接分别指向的是小于256 kB的文件块,于是只需用包含了很小的数据量的对象就能代表一个大文件。指向文件块的链接的name字段为空字符串。
chris@chris-VBox:~/tmp$ipfs add test_dir/bigfile.js
added QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9wtest_dir/bigfile.js
chris@chris-VBox:~/tmp$ipfs object get QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9w
{“Links”: [{
“Name”: “”,
“Hash”: “QmYSK2JyM3RyDyB52caZCTKFR3HKniEcMnNJYdk8DQ6KKB”,
“Size”: 262158},
{“Name”: “”,
“Hash”: “QmQeUqdjFmaxuJewStqCLUoKrR9khqb4Edw9TfRQQdfWz3”,
“Size”: 262158},
{“Name”: “”,
“Hash”: “Qma98bk1hjiRZDTmYmfiUXDj8hXXt7uGA5roU5mfUb3sVG”,
“Size”: 178947}],
“Data”: “\u0008\u0002\u0018*\u0010 \u0010 \n”}
目录结构(Directory Structures)
目录由指向表示文件或其他目录的IPFS对象的链接(Link)列表来表示。链接的name字段是文件和目录的名称。例如,请考虑以下目录结构test_dir目录:
chris@chris-VBox:~/tmp$ls -R test_dir
test_dir:
bigfile.js hello.txtmy_dir
test_dir/my_dir:
my_file.txt testing.txt
test_dir
├─bigfile.js
├─hello.txt
└─my_dir
├─my_file.txt
└─my_file.txt
其中的文件hello.txt和my_file.txt的内容同为字符串Hello World!\n。而文件testing.txt的内容为字符串Testing 123\n
将这个目录结构表示为一个IPFS对象图时,它看起来是这样的:
注意包含Hello World!\n的文件会被的自动去重,文件中的数据仅存储在IPFS中的一个逻辑位置(由其hash寻址)。
IPFS命令行工具可以无缝地跟踪目录链接名称来遍历文件系统:
chris@chris-VBox:~/tmp$ipfs catQma3qbWDGJc6he3syLUTaRkJD3vAq1k5569tNMbUtjAZjf/my_dir/my_file.txt
Hello World!
版本化文件系统(Versioned File Systems)
IPFS可以表示Git所使用的数据结构,以支持版本化的文件系统。Git的提交对象(commit objects)在Git手册中被描述。IPFS提交对象的结构在撰写本文时没有完全指定,讨论仍在进行中。
IPFS提交对象的主要属性是,它包含一个或多个名称为parent0、parent1等链接,这些链接指向先前的提交;另外,还包含一个名字为object的链接(Git中称为树),指向该提交引用的文件系统结构。
我们以前面的文件系统目录结构为例,这里显示了两个提交(commit):第一个提交是原始结构,在第二个提交中,我们更新了文件my_file.txt,内容改成了Another World!而不是原来的Hello World!。
值得注意的是这里也发生了自动去重,因此第二个提交中的新对象只有主目录、新目录my_dir(译注:目录下的文件有变化,hash重新计算)和更新后的文件my_file.txt。
领取专属 10元无门槛券
私享最新 技术干货