SHA256
98 lines
4.1 KiB
Markdown
98 lines
4.1 KiB
Markdown
# ANS-104 / Arweave transport для пользовательских блоков SHiNE
|
||
|
||
## Цель
|
||
|
||
Каждый пользовательский блок уже на клиенте является самостоятельным подписанным ANS-104 DataItem. Сервер не переподписывает пользовательский контент: он проверяет его, хранит в PostgreSQL и объединяет готовые DataItems в стандартный ANS-104 bundle.
|
||
|
||
## Child DataItem tags
|
||
|
||
Обязательно для тестового контура:
|
||
|
||
```text
|
||
App=test5590
|
||
```
|
||
|
||
Дополнительно для блоков конкретного канала:
|
||
|
||
```text
|
||
c=<canonical_channel_slug>
|
||
```
|
||
|
||
Теги входят в 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.
|