Onchain папки
Папки Onchain — это мощный инструмент для организации транзакций в Irys. Используйте их для ссылки на данные Onchain по логическим именам вместо идентификаторов транзакций.
Зачем использовать onchain папки?
Логическая группировка: создавайте организованные и удобные для чтения структуры для onchain данных.
Удобные для чтения ссылки: заменяйте идентификаторы транзакций логическими именами, улучшая доступность
Группировка по совместному владению: включайте любые транзакции в Irys, даже если не вы их создавали
Гибкость: добавляйте новые файлы в существующие папки в любое время
Как шлюз Irys позволяет использовать onchain папки
Каждая папка в сети имеет уникальный идентификатор. Чтобы загрузить транзакции в папке, запросите их у шлюза Irys, используя URL-адрес в следующем формате:
https://gateway.irys.xyz/:manifestId/:pathName
Затем шлюз:
Ищет манифест по идентификатору.
Проверяет манифест на наличие пути.
Возвращает транзакцию, связанную с путем, если она найдена.
Возвращает 404, если не найдена.
Например, если у вас есть манифест с идентификатором 8eNpkShMwdbiNBtGuVGBKp8feDZCa21VppX2eDi3eLME, содержащий следующее:
DTMcqFqwaDukaYxs7iK2fa6CuMtyi7sN93rBGSAa13Ug
foo1.png
5TQU2ETHGRPjJKPoeQkkgMB6zRpK8ptheWF8jdkbtJHR
foo2.png
8nond6kkdYS14QjA5tZNCRDQQrgVNd7gdhx3L4XRJD1b
foo3.png
Создание onchain папок
Автоматически
Когда вы загружаете группы файлов с помощью функции uploadFolder() SDK Irys или команды upload-dir CLI, для вас автоматически создается папка onchain. Возвращаемое значение содержит идентификатор манифеста, который можно объединить с исходными именами файлов, как показано выше.
Вручную
Создайте объект JavaScript Map, в котором каждая запись сопоставляет уникальный идентификатор транзакции с уникальным путем. (Пути могут быть произвольными; вы можете использовать любой путь, соответствующий синтаксису действительного URL-адреса).
Создайте объект Manifest, передав объект Map в irys.uploader.generateFolder()
Загрузите объект 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 папку
Загрузите исходную папку: используйте SDK или CLI для загрузки исходного набора файлов. Это создаст базовый идентификатор манифеста, который однозначно идентифицирует папку.
Ссылка на файлы с помощью изменяемого URL: Ссылайтесь на файлы в этой папке, используя URL в формате https://gateway.irys.xyz/mutable/:manifestId/:fileName. Этот URL всегда будет вести на самую последнюю версию папки.
Загрузка новых файлов: Когда вам нужно добавить новые файлы, загрузите их по отдельности с помощью SDK или CLI.
Создание onchain папки: вручную создайте новую onchain папку, которая будет содержать как исходные файлы, так и любые новые файлы, как описано выше.
Пометка нового манифеста: загрузите новую папку onchain в Irys, помечая ее Root-TX, равным исходному идентификатору манифеста. Это связывает новую папку onchain с исходной папкой; «изменяемый» URL остается неизменным.
Доступ к обновленной папке: 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
Последнее обновление