# Onchain папки

Папки Onchain — это мощный инструмент для организации транзакций в Irys. Используйте их для ссылки на данные Onchain по логическим именам вместо идентификаторов транзакций.

### Зачем использовать onchain папки?

* Логическая группировка: создавайте организованные и удобные для чтения структуры для onchain данных.
* Удобные для чтения ссылки: заменяйте идентификаторы транзакций логическими именами, улучшая доступность
* Группировка по совместному владению: включайте любые транзакции в Irys, даже если не вы их создавали
* Гибкость: добавляйте новые файлы в существующие папки в любое время

### Как шлюз Irys позволяет использовать onchain папки

Каждая папка в сети имеет уникальный идентификатор. Чтобы загрузить транзакции в папке, запросите их у шлюза Irys, используя URL-адрес в следующем формате:

<https://gateway.irys.xyz/:manifestId/:pathName>

Затем шлюз:

1. Ищет манифест по идентификатору.
2. Проверяет манифест на наличие пути.
3. Возвращает транзакцию, связанную с путем, если она найдена.
4. Возвращает 404, если не найдена.

Например, если у вас есть манифест с идентификатором 8eNpkShMwdbiNBtGuVGBKp8feDZCa21VppX2eDi3eLME, содержащий следующее:

| Tx ID                                        | Path Name |
| -------------------------------------------- | --------- |
| DTMcqFqwaDukaYxs7iK2fa6CuMtyi7sN93rBGSAa13Ug | foo1.png  |
| 5TQU2ETHGRPjJKPoeQkkgMB6zRpK8ptheWF8jdkbtJHR | foo2.png  |
| 8nond6kkdYS14QjA5tZNCRDQQrgVNd7gdhx3L4XRJD1b | foo3.png  |

{% embed url="<https://gateway.irys.xyz/8eNpkShMwdbiNBtGuVGBKp8feDZCa21VppX2eDi3eLME/foo1.png>" %}

### Создание onchain папок

#### Автоматически

Когда вы загружаете группы файлов с помощью функции uploadFolder() SDK Irys или команды upload-dir CLI, для вас автоматически создается папка onchain. Возвращаемое значение содержит идентификатор манифеста, который можно объединить с исходными именами файлов, как показано выше.

#### Вручную

1. Создайте объект JavaScript Map, в котором каждая запись сопоставляет уникальный идентификатор транзакции с уникальным путем. (Пути могут быть произвольными; вы можете использовать любой путь, соответствующий синтаксису действительного URL-адреса).
2. Создайте объект Manifest, передав объект Map в irys.uploader.generateFolder()
3. Загрузите объект Manifest в Irys.

```
const createOnchainFolder = async () => {
  const irysUploader = await getIrysUploader();

  // You can map ANY logical name to ANY transaction ID
  const map = new Map();
  map.set("image-1.png", "DTMcqFqwaDukaYxs7iK2fa6CuMtyi7sN93rBGSAa13Ug");
  map.set("image-2.png", "5TQU2ETHGRPjJKPoeQkkgMB6zRpK8ptheWF8jdkbtJHR");
  map.set("image-3.png", "8nond6kkdYS14QjA5tZNCRDQQrgVNd7gdhx3L4XRJD1b");

  const manifest = await irysUploader.uploader.generateFolder({ items: map });
  console.log({ manifest });

  const tags = [
    { name: "Type", value: "manifest" },
    { name: "Content-Type", value: "application/x.irys-manifest+json" },
  ];
  const receipt = await irysUploader.upload(JSON.stringify(manifest), { tags });
  console.log(`Manifest uploaded to https://gateway.irys.xyz/${receipt.id}`);
  console.log(`File 1 available at https://gateway.irys.xyz/${receipt.id}/image-1.png`);
  console.log(`File 2 available at https://gateway.irys.xyz/${receipt.id}/image-2.png`);
  console.log(`File 3 available at https://gateway.irys.xyz/${receipt.id}/image-3.png`);
};
```

### Изменяемые onchain папки

Изменяемые папки в сети позволяют добавлять новые файлы в существующую папку после ее создания. Используя единый статический URL-адрес, который всегда указывает на самую последнюю версию, вы можете расширять коллекцию NFT, добавлять обновленные документы или управлять развивающимися наборами данных без необходимости изменения исходной ссылки.&#x20;

Такой подход обеспечивает согласованность и позволяет динамически обновлять данные с течением времени, при этом только создатель может изменять содержимое папки.

#### Как создать изменяемую onchain папку

1. **Загрузите исходную папку:** используйте SDK или CLI для загрузки исходного набора файлов. Это создаст базовый идентификатор манифеста, который однозначно идентифицирует папку.
2. **Ссылка на файлы с помощью изменяемого URL:** Ссылайтесь на файлы в этой папке, используя URL в формате <https://gateway.irys.xyz/mutable/:manifestId/:fileName>. Этот URL всегда будет вести на самую последнюю версию папки.
3. **Загрузка новых файлов:** Когда вам нужно добавить новые файлы, загрузите их по отдельности с помощью SDK или CLI.
4. **Создание onchain папки:** вручную создайте новую onchain папку, которая будет содержать как исходные файлы, так и любые новые файлы, как описано выше.
5. **Пометка нового манифеста:** загрузите новую папку onchain в Irys, помечая ее Root-TX, равным исходному идентификатору манифеста. Это связывает новую папку onchain с исходной папкой; «изменяемый» URL остается неизменным.
6. **Доступ к обновленной папке:** URL-адрес <https://gateway.irys.xyz/mutable/:manifestId/:fileName> теперь будет указывать на последнюю версию папки, включая все вновь добавленные файлы.

```
import { Uploader } from "@irys/upload";
import { Ethereum } from "@irys/upload-ethereum";
import "dotenv/config";
import fetch from "node-fetch"; 

const getIrysUploader = async () => {
  const irysUploader = await Uploader(Ethereum).withWallet(process.env.PRIVATE_KEY);
  return irysUploader;
};

const downloadOriginalManifest = async (originalManifestId: string) => {
  try { 
    const response = await fetch(`https://gateway.irys.xyz/${originalManifestId}`);
    if (!response.ok) throw new Error("Failed to fetch original manifest");
    return response.json();
  } catch (error) {
    console.error("Error downloading original manifest", error);
    throw error;
  }
};

const appendToManifest = (originalManifest: any, newFiles: Map<string, string>)  => {
  newFiles.forEach((txId, fileName) => {
    originalManifest.paths[fileName] = { id: txId };
  });
  return originalManifest;
};

const uploadManifest = async (manifest: any, originalManifestId: string): Promise<void> => {
  const irysUploader = await getIrysUploader();

  const manifestTags = [
    { name: "Type", value: "manifest" },
    { name: "Content-Type", value: "application/x.irys-manifest+json" },
    { name: "Root-TX", value: originalManifestId },
  ];

  try {
    const manifestResponse = await irysUploader.upload(JSON.stringify(manifest), { tags: manifestTags });
    console.log(`Manifest uploaded ==> https://gateway.irys.xyz/mutable/${originalManifestId}`);
  } catch (e) {
    console.error("Error uploading manifest", e);
  }
};

const main = async () => {
  try {
    // Your original manifest ID
    const originalManifestId = "8eNpkShMwdbiNBtGuVGBKp8feDZCa21VppX2eDi3eLME";

    // Step 1: Download the original manifest
    const originalManifest = await downloadOriginalManifest(originalManifestId);

    // Step 2: Prepare new files to add to the manifest
    const newFiles = new Map<string, string>();
    newFiles.set("new-1.png", "4pTiwGwur38s4vyVD8EERxDYgAGDM8kyzEh9c5QPF9Zw");
    newFiles.set("new-2.png", "BieiKJE1Nh6ydCYqxmDjHFGzuG7enRr6NYmKisqSwUQo");

    // Step 3: Append new files to the manifest
    const updatedManifest = appendToManifest(originalManifest, newFiles);

    // Step 4: Upload the updated manifest
    await uploadManifest(updatedManifest, originalManifestId);
  } catch (e) {
    console.error("Error in main execution", e);
  }
};

main();
```

Оригинал статьи: <https://docs.irys.xyz/build/d/features/onchain-folders>
