Изображения активов и история цен
parano1d-media распространяет публичные метаданные активов, статические изображения и историю подтверждённых сделок. Публикация изображений использует нативные чеки и хеши содержимого. История цен следует каноническим блокам полностью проверяющей локальной ноды. Сервис и нода запускаются на одном хосте.
Сборка и настройка
cargo build --release --locked -p noid_gui --bin parano1d-media
Настройте отдельный каталог хранения, loopback-адрес сервиса, RPC локальной ноды и квоты:
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:
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 в пределах установленного размера и атомарно записывает неизменяемые файлы. Повторная допустимая публикация устраняет дубли. Квота учитывает частично зафиксированные объекты после прерванной записи. Следующая попытка может завершить оставшиеся объекты.
Чтение и резервное копирование
Публичные маршруты чтения:
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 включена. Ответ хранится в ограниченной памяти. Текущая цена и живая линия цены поступают от собственной ноды при обоих положениях переключателя.
Копируйте в медиа-репозиторий следующие три каталога:
metadata/<metadata hash>.json
images/<image hash>.png
proofs/<transaction ID>-<metadata hash>.json
Исключайте service.lock, временные файлы и приватный каталог кошелька queue/. Сохраняйте публичные чеки вместе с записями привязки. Перед копированием остановите сервис или создайте согласованный снимок файловой системы. После восстановления проверьте все коммитменты манифестов и изображений перед запуском сервиса:
./target/release/parano1d-media --verify-store /srv/parano1d-media
Сохраняйте history/ как согласованный снимок базы при остановленном сервисе или через снимок файловой системы. Публичный репозиторий изображений хранит перечисленные выше метаданные, изображения и файлы доказательств публикации.
Команда проверяет целостность содержимого офлайн. Каноничность чека проверяется по локальной ноде при публикации. Сохранённая запись публикации указывает высоту успешной проверки. Восстановленные медиа по-прежнему сверяются с коммитментом текущего State каждого принимающего кошелька.