4.1 KiB
ANS-104 / Arweave transport для пользовательских блоков SHiNE
Цель
Каждый пользовательский блок уже на клиенте является самостоятельным подписанным ANS-104 DataItem. Сервер не переподписывает пользовательский контент: он проверяет его, хранит в PostgreSQL и объединяет готовые DataItems в стандартный ANS-104 bundle.
Child DataItem tags
Обязательно для тестового контура:
App=test5590
Дополнительно для блоков конкретного канала:
c=<canonical_channel_slug>
Теги входят в ANS-104 подпись пользователя.
Publisher
По умолчанию цикл — раз в 15 минут.
blocks.arweave_publish_pending=true
↓
готовые serialized DataItems
↓
ANS-104 binary bundle
↓
обычная Arweave L1 transaction
Если pending-блоков нет, транзакция не создаётся.
Root transaction содержит стандартные bundle tags:
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
Каждый сервер может независимо искать:
App=test5590
через GraphQL gateway с cursor pagination.
Для каждого нового DataItem:
- взять
idиbundledIn.id; - получить root bundle;
- извлечь точные serialized bytes child DataItem по bundle index;
- проверить
dataItemId == SHA256(signature); - проверить ANS-104 Ed25519 подпись;
- определить пользователя по
owner; - применить обычные проверки
AddBlock; - записать в 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.