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

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

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

Как создать изменяемую 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

Последнее обновление