首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IPFS内部原理入门(二)

在昨天的文章里我们讲过了内容寻址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。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180427G1M05N00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券