Эффективность IPFS для обмена обновленным файлом - PullRequest
0 голосов
/ 15 мая 2018

Например, пользователь 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 , а не загружается только блок, содержащий измененный символ.

  • Шаг 1:

ПользовательА

$ 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

  • Шаг 2:

ПользовательА

$ 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

Ответы [ 2 ]

0 голосов
/ 14 августа 2019

Файлы в IPFS являются адресно-ориентированными и неизменяемыми, их сложно редактировать. Но есть MFS (изменяемая файловая система), которая может использоваться для обработки файлов, как если бы вы работали с обычной файловой системой на основе имен - вы можете добавить,удаляйте, перемещайте и редактируйте файлы MFS и позаботьтесь об обновлении ссылок и хэшей.

0 голосов
/ 09 сентября 2018

IPFS в настоящее время не предназначена для поддержки сценария, который вы описываете, потому что файлы индексируются по хэшу их содержимого. Существуют обстоятельства, когда это будет работать «случайно», хотя из-за способа, которым файлы разбиваются на куски. Если изменение происходит в конце файла, существует вероятность того, что в начале файла будут те же хеши для передаваемых «блоков».

Можно было бы проанализировать данные, которые в данный момент хранятся, и посмотреть, есть ли у вас что-то, что можно было бы использовать для блока (что аналогично тому, как rsync достигает этого, хотя использует алгоритм контрольной суммы, разработанный для этого). процесс)

...