IPFS: Как добавить файл в существующую папку?

#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 , чтобы сделать это за один шаг