Справочникdocs/reference/media-service.md

Изображения активов и история цен

parano1d-media распространяет публичные метаданные активов, статические изображения и историю подтверждённых сделок. Публикация изображений использует нативные чеки и хеши содержимого. История цен следует каноническим блокам полностью проверяющей локальной ноды. Сервис и нода запускаются на одном хосте.

Сборка и настройка

sh
cargo build --release --locked -p noid_gui --bin parano1d-media

Настройте отдельный каталог хранения, loopback-адрес сервиса, RPC локальной ноды и квоты:

sh
export NOID_MEDIA_STORE=/srv/parano1d-media
export NOID_MEDIA_LISTEN=127.0.0.1:9610
export NOID_MEDIA_RPC=http://127.0.0.1:9601
export NOID_MEDIA_QUOTA_MIB=4096
export NOID_HISTORY_QUOTA_MIB=1024
./target/release/parano1d-media

Один процесс удерживает право записи в хранилище. Разместите TLS reverse proxy перед loopback-адресом. Ограничьте частоту запросов на прокси, установите максимум тела запроса 10 518 528 байт и сохраняйте фиксированную длину запроса. Сервис ограничивает заголовки, размер загрузки, ответы ноды, время ожидания, декодирование изображений и число одновременных запросов. Chunked-обрамление запросов и перенаправления отклоняются.

По умолчанию кошелёк использует https://tradedata.parano1d.org/. Для отдельного развёртывания или изолированной тестовой сети задайте другой origin:

sh
export NOID_GUI_MEDIA_ORIGIN=https://tradedata.parano1d.org/
./target/release/parano1d-gui

Origin состоит из хоста, необязательного порта и пути /. Информация пользователя, строки запроса, фрагменты и префиксы пути отклоняются. HTTP разрешён только на loopback для изолированной разработки. Задайте одинаковый origin для кошельков с общим реестром. Внешние загрузки следуют сохранённой настройке External data, исходное значение которой Off.

Проверки публикации

POST /publish принимает схему 1 с metadata_hash, manifest_hex, необязательным image_hex и receipt_hex. Неизвестные поля отклоняются. Сервис вызывает paranoid_verifyReceipt на собственной loopback-ноде и требует три флага: merkle_valid, canonical и confirmed.

Затем сервис сопоставляет точный хеш метаданных и тип манифеста с аутентифицированными эффектами создания нативного объекта или выходом NFT. Идентичности токенов и коллекций берутся из native.created. Выходы NFT связывают ID коллекции и номер. Чек подготовки отдельного NFT позволяет опубликовать зафиксированное изображение до завершения выпуска. Проверенная высота чека записывается с публичным доказательством. Текущие права расходования определяются текущим State.

Канонический манифест использует BLAKE3 с разделением доменов. Изображения имеют отдельный доменно-разделённый хеш. Сервис проверяет оба, декодирует PNG в пределах установленного размера и атомарно записывает неизменяемые файлы. Повторная допустимая публикация устраняет дубли. Квота учитывает частично зафиксированные объекты после прерванной записи. Следующая попытка может завершить оставшиеся объекты.

Чтение и резервное копирование

Публичные маршруты чтения:

text
GET /metadata/<64 lowercase hex characters>.json
GET /images/<64 lowercase hex characters>.png
GET /history/<64 lowercase hex asset ID>/<end height>.json

Ответы используют фиксированные типы содержимого, nosniff и ограничительную Content Security Policy. Изображения и манифесты получают заголовки неизменяемого кеша. История использует no-store, чтобы канонические изменения быстро становились видны. После загрузки кошелёк проверяет коммитменты изображения и манифеста.

История цен

Сервис индексирует подтверждённые исполнения в базе MDBX history/. Каждый блок атомарно фиксирует заголовок, затронутые активы и свечи. При изменении канонической цепи смещённые записи удаляются перед индексацией замещающих блоков. Квота истории по умолчанию равна 1 024 MiB. База растёт постепенно. Увеличивайте NOID_HISTORY_QUOTA_MIB по мере роста архива.

Непрерывная работа сохраняет цены за пределами окна выдачи блоков ноды. При запуске сервис индексирует доступные недавние блоки, после перезапуска продолжает с сохранённого курсора. Если пропущенный диапазон уже удалён нодой, индексация продолжается с доступного недавнего диапазона.

Метод истории возвращает максимум 512 блоков для одного актива с окончанием на запрошенной высоте или последнем проиндексированном блоке. Цены используют точные количества NOID и токенов. Каждая свеча содержит первую, максимальную, минимальную и последнюю цену исполнения, а также число сделок. Кошелёк сверяет идентичность сети ответа и конечный заголовок со своей нодой.

Кошелёк запрашивает историю открытого токена DEX, когда External data включена. Ответ хранится в ограниченной памяти. Текущая цена и живая линия цены поступают от собственной ноды при обоих положениях переключателя.

Копируйте в медиа-репозиторий следующие три каталога:

text
metadata/<metadata hash>.json
images/<image hash>.png
proofs/<transaction ID>-<metadata hash>.json

Исключайте service.lock, временные файлы и приватный каталог кошелька queue/. Сохраняйте публичные чеки вместе с записями привязки. Перед копированием остановите сервис или создайте согласованный снимок файловой системы. После восстановления проверьте все коммитменты манифестов и изображений перед запуском сервиса:

sh
./target/release/parano1d-media --verify-store /srv/parano1d-media

Сохраняйте history/ как согласованный снимок базы при остановленном сервисе или через снимок файловой системы. Публичный репозиторий изображений хранит перечисленные выше метаданные, изображения и файлы доказательств публикации.

Команда проверяет целостность содержимого офлайн. Каноничность чека проверяется по локальной ноде при публикации. Сохранённая запись публикации указывает высоту успешной проверки. Восстановленные медиа по-прежнему сверяются с коммитментом текущего State каждого принимающего кошелька.

Техническая документация ParanO(1)dПоведение консенсуса определяется исходным кодом.