Files
SHiNE-server/docs/Blockchain/17_ANS104_Arweave_Transport.md
T

4.1 KiB
Raw Blame History

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:

  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.