# ANS-104 / Arweave transport для пользовательских блоков SHiNE ## Цель Каждый пользовательский блок уже на клиенте является самостоятельным подписанным ANS-104 DataItem. Сервер не переподписывает пользовательский контент: он проверяет его, хранит в PostgreSQL и объединяет готовые DataItems в стандартный ANS-104 bundle. ## Child DataItem tags Обязательно для тестового контура: ```text App=test5590 ``` Дополнительно для блоков конкретного канала: ```text c= ``` Теги входят в ANS-104 подпись пользователя. ## Publisher По умолчанию цикл — раз в 15 минут. ```text blocks.arweave_publish_pending=true ↓ готовые serialized DataItems ↓ ANS-104 binary bundle ↓ обычная Arweave L1 transaction ``` Если pending-блоков нет, транзакция не создаётся. Root transaction содержит стандартные bundle tags: ```text Bundle-Format=binary Bundle-Version=2.0.0 Content-Type=application/octet-stream App=test5590-batch ``` `App=test5590-batch` намеренно отличается от child `App=test5590`, чтобы discovery-запрос находил пользовательские блоки, а не root bundles. После успешной L1-загрузки сервер ставит child-блокам: - `arweave_publish_pending=false`; - `arweave_published_at_ms`; - `arweave_root_tx_id`. ## Importer Каждый сервер может независимо искать: ```text App=test5590 ``` через GraphQL gateway с cursor pagination. Для каждого нового DataItem: 1. взять `id` и `bundledIn.id`; 2. получить root bundle; 3. извлечь точные serialized bytes child DataItem по bundle index; 4. проверить `dataItemId == SHA256(signature)`; 5. проверить ANS-104 Ed25519 подпись; 6. определить пользователя по `owner`; 7. применить обычные проверки `AddBlock`; 8. записать в PostgreSQL с `arweave_publish_pending=false`. ### Блоки могут прийти не по порядку Discovery/import использует persistent queue `arweave_block_import_queue`. Если, например, block 102 увиден раньше block 101, block 102 остаётся `PENDING`; после появления 101 очередь повторно проигрывается. ## Дедупликация и несколько серверов Один и тот же готовый DataItem имеет один `data_item_id = SHA256(signature)`. Если несколько серверов включили его в разные root bundles, локально это всё равно один логический блок: `blocks.data_item_id` уникален. Импортированный из Arweave блок **не ставится обратно в publish queue**. Это предотвращает бесконечное переархивирование между серверами. ## Локальное хранение Пользовательские blockchain-файлы на диске больше не используются. Полный serialized DataItem находится в `blocks.block_bytes` PostgreSQL. ## Настройки См. `application.properties` и `CODEX_APPLY_ANS104_TEST5590_PATCH.md`. ## Что намеренно не входит в этот патч Remote/homeserver signing path, связанный с внешним homeserver/ESP32 signer, не мигрируется этим патчем. Каталог `ESP32/` не изменяется. До отдельной миграции новый Frame v1/ANS-104 production path рассчитан на клиент, у которого локально доступен blockchain Ed25519 key.