Storage Limit Increase Request | Working with Content Archives [UK]

 

Запит на збільшення ліміту пам'яті | Робота з архівами вмісту

casbt1osint.blogspot.com
18 хв

Коли ви завантажуєте файли до web3.storage за допомогою клієнтської бібліотеки , ваші дані перетворюються на графік структур даних, які потім упаковуються у формат, званий архівом вмісту (CAR), перед тим як надсилатися до служби web3.storage.

Для більшості випадків використання вам ніколи не потрібно знати про цей процес, оскільки перетворення відбувається за лаштунками під час використання клієнтської бібліотеки. Однак, якщо ви використовуєте HTTP API або хочете більше контролювати структуру графіка даних IPFS, ви можете працювати безпосередньо з архівами вмісту.

Цей практичний посібник пояснює основи Content Archives і те, як вони використовуються web3.storage API .

Ми також побачимо декілька методів створення архівів вмісту та керування ними за допомогою інструментів командного рядка та огляд бібліотек , які можна використовувати в коді програми.

Що таке архів вмісту?

Формат архіву вмісту — це спосіб упаковки даних, адресованих вмісту, в архівні файли, які можна легко зберігати та передавати. Ви можете розглядати їх як файли TAR , призначені для зберігання колекцій адресованих даних.

Тип даних, що зберігаються в CAR, визначається IPLD або InterPlanetary Linked Data. IPLD — це специфікація та набір реалізацій для структурованих типів даних, які можуть зв’язуватися один з одним за допомогою ідентифікатора вмісту (CID) на основі хешу. Дані, пов’язані таким чином, утворюють спрямований ациклічний графік, або DAG, і ви, ймовірно, побачите кілька посилань на DAG у документації для IPLD та IPFS.

Файли IPFS є одним із прикладів даних IPLD, але IPLD також можна використовувати для доступу до даних з Ethereum, Git та інших систем із хеш-адресами. Ви також можете використовувати IPLD як формат загального призначення для своїх структурованих даних, на кшталт JSON зі смаком Web3. Додаткову інформацію див . у розділі Розширені формати IPLD нижче.

АВТОМОБІЛІ та web3.storage

Коли клієнт web3.storage запаковує звичайні файли в CAR для зберігання в IPFS, CAR містить дані, закодовані в тому самому форматі, який використовується IPFS під час імпорту файлів за допомогою командного рядка або інших API IPFS.

У цьому форматі використовується «кодек» IPLD під назвою dag-pb, який використовує буфери протоколів для кодування графа об’єктів. Усередині графіка є об’єкти UnixFS , які описують файли та їхній вміст.

Хоча HTTP API також дозволяє завантажувати звичайні файли, клієнт віддає перевагу надсиланню CAR з кількох причин.

По-перше, форматування всього на клієнті дозволяє нам обчислити кореневий ідентифікатор вмісту для даних, які ви завантажуєте, перш ніж ми надішлемо будь-які дані до віддаленої служби. Це означає, що ви можете порівняти CID, повернутий службою web3.storage, із тим, який ви розрахували локально, і вам не потрібно довіряти службі, щоб зробити правильні речі.

Ще однією причиною використання CAR є підтримка великих файлів, які в іншому випадку досягли б обмежень розміру на серверній платформі web3.storage. Дані в CAR вже розділені на невеликі блоки, що дозволяє легко розділити CAR на невеликі фрагменти, які можна завантажувати пакетами.

Інструменти командного рядка

Існує кілька способів створення та взаємодії з файлами CAR за допомогою командного рядка.

ipfs-автомобіль

Пакет ipfs-car JavaScript містить інструмент командного рядка для легкого створення, розпакування та перевірки файлів CAR.

Щоб його встановити, вам знадобиться Node.js — ми рекомендуємо останню стабільну версію.

Ви можете встановити команду глобально:

npm install -g ipfs-car

Або запустіть команду з , npxне встановлюючи її у свій ШЛЯХ:

npx ipfs-car --help

Прапор --packстворить новий файл CAR із колекції вхідних файлів:

ipfs-car --pack path/to/files --output path/to/write/a.car

Або витягніть файли з CAR за допомогою --unpack:

ipfs-car --unpack path/to/my.car --output /path/to/unpack/files/to

Ви також можете перерахувати вміст CAR за допомогою --list:

ipfs-car --list path/to/my.car

Щоб дізнатися більше про використання, запустіть ipfs-car --help.

go-ipfs

go-ipfsє еталонною реалізацією протоколу IPFS. Серед багатьох інших функцій go-ipfsпідтримує експорт будь-якої діаграми об’єктів IPFS у файл CAR та імпорт даних із файлів CAR у ваш локальний репозиторій IPFS.

Ця ipfs dag exportкоманда отримає граф об’єкта IPFS за його ідентифікатором вмісту (CID), записуючи потік даних CAR у стандартний вихід.

Щоб створити файл CAR за допомогою go-ipfs, ви можете перенаправити вихід у ipfs dag exportфайл:

cid="bafybeigdmvh2wgmryq5ovlfu4bd3yiljokhzdep7abpe4c4lrf6rukkx4m"
ipfs dag export $cid > path/to/output.car

Зауважте, що вам слід замінити значення cidв лапках на CID, який ви хочете експортувати.

Якщо у вашому локальному сховищі IPFS немає CID, dag exportкоманда спробує отримати його через мережу IPFS.

Щоб додати вміст файлу CAR до локального сховища IPFS, ви можете використовувати ipfs dag import:

ipfs dag import path/to/input.car

Бібліотеки для розробників програм

JavaScript

Є два пакети JavaScript для маніпулювання CAR у вашій програмі.

ipfs-автомобіль

Пакет ipfs-carмістить бібліотечні функції для пакування та розпакування файлів у CAR за допомогою моделі даних IPFS UnixFs. Бібліотека містить ті самі функції, що й ipfs-carутиліта командного рядка, описана вище .

Перегляньте ipfs-car README для документації API та прикладів використання.

@ipld/автомобіль

Пакет @ipld/carмістить основну реалізацію JavaScript специфікації CAR і використовується ipfs-carпід капотом. Якщо ви хочете зберігати нефайлові дані за допомогою розширених форматів IPLD , вам слід використовувати @ipld/carбезпосередньо.

@ipld/carтакож надає CarReaderінтерфейс, який використовується методом клієнта putCarweb3.storage .

Ось простий приклад завантаження файлу CAR із потоку Node.js і збереження його за допомогою web3.storage:

import { createReadStream } from 'fs';
import { CarReader } from '@ipld/car';

async function storeCarFile(filename) {
  const inStream = createReadStream(filename);
  const car = await CarReader.fromIterable(inStream);

  const client = makeStorageClient();
  const cid = await client.putCar(car);
  console.log('Stored CAR file! CID:', cid);
}

CarReader.fromIterableприймає будь-які ітеровані Uint8Arrayдані, включаючи потоки Node.js. Якщо у вас уже є всі дані CAR в єдиному Uint8Arrayфайлі, ви можете використовувати CarReader.fromBytesнатомість.

Показаний CarReaderвище тип зчитує весь вміст CAR у пам’ять, що може спричинити проблеми з великими файлами. У Node.js можна використовувати CarIndexedReader, який зчитує дані CAR безпосередньо з диска та використовує менше пам’яті, ніж CarReader.

Іди

Модуль забезпечує основну реалізацію go-carGolang специфікації CAR. Ми рекомендуємо використовувати v2версію модуля, яка підтримує останню версію специфікації CAR.

Додаткову інформацію див. у довідковій документації API .

Розділення CAR для завантаження на web3.storage

Web3.storage HTTP API приймає завантаження CAR розміром до 100 МБ, але клієнт JavaScript використовує HTTP API для завантаження файлів будь -якого розміру. Клієнту вдається це зробити, розділяючи CAR на блоки розміром менше 100 МБ кожен і завантажуючи кожен фрагмент окремо.

Основний інструмент, доступний для поділу та об’єднання CAR, називається carbites, який має реалізацію в JavaScript і Go. Реалізація JavaScript включає версію командного рядка, яка дозволяє вам розділяти та об’єднувати CAR з вашого терміналу або улюбленої мови сценаріїв.

У цьому розділі буде продемонстровано кілька способів розділення CAR у спосіб, прийнятний для служби web3.storage, за допомогою інструмента командного рядка, а також програмним шляхом за допомогою carbitesбібліотек у JavaScript і Go.

Бібліотека JavaScript carbites містить пакет під назвою carbites-cli, який може розділяти та об’єднувати CAR з командного рядка. Вам знадобиться встановити останню версію Node.js , бажано останню стабільну версію.

Ви можете встановити інструмент глобально за допомогою npm:

npm install -g carbites-cli
added 71 packages, and audited 72 packages in 846ms
20 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities

Це додасть carbitesкоманду до середовища вашої оболонки:

carbites --help
  CLI tool for splitting a single CAR into multiple CARs from the comfort of your terminal.
  Usage
    $ carbites <command>
    Commands
      split
      join
Запуск із npx

Ви можете запустити carbitesкоманду, не інсталюючи її глобально, використовуючи npxкоманду, яка входить до складу Node.js:

npx carbites-cli --help

Перший раз він попросить переконатися, що ви хочете встановити пакет:

Need to install the following packages:
  carbites-cli
Ok to proceed? (y)

Після цього ви можете використовувати npx carbites-cliзамість carbitesдля будь-якої з наведених нижче команд!

Розбивка АВТОМОБІЛІВ

Команда carbites splitприймає файл CAR як вхідні дані та розбиває його на кілька менших файлів CAR.

Прапорець --sizeвстановлює максимальний розмір вихідних файлів CAR. Для завантаження на web3.storage --sizeмає бути менше 100MB.

Інший важливий прапор — це --strategy, який визначає спосіб розділення файлів CAR. Для завантажень web3.storage нам потрібно використовувати treewalkстратегію, щоб усі наші CAR мали однаковий кореневий CID. Це дозволить службі web3.storage знову зібрати їх усі докупи, коли всі їх буде завантажено.

Ось приклад із використанням вхідного файлу автомобіля, my-video.carякий має вагу 455 МБ:

carbites split --size 100MB --strategy treewalk my-video.car

Це створить п’ять нових файлів у тому самому каталозі, що й вхідний файл, my-video-0.carз іменем my-video-4.carЯкщо ви перерахуєте їхні розміри, ви побачите, що всі ланкові автомобілі менше або дорівнюють 100 МБ:

ls -lh my-video*
-rw-r--r--  1 user  staff   100M Sep 15 13:56 my-video-1.car
-rw-r--r--  1 user  staff   100M Sep 15 13:56 my-video-0.car
-rw-r--r--  1 user  staff   100M Sep 15 13:56 my-video-2.car
-rw-r--r--  1 user  staff   100M Sep 15 13:56 my-video-3.car
-rw-r--r--  1 user  staff    56M Sep 15 13:56 my-video-4.car
-rw-r--r--  1 user  staff   455M Sep 15 13:52 my-video.car

Приєднання до ЦАР

Щоб об’єднати CAR, які були раніше розділені, ви можете скористатися carbites joinкомандою:

carbites join my-video-*.car --output my-video-joined.car

Бібліотека carbites надає інтерфейс для поділу CAR, який можна викликати з коду програми.

Мабуть, це вам не потрібно!

Якщо ви використовуєте JavaScript, ви можете використовувати клієнт web3.storage для завантаження даних і дозволити клієнту подбати про розподіл CAR за вас. Якщо ви впевнені, що хочете самостійно відокремити CAR від JavaScript, читайте далі!

Щоб розділити CAR з коду JavaScript, встановіть carbitesпакет:

npm install carbites

І імпортуйте TreewalkCarSplitterклас у свій код:

import { TreewalkCarSplitter } from 'carbites/treewalk';

Ви можете створити TreewalkCarSplitter, передавши a CarReaderта a targetSizeв байтах для вихідних машин. Перегляньте розділ @ipld/car, щоб отримати додаткові відомості про CarReaderНаразі ми припустимо, що loadLargeCarфункція повертає CarReader, і використаємо TreewalkCarSplitterдля створення розділених CAR:

import { TreewalkCarSplitter } from 'carbites/treewalk';
async function splitCars() {
  const largeCar = await loadLargeCar();
  const targetSize = 100000000;
  const splitter = new TreewalkCarSplitter(largeCar, targetSize);
  for await (const smallCar of splitter.cars()) {
    // Each small car is an AsyncIterable<Uint8Array> of CAR data
    for await (const chunk of smallCar) {
      // Do something with the car data...
      // For example, you could upload it to the web3.storage HTTP API
      // https://web3.storage/docs/http-api.html#operation/post-car
    }
    // You can also get the root CID of each small CAR with the getRoots method:
    const roots = await smallCar.getRoots();
    console.log('root cids', roots);
    // Since we're using TreewalkCarSpliter, all the smaller CARs should have the
    // same root CID as the large input CAR.
  }
}

Модуль go-carbites можна використовувати для відокремлення великих CAR від ваших програм Go.

Встановіть модуль за допомогою go get:

go get github.com/alanshaw/go-carbites

Функція повертає a carbites.Split,carbites.Splitter який гарантує, що вихідні CAR мають однаковий кореневий CID, що важливо під час завантаження на web3.storage.

package main

import (
        "io"
        "os"
        "github.com/alanshaw/go-carbites"
)

func main() {
        bigCar, _ := os.Open("big.car")
        targetSize := 1024 * 1024 // 1MiB chunks
        strategy := carbites.Treewalk
        spltr, _ := carbites.Split(bigCar, targetSize, strategy)

        var i int
        for {
                car, err := spltr.Next()
                if err != nil {
                        if err == io.EOF {
                                break
                        }
                        panic(err)
                }
                b, _ := ioutil.ReadAll(car)
                ioutil.WriteFile(fmt.Sprintf("chunk-%d.car", i), b, 0644)
                i++
        }
}

Ви також можете використовувати NewTreewalkSplitterFromPath, який приймає локальний шлях до файлу замість io.Reader.

Розширені формати IPLD

IPLD також можна використовувати як формат даних загального призначення, наприклад JSON. Фактично, ви можете використовувати JSON безпосередньо як IPLD, просто використовуючи спеціальну угоду для зв’язування з іншими об’єктами IPLD. Ця конвенція визначена в dag-json"кодеку" .

Ось приклад dag-jsonоб’єкта:

{
  "name": "Have you seen this dog?",
  "description": "I have now...",
  "image": { "/": "bafybeihkqv2ukwgpgzkwsuz7whmvneztvxglkljbs3zosewgku2cfluvba" }
}

Поле imageвикористовує спеціальний «тип посилання» для посилання на інший об’єкт IPLD. Посилання — це звичайний об’єкт JSON з одним ключем під назвою /, значенням якого є ідентифікатор вмісту.

Незважаючи на те, що dag-jsonвін знайомий і простий у використанні, ми рекомендуємо замість нього використовувати аналогічний dag-cborкодек . dag-cborвикористовує стисле представлення двійкових об’єктів для більш ефективного кодування даних, особливо двійкових даних, які мають бути закодовані за допомогою Base64 під час використання dag-json.

Приклади

Нижче наведено кілька прикладів роботи з dag-cborданими та їх надсилання на web3.storage.

По-перше, вам потрібно буде імпортувати деякі речі:

import { Web3Storage } from 'web3.storage'
import { CarReader } from '@ipld/car'
import { encode } from 'multiformats/block'
import * as cbor from '@ipld/dag-cbor'
import { sha256 } from 'multiformats/hashes/sha2'
// #endregion cborLinkExample

// #region makeUnixFsFile
import { importer } from 'ipfs-unixfs-importer'
import { MemoryBlockStore } from 'ipfs-car/blockstore/memory'

Тепер ми визначимо зручну функцію для кодування блоку IPLD даних CBOR і хешу за допомогою SHA2-256:

async function encodeCborBlock (value) {
  return encode({ value, codec: cbor, hasher: sha256 })
}

І функція для створення CAR із колекції блоків і кореневого CID:

async function makeCar (rootCID, ipldBlocks) {
  return new CarReader(1, [rootCID], ipldBlocks)
}

Зберігання простих даних CBOR

Використовуючи помічники вище, ви можете створити файл CAR з одним блоком простих даних CBOR і надіслати його до web3.storage:

async function simpleCborExample () {
  // encode the value into an IPLD block and store with web3.storage
  const block = await encodeCborBlock({ hello: 'world' })
  const car = await makeCar(block.cid, [block])

  // upload to web3.storage using putCar
  const client = new Web3Storage({ token: process.env.WEB3STORAGE_TOKEN })
  console.log('🤖 Storing simple CBOR object...')
  const cid = await client.putCar(car)
  console.log(`🎉 Done storing simple CBOR object. CID: ${cid}`)
  console.log(`💡 If you have ipfs installed, try: ipfs dag get ${cid}\n`)
}

Якщо у вас встановлено програму командного рядка IPFS, ви можете переглянути об’єкт, який ви зберегли за допомогою ipfs dag getкоманди , наприклад:

ipfs dag get bafyreidykglsfhoixmivffc5uwhcgshx4j465xwqntbmu43nb2dzqwfvae
{
  "hello": "world"
}

Зауважте, що вихідні дані прикладу мають відступ jq для ясності. Команда real виведе компактне dag-jsonпредставлення даних CBOR без додаткових пробілів.

CBOR з посиланнями IPLD

Ви можете зв’язати один об’єкт CBOR з іншим за допомогою CID:

async function cborLinkExample () {
  // Encode a simple object to get its CID
  const addressBlock = await encodeCborBlock({ email: 'zaphod@beeblebrox.galaxy' })

  // Now we can use the CID to link to the object from another object
  const personBlock = await encodeCborBlock({
    title: 'Galactic President',
    description: 'Just this guy, you know?',
    contact: addressBlock.cid
  })

  // pack everything into a CAR
  const car = await makeCar(personBlock.cid, [personBlock, addressBlock])

  // upload to web3.storage using putCar
  const client = new Web3Storage({ token: process.env.WEB3STORAGE_TOKEN })

  console.log('🤖 Storing CBOR objects with CID links between them...')
  const cid = await client.putCar(car)
  console.log('🎉 Stored linked data using dag-cbor. Root CID:', cid)
  console.log(`💡 If you have ipfs installed, try: ipfs dag get ${cid}`)
  console.log(`🔗 You can also traverse the link by path: ipfs dag get ${cid}/contact\n`)
}
async function makeUnixFsFile (source) {
  const blockstore = new MemoryBlockStore()
  // taken from https://github.com/web3-storage/ipfs-car/blob/main/src/pack/constants.ts
  // but with wrapWithDirectory overriden to false
  const unixFsOptions = {
    cidVersion: 1,
    chunker: 'fixed',
    maxChunkSize: 262144,
    hasher: sha256,
    rawLeaves: true,
    wrapWithDirectory: false,
    maxChildrenPerNode: 174
  }
  const importStream = await importer(source, blockstore, unixFsOptions)
  let root = null
  for await (const entry of importStream) {
    root = entry
  }
  const blocks = []
  for await (const block of blockstore.blocks()) {
    blocks.push(block)
  }
  await blockstore.close()
  return { root, blocks }
}
// #endregion makeUnixFsFile

// #region cborLinkToFileExample
async function cborLinkToFileExample () {
  const source = [{
    path: 'example.txt',
    content: new TextEncoder().encode('Some plain text, encoded to UTF-8')
  }]
  const { root, blocks } = await makeUnixFsFile(source)
  const cborBlock = await encodeCborBlock({
    description: 'A CBOR object that references a UnixFS file object by CID',
    file: root.cid
  })

  blocks.push(cborBlock)
  const car = await makeCar(cborBlock.cid, blocks)

  const client = new Web3Storage({ token: process.env.WEB3STORAGE_TOKEN })
  console.log('🤖 Storing a CBOR object that links to a UnixFS file by CID...')
  const cid = await client.putCar(car)
  console.log('🎉 Stored dag-cbor object that links to a unixfs file. Root CID: ', cid)
  console.log(`💡 If you have ipfs installed, try: ipfs dag get ${cid}`)
  console.log(`💾 You can view the linked file with ipfs: ipfs cat ${cid}/file`)
  console.log('🔗 View linked file via IPFS gateway: ', `https://${cid}.ipfs.dweb.link/file`)
}
// #endregion cborLinkToFileExample

simpleCborExample()
  .then(cborLinkExample)
  .then(cborLinkToFileExample)
  .catch(console.error)

Як і у випадку з простими об’єктами, ви можете використовувати ipfs dag getдля показу зовнішнього об’єкта:

ipfs dag get bafyreieq6bftbe3o46lrdbzj6vrvyee4njfschajxgmpxwbqex3czifhry
{
  "contact": {
    "/": "bafyreicp2g6ez5exmw5uxsns7kkwtxr5z4vyx4xkdci6xpy2vou3zqc6me"
  },
  "description": "Just this guy, you know?",
  "title": "Galactic President"
}

Поле contactвище містить посилання IPLD, яке можна включити в ipfs dag getкоманду для вирішення пов’язаного об’єкта:

ipfs dag get bafyreieq6bftbe3o46lrdbzj6vrvyee4njfschajxgmpxwbqex3czifhry/contact
{ "email": "zaphod@beeblebrox.galaxy" }

Посилання з CBOR на файл IPFS

Наш останній приклад трохи складніший. Ми збираємося зберегти файл у тому самому форматі UnixFS, який використовує IPFS, і створити посилання на нього з об’єкта CBOR.

Спочатку ми закодуємо файл у формат UnixFS. Зазвичай це робиться клієнтською бібліотекою, але ми хочемо отримати CID файлового об’єкта для нашого посилання, перш ніж надсилати файл до web3.storage, тому ми створимо об’єкт UnixFS самостійно.

Ось допоміжна функція для створення файлу UnixFS і кодування його в блок IPLD:

import { importer } from 'ipfs-unixfs-importer'
import { MemoryBlockStore } from 'ipfs-car/blockstore/memory'
// #endregion imports

// #region encodeCborBlock
async function encodeCborBlock (value) {
  return encode({ value, codec: cbor, hasher: sha256 })
}
// #endregion encodeCborBlock

// #region makeCar
async function makeCar (rootCID, ipldBlocks) {
  return new CarReader(1, [rootCID], ipldBlocks)
}
// #endregion makeCar

// #region simpleCborExample
async function simpleCborExample () {
  // encode the value into an IPLD block and store with web3.storage
  const block = await encodeCborBlock({ hello: 'world' })
  const car = await makeCar(block.cid, [block])

  // upload to web3.storage using putCar
  const client = new Web3Storage({ token: process.env.WEB3STORAGE_TOKEN })
  console.log('🤖 Storing simple CBOR object...')
  const cid = await client.putCar(car)
  console.log(`🎉 Done storing simple CBOR object. CID: ${cid}`)
  console.log(`💡 If you have ipfs installed, try: ipfs dag get ${cid}\n`)
}
// #endregion simpleCborExample

// #region cborLinkExample
async function cborLinkExample () {
  // Encode a simple object to get its CID
  const addressBlock = await encodeCborBlock({ email: 'zaphod@beeblebrox.galaxy' })

  // Now we can use the CID to link to the object from another object
  const personBlock = await encodeCborBlock({
    title: 'Galactic President',
    description: 'Just this guy, you know?',
    contact: addressBlock.cid
  })

  // pack everything into a CAR
  const car = await makeCar(personBlock.cid, [personBlock, addressBlock])

  // upload to web3.storage using putCar
  const client = new Web3Storage({ token: process.env.WEB3STORAGE_TOKEN })

  console.log('🤖 Storing CBOR objects with CID links between them...')
  const cid = await client.putCar(car)
  console.log('🎉 Stored linked data using dag-cbor. Root CID:', cid)
  console.log(`💡 If you have ipfs installed, try: ipfs dag get ${cid}`)
  console.log(`🔗 You can also traverse the link by path: ipfs dag get ${cid}/contact\n`)
}
async function makeUnixFsFile (source) {
  const blockstore = new MemoryBlockStore()
  // taken from https://github.com/web3-storage/ipfs-car/blob/main/src/pack/constants.ts
  // but with wrapWithDirectory overriden to false
  const unixFsOptions = {
    cidVersion: 1,
    chunker: 'fixed',
    maxChunkSize: 262144,
    hasher: sha256,
    rawLeaves: true,
    wrapWithDirectory: false,
    maxChildrenPerNode: 174
  }
  const importStream = await importer(source, blockstore, unixFsOptions)
  let root = null
  for await (const entry of importStream) {
    root = entry
  }
  const blocks = []
  for await (const block of blockstore.blocks()) {
    blocks.push(block)
  }
  await blockstore.close()
  return { root, blocks }
}

Помічник повертає rootблок, на який ми можемо посилатися за CID, а також blocksмасив, що містить закодовані дані файлу. Коли ми створюємо CAR для надсилання в web3.storage, важливо включити всі блоки файлів, а також блок CBOR.

async function cborLinkToFileExample () {
  const source = [{
    path: 'example.txt',
    content: new TextEncoder().encode('Some plain text, encoded to UTF-8')
  }]
  const { root, blocks } = await makeUnixFsFile(source)
  const cborBlock = await encodeCborBlock({
    description: 'A CBOR object that references a UnixFS file object by CID',
    file: root.cid
  })

  blocks.push(cborBlock)
  const car = await makeCar(cborBlock.cid, blocks)

  const client = new Web3Storage({ token: process.env.WEB3STORAGE_TOKEN })
  console.log('🤖 Storing a CBOR object that links to a UnixFS file by CID...')
  const cid = await client.putCar(car)
  console.log('🎉 Stored dag-cbor object that links to a unixfs file. Root CID: ', cid)
  console.log(`💡 If you have ipfs installed, try: ipfs dag get ${cid}`)
  console.log(`💾 You can view the linked file with ipfs: ipfs cat ${cid}/file`)
  console.log('🔗 View linked file via IPFS gateway: ', `https://${cid}.ipfs.dweb.link/file`)
}

Як і раніше, ми можемо переглянути кореневий блок за допомогою ipfs dag get:

ipfs dag get bafyreid7hvce4pzcy56s4hwu7xrt3dnnzzfvilzfwsadvf6q4eqild6ndy
{
  "description": "A CBOR object that references a UnixFS file object by CID",
  "file": {
    "/": "bafkreihmlglmfpadbk4fy72ljniveedbqicysoe5zhqqkgkuso3e6xyns4"
  }
}

Оскільки дані файлу є звичайним текстом, ви можете скористатися ipfs dag getдля отримання його вмісту:

ipfs dag get bafyreid7hvce4pzcy56s4hwu7xrt3dnnzzfvilzfwsadvf6q4eqild6ndy/file
"Some plain text, encoded to UTF-8"

Зверніть увагу, що вміст файлу взято в лапки, оскільки dag getвін інтерпретує вміст як рядок JSON.

Щоб уникнути цього або отримати двійкові файли, ви можете скористатися ipfs getдля завантаження файлу:

ipfs get bafyreid7hvce4pzcy56s4hwu7xrt3dnnzzfvilzfwsadvf6q4eqild6ndy/file
Saving file(s) to file
 33 B / 33 B [===============================================================] 100.00% 0s

Зауважте, що HTTP-шлюз IPFS наразі не підтримує візуалізацію даних CBOR, тому кореневий об’єкт не можна безпосередньо переглянути через шлюз. Для отримання додаткової інформації див. примітку про підтримку шлюзу нижче.

Однак шлюз може проходити через посилання IPLD всередині нашого об’єкта CBOR, тому ви можете посилатися на файл за допомогою шляху, і шлюз вирішить зв’язаний файл. Наприклад:

https://bafyreid7hvce4pzcy56s4hwu7xrt3dnnzzfvilzfwsadvf6q4eqild6ndy.ipfs.dweb.link/file.

Підтримка шлюзу

Хоча web3.storage підтримує зберігання файлів CAR із dag-cborвмістом за замовчуванням і може приймати інші кодеки з decodersопцією, HTTP-шлюз IPFS наразі не «розмовляє» в цих форматах і не повертатиме такі дані через HTTP. Слідкуйте за цим випуском , щоб відстежувати розвиток цієї функції.

Увімкнення кодеків IPLD у клієнтській бібліотеці

putCarЗа замовчуванням метод клієнта прийматиме дані, закодовані за допомогою кодеків dag-pbdag-cborабо . rawЯкщо ви хочете використовувати інший кодек, як-от dag-json, ви повинні включити цей кодек у decodersпараметр для putCar.

Перегляньте putCarпосилання на параметри для отримання додаткової інформації та прикладу використання dag-json.

Просмотры:

Коментарі

Популярні публікації