#ipfs
#ipfs
Вопрос:
Учитывая довольно большую папку, которая уже была передана в сеть и удалена локально. Как файл будет добавлен в эту папку, без повторной загрузки всей папки?
Комментарии:
1. Вы не можете передавать данные в сеть.
Ответ №1:
Вы можете сделать это только с помощью ipns после повторной загрузки с ipfs get
помощью, что должно быть быстрым, если он все еще прикреплен к вашему локальному хранилищу:
(1) сначала добавьте (т.Е. Повторно добавьте) Свою папку в ipfs рекурсивно : ipfs add -r /path/to/folder
. Второй столбец последней строки стандартного вывода содержит хэш ipfs родительской папки, которую вы только что добавили. (Исходные файлы остаются теми же, поэтому хэши тоже будут одинаковыми.)
(2) затем опубликуйте этот хэш : ipfs name publish /ipfs/<CURRENT_PARENTFOLDER_HASH>
. Это вернет ваш одноранговый идентификатор, и вы сможете поделиться ссылкой как /ipns/<PEER_ID>
; повторяйте этот шаг ( ipfs name publish
) всякий раз, когда содержимое папки (и, следовательно, хэш родительской папки) изменяется. Затем объект ipns всегда будет указывать на последнюю версию вашей папки.
(3) если вы планируете использовать много файлов, вы можете создать новую пару ключей для каждой общей папки: ipfs key gen --type=rsa --size=2048 new-share-key
… а затем использовать этот ключ (вместо вашего ключа по умолчанию) для публикации (а затем переиздавать) эту папку: ipfs name publish --key=new-share-key /ipfs/<CURRENT_PARENTFOLDER_HASH>
Смотрите также документацию здесь: https://docs.ipfs.io/reference/cli/#ipfs-name-publish
Ответ №2:
Я немного опоздал с ответом на этот вопрос, но я нашел 2 существующих ответа немного неясными.
Tl; Dr; Только команды и минимум информации
Если вы хотите получить подробное подробное объяснение, прокрутите вниз до раздела, начинающегося с The 2 keys to mutability
.
Если вам просто нужны команды, которые вы должны выполнить, и простая информация об использовании, чтобы вы знали, как на самом деле настроить команду для вашего варианта использования, тогда прочитайте этот раздел TL; DR; .
Используйте IPNS / DNSLink для ссылок на объекты IPFS, которые могут быть обновлены
IPNS
Создайте ключ, создайте его резервную копию, если он используется в рабочей среде, затем используйте ipfs name publish
для изменения объекта, на который в данный момент указывает ваш ключ. Доступ к вашему ключу с помощью префикса /ipns/
к командам / URL вместо /ipfs/
.
ipfs key gen test
# backup your key if used in production
ipfs key export -o /home/somewhere/safe/test.key test
umount /ipns
ipfs name publish -k test QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
# Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
ipfs ls /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
# Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
ipfs name publish -k test QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Since it's not a folder this time, we use 'ipfs cat' to read
# it to the console, since we know the file was plain text.
ipfs cat /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
# foo bar foo bar foo foo foo
# bar foo foo bar bar foo bar
DNSLink
Установите текстовую запись _dnslink
над (вспомогательным) доменом, который вы хотите использовать в качестве ссылки IPNS. Установите значение dnslink=/ipns/<id>
равным или dnslink=/ipfs/<id>
в зависимости от того, указываете ли вы на объект IPFS или IPNS-адрес, и <id>
замените его идентификатором объекта / IPNS-адресом, на который вы хотите указать.
Domain: privex.io
(Subdomain) Name: _dnslink.test
Record Type: TXT
Value: dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
TTL (expiry): 120 (seconds)
Just like normal IPNS, you should now be able to query it with IPFS CLI tools, or IPFS gateways by using /ipns/<your_domain>
instead of /ipfs/<object_id>
.
If we now cat /ipns/test.privex.io
we can see it’s working properly, pointing to the foo bar text file (no wrapped folder).
ipfs@privex ~ $ ipfs cat /ipns/test.privex.io
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
Add an existing IPFS object ID to another IPFS object (wrapped folder)
Используя следующую команду, вы можете добавить отдельный файл IPFS или целую упакованную папку к существующему объекту, используя их соответствующие идентификаторы объектов, и команда выведет новый идентификатор объекта, ссылающийся на новый объект, который содержит как исходные данные папки, так и новые данные, которые вы хотели добавить.
Синтаксис команды: ipfs object patch add-link [object-to-add-to] [name-of-newly-added-file-or-folder] [object-to-inject]
ipfs@privex:~$ ipfs object patch add-link QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3 hello/foo.txt QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
2 ключа к изменчивости
1. Наличие идентификатора объекта IPFS, который остается неизменным, несмотря на изменение содержимого
К сожалению, идентификаторы объектов IPFS (те, которые начинаются с Q) являются неизменяемыми, что означает, что их содержимое не может быть изменено в будущем без получения нового идентификатора, поскольку идентификатор объекта фактически является хэшем (обычно формой SHA256).
ОДНАКО и IPNS, и DNSLink имеют решение для этого.
IPNS — это «межпланетная система имен», которая сильно интегрирована в IPFS. Это позволяет вам генерировать адрес (открытый ключ) и закрытый ключ, подобно тому, как работают биткойны и многие другие криптовалюты. Используя свой закрытый ключ, вы можете указать свои IPN
Сначала вам нужно сгенерировать ключ (примечание: вам понадобится ключ для каждого отдельного IPNS-адреса, который вы хотите)
ipfs@privex:~$ ipfs key gen test
k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
Если вы планируете использовать свой IPNS-адрес для чего-то другого, кроме тестирования, вам следует экспортировать закрытый ключ и сохранить его копию в надежном месте. Обратите внимание, что закрытый ключ представляет собой двоичный файл, поэтому, если вы хотите сохранить его где-нибудь, где ожидается обычный текст, вы можете преобразовать его в base64 следующим образом: base64 test.key
ipfs key export -o /home/somewhere/safe/test.key test
Далее мы опубликуем случайную папку IPFS с IPNS-адресом, которая содержит один файл (lorem.txt ) с несколькими строками текста lorem ipsum. Если вы используете папку FUSE /ipns
, вам может потребоваться размонтировать ее, прежде чем вы сможете публиковать через IPNS:
ipfs@privex:~$ umount /ipns
ipfs@privex:~$ ipfs name publish -k test QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
ipfs@privex:~$ ipfs ls /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
Однако это всего лишь один пример — чтобы доказать, что IPNS-адрес действительно может быть обновлен другим содержимым, в следующем примере я опубликую отдельный текстовый файл непосредственно с IPNS-адресом (а не с упакованной папкой).
# Publish the IPFS object 'QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8'
# to our existing named key 'test'
ipfs@privex:~$ ipfs name publish -k test QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Since it's not a folder this time, 'ipfs ls' won't return anything.
# So instead, we use 'ipfs cat' to read it to the console, since we
# know the file was plain text.
ipfs@privex:~$ ipfs cat /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
DNSLink
DNSLink — это часть IPNS, которая позволяет использовать IPN-адреса для чтения человеком через стандартную доменную систему (например example.com ).
Поскольку раздел IPNS был довольно длинным, я сохраню этот раздел коротким и приятным. Если вы хотите узнать больше о DNSLink, пожалуйста, посетите dnslink.io .
Во-первых, либо у вас уже есть домен для использования, либо вы приобретаете домен у регистратора, такого как Namecheap.
Перейдите на панель управления записями вашего домена — если вы используете Cloudflare, то они являются вашей панелью управления доменом. Добавьте текстовую запись для _dnslink.yourdomain.com
или, если вы хотите использовать поддомен _dnslink.mysub.yourdomain.com
(на большинстве регистраторов вы вводите только часть перед доменом, которым вы управляете, т. Е. _dnslink
Или _dnslink.mysub
).
В поле значение введите, dnslink=
за которым следует либо /ipfs/
или /ipns/
, в зависимости от того, хотите ли вы использовать идентификатор объекта IPFS или адрес имени IPNS, затем введите свой идентификатор объекта / имя IPNS до конца.
Например, если бы вы указывали свой домен на IPNS-адрес в предыдущем примере, вы бы ввели:
dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
Или, если вы хотите указать на пример папки, содержащей lorem.txt
несколько строк lorem ipsum, это будет
dnslink=/ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
Для примера, вот краткое описание того, как я настраиваю test.privex.io
Domain: privex.io
(Subdomain) Name: _dnslink.test
Record Type: TXT
Value: dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
TTL (expiry): 120 (seconds)
(note: most people are fine with "auto" TTL, or the somewhat standard 600 TTL. If you intend to change the DNSLink value regularly, or you're experimenting and likely updating it constantly, you may want a low TTL of 60 or even 30)
После его настройки, когда IPNS-адрес все еще указывал на необработанные текстовые данные foo bar, я использовал ipfs cat
для чтения данные, на которые указывал домен:
ipfs@privex:~$ ipfs cat /ipns/test.privex.io
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
2. Добавьте существующие объекты IPFS в свой объект без необходимости загружать / упорядочивать добавляемый объект.
Сначала мы создаем объект IPFS — обернутую папку, содержащую hello/lorem.txt
— который имеет идентификатор объекта QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
ipfs@privex:~$ mkdir hello
ipfs@privex:~$ echo -e "lorem ipsum dolornlorem ipsum dolorn" > hello/lorem.txt
ipfs@privex:~$ ipfs add -p -r -w hello
added Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK hello/lorem.txt
added QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs hello
added QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
37 B / 37 B [=======================================================================] 100.00%
ipfs@privex:~$ ipfs ls QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs - hello/
ipfs@privex:~$ ipfs ls QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3/hello
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
Next, for the sake of creating an example external object ID that isn’t part of the original wrapped folder, I created foo.txt
containg a couple of lines of random foo bar
text, and uploaded it to IPFS on it’s own. It’s object ID is QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
ipfs@privex:~$ echo -e "foo bar foo bar foo foo foonbar foo foo bar bar foo barn" > foo.txt
ipfs@privex:~$ ipfs add foo.txt
added QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8 foo.txt
57 B / 57 B [======================================================================] 100.00%
Наконец, мы используем ipfs object patch add-link
для добавления foo.txt
объекта ( QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
), который я создал ранее, внутри hello/
папки исходной обернутой папки, которую я создал ( QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
) .
Синтаксис команды: ipfs object patch add-link [object-to-add-to] [name-of-newly-added-file-or-folder] [object-to-inject]
ipfs@privex:~$ ipfs object patch add-link QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3 hello/foo.txt QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
Он выводит новый идентификатор объекта QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
, который является идентификатором вновь созданного объекта, который содержит оба hello/lorem.txt
из оригинала и hello/foo.txt
который был введен позже.
ПРИМЕЧАНИЕ: Эта команда ТАКЖЕ работает при добавлении целых обернутых папок в другую обернутую папку, однако будьте осторожны, чтобы избежать двойного вложения. например, у вас есть Qxxxx/hello/world
и Qyyyy/lorem/ipsum
— если вы добавите Qyyyyy в Qxxxx, указав имя lorem
— оно будет добавлено как Qzzzz/lorem/lorem/ipsum
Если мы теперь сделаем ipfs ls
это с новым идентификатором объекта, мы увидим, что hello/
подпапка содержит ОБА foo.txt
и lorem.txt
— подтверждение того, что foo.txt был успешно введен в дубликат, без необходимости загружать как оригинал, так и foo.txt — затем упорядочите их должным образом в папке перед загрузкой.
ipfs@privex:~$ ipfs ls QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
QmbU3BwdMarL8n6KCzVdYqMh6HEjCv6pLJQZhoVGWZ5bWW - hello/
ipfs@privex:~$ ipfs ls QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL/hello
QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8 57 foo.txt
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
Краткие сведения
Как объяснялось в первом разделе, идентификаторы объектов IPFS неизменяемы, поэтому, хотя в IPFS можно объединить существующие объекты, это все равно приведет к созданию нового идентификатора объекта.
НО, используя ключевые адреса IPNS и / или DNSLink, вы можете иметь изменяемую (редактируемую) ссылку, которая указывает на любой объект IPFS и может быть обновлена, чтобы указывать на новый идентификатор объекта по требованию, например, всякий раз, когда вы обновляете содержимое существующего объекта, или если вы решите простоесли вы хотите, чтобы ваш IPNS-ключ / домен указывал на что-то совершенно другое, вы можете это сделать
Комментарии:
1. Эпический ответ. Спасибо.
2. Похоже, этот метод больше не поддерживается для «больших» объектов, что является настоящим позором. Я получаю следующую ошибку: «Ошибка: созданный блок превышает 1 МБ, объектный API устарел и не поддерживает HAMT-сегментирование: для создания больших каталогов, пожалуйста, используйте files API (MFS)»
3. объект ipfs — устаревшие команды для взаимодействия с объектами dag-pb. Вместо этого используйте ‘dag’ или ‘files’
Ответ №3:
Это должно быть легко с помощью files API. Предполагая, что вы уже добавили новый файл в ipfs и получили его хэш, попробуйте:
ipfs files cp /ipfs/QmExistingLargeFolderHash /folder-to-modify
ipfs files cp /ipfs/QmNewFileHash /folder-to-modify/new-file
Это, конечно, не добавляет файл в существующую папку (поскольку папки и файлы неизменяемы), это просто создает копию / новую версию папки с добавлением нового файла. Следовательно, у него будет новый хэш:
ipfs files stat /folder-to-modify
API файлов не закрепляет файлы, на которые ссылаются, и не извлекает какие-либо вложенные папки, если это не необходимо, поэтому это можно сделать на любом узле в сети без большого трафика.
[Редактировать] Некоторое время спустя я узнаю, что есть еще несколько вещей, которые вы можете сделать:
-
Вместо
ipfs files cp /ipfs/QmNewFileHash /folder-to-modify/new-file
вы можете использовать
ipfs files write -te
, если вы еще не добавили файл в ipfs. - Вы можете включить функции записи HTTP API для использования
PUT
запросов для получения хэшей новых версий папки. Смотрите это сообщение в блоге. - Вы можете подключать ipn через fuse и записывать в
…/ipns/local
. - И, вероятно, лучше всего: вы можете использовать
ipfs object patch add-link /ipfs/QmExistingLargeFolderHash new-file /ipfs/QmNewFileHash
, чтобы сделать это за один шаг