2019 年 10 月 30 日更新:
=> 请参阅以下讨论以了解对 IPFS 的功能请求:git-diff 功能:提高 IPFS 共享更新文件的效率。减少文件/块重复
=> 请参阅以下讨论以获取更多信息。IPFS 是否提供块级文件复制功能?
例如userA添加了一个大小为 1 GB 的文件。IPFS add file.txt
userB通过 IPFS 将该文件放入他的存储中。后来userA发布了一个错误,只更改了文件中的一个字符,并希望与userB共享这个更新版本。
因此,用户 A再次通过 将相同的文件添加到 IPFS 中ipfs add file
,而用户B 必须获取该 1 GB 的文件,而不是更新该单个字符。有没有更好的方法来解决这个问题,只有更新的版本应该由userB提取,就像我们 git 的工作方式一样git pull
?
Git 有更好的方法,请参阅(https://stackoverflow.com/a/8198276/2402577)。IPFS 是否像 Git 一样使用增量压缩进行存储( https://gist.github.com/matthewmccullough/2695758 )?或类似的方法?
进一步的调查:
我做了一个小实验。首先,我在 IPFS 中添加了 1GB 文件。后来,我更新了文件上的一小行,它已经通过 IPFS 共享。我观察到userA再次推送完整的 1GB 文件,而不是只推送包含更改数据的块。在我看来,这是非常昂贵和耗时的。我已经共享了新更新文件的哈希值,并再次通过用户 B 上的 IPFS 下载完整文件,而不是仅下载包含更改字符的块。
- 步骤1:
用户A
$ fallocate -l 1G gentoo_root.img
$ ipfs add gentoo_root.img
920.75 MB / 1024.00 MB [========================================>----] 89. 92added QmdiETTY5fiwTkJeERbWAbPKtzcyjzMEJTJJosrqo2qKNm gentoo_root.img
用户B
$ ipfs get QmdiETTY5fiwTkJeERbWAbPKtzcyjzMEJTJJosrqo2qKNm
Saving file(s) to QmdiETTY5fiwTkJeERbWAbPKtzcyjzMEJTJJosrqo2qKNm
1.00 GB / 1.00 GB [==================================] 100.00% 49s
- 第2步:
用户A
$ echo 'hello' >> gentoo_root.img
$ ipfs add gentoo_root.img # HERE node pushing 1 GB file into IPFS again. It took 1 hour for me to push it, instead only updated the changed block.
32.75 MB / 1.00 GB [=>---------------------------------------] 3.20% 1h3m34s
added Qmew8yVjNzs2r54Ti6R64W9psxYFd16X3yNY28gZS4YeM3 gentoo_root.img
用户B
# HERE complete 1 GB file is downloaded all over again.
ipfs get Qmew8yVjNzs2r54Ti6R64W9psxYFd16X3yNY28gZS4YeM3
[sudo] password for alper:
Saving file(s) to Qmew8yVjNzs2r54Ti6R64W9psxYFd16X3yNY28gZS4YeM3
1.00 GB / 1.00 GB [=========================] 100.00% 45s
[Q]此时,通过 IPFS 共享更新文件而不重新共享更新文件的整个版本以及 IPFS 仅共享文件的更新块的最佳解决方案是什么?
在此之上; 每当我这样做时,都在同一个节点上ipfs cat <hash>
保持下载相同的哈希值。
$ ipfs cat Qmew8yVjNzs2r54Ti6R64W9psxYFd16X3yNY28gZS4YeM3
212.46 MB / 1.00 GB [===========>---------------------------------------------] 20.75% 1m48s
$ ipfs cat Qmew8yVjNzs2r54Ti6R64W9psxYFd16X3yNY28gZS4YeM3
212.46 MB / 1.00 GB [===========>---------------------------------------------] 20.75% 1m48s
分析:
两者(更新文件和原始文件)在 repo 大小上都有相同的增加:
首先我创建 100 MB 文件(file.txt)
NumObjects: 5303
RepoSize: 181351841
StorageMax: 10000000000
RepoPath: /home/alper/.ipfs
Version: fs-repo@6
$ ipfs add file.txt
added QmZ33LSByGsKQS8YRW4yKjXLUam2cPP2V2g4PVPVwymY16 file.txt
$ ipfs pin add QmZ33LSByGsKQS8YRW4yKjXLUam2cPP2V2g4PVPVwymY16
这里的对象数量增加了 4. 更改了 repo 大小 (37983)
$ ipfs repo stat
NumObjects: 5307
RepoSize: 181389824
StorageMax: 10000000000
RepoPath: /home/alper/.ipfs
Version: fs-repo@6
比我echo 'a' >> file.txt
那时 ipfs add file.txt
在这里,我观察到对象数量增加了 4 个,因此它添加了完整的文件,更改了 repo 大小(38823)
$ ipfs repo stat
NumObjects: 5311
RepoSize: 181428647
StorageMax: 10000000000
RepoPath: /home/alper/.ipfs
Version: fs-repo@6