Например, пользователь A добавил файл размером 1 ГБ. IPFS add file.txt
и userB получают этот файл в свое хранилище через IPFS. Позже userA выпустил ошибку и изменил только один символ в файле и хочет поделиться этой обновленной версией с userB .
Итак, userA снова добавил тот же файл с небольшим изменением в IPFS через ipfs add file
, и userB должен извлечь этот 1 ГБ файла вместо обновления этого одиночного символа. Есть ли лучший подход для решения этой проблемы, когда userB должен извлекать только обновленную версию, например, как работает git, когда мы делаем git pull
?
У Git гораздо лучший подход, см. (https://stackoverflow.com/a/8198276/2402577). Использует ли IPFS дельта-сжатие для хранения (https://gist.github.com/matthewmccullough/2695758) как Git? Или аналогичный подход?
Дальнейшее расследование:
Я провел небольшой эксперимент.
Сначала я добавил 1 ГБ файл в IPFS. Позже я обновил небольшую строку файла, которая уже доступна через IPFS. Я замечаю, что userA снова перетаскивает полный файл объемом 1 ГБ, вместо этого нажимая только блок, содержащий измененные данные. Это очень дорого и требует много времени, по моему мнению. Я поделился хэшем нового обновленного файла, и снова полный файл загружается через IPFS на userB , а не загружается только блок, содержащий измененный символ.
ПользовательА
$ fallocate -l 1G gentoo_root.img
$ ipfs add gentoo_root.img
920.75 MB / 1024.00 MB [========================================>----] 89. 92added QmdiETTY5fiwTkJeERbWAbPKtzcyjzMEJTJJosrqo2qKNm gentoo_root.img
USERB
$ ipfs get QmdiETTY5fiwTkJeERbWAbPKtzcyjzMEJTJJosrqo2qKNm
Saving file(s) to QmdiETTY5fiwTkJeERbWAbPKtzcyjzMEJTJJosrqo2qKNm
1.00 GB / 1.00 GB [==================================] 100.00% 49s
ПользовательА
$ 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
USERB
# 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
Анализ:
Оба (обновленный и оригинальный файл) имеют одинаковое увеличение размера репо:
Сначала я создаю файл размером 100 МБ (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. Изменен размер репо (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, поэтому он добавил полный файл, изменил размер репо (38823)
$ ipfs repo stat
NumObjects: 5311
RepoSize: 181428647
StorageMax: 10000000000
RepoPath: /home/alper/.ipfs
Version: fs-repo@6