# Применение patch: Turbo + direct Arweave для `App=test5590` ## Что меняется - `arweave.blocks.publish.mode=turbo|arweave|none` вместо boolean publisher switch. - `turbo`: каждый готовый user-signed ANS-104 DataItem отправляется в Turbo отдельно. - `arweave`: сохранён прямой L1 fallback — несколько user DataItems собираются в standard ANS-104 bundle. - `none`: наружу ничего не публикуется. - Importer всегда ищет только individual `App=test5590` DataItems. - `App=test5590-batch` больше не используется. - Channel tag: `c_test5590=` вместо `c=...`. - Удалены `blocks.arweave_root_tx_id` и `arweave_block_import_queue.root_tx_id`. - Схема PostgreSQL: v25. ## Минимальная настройка Turbo ```properties arweave.blocks.publish.mode=turbo arweave.blocks.publish.turbo.uploadUrl=https://turbo.ardrive.io/tx ``` Для действующего free tier маленьких DataItem этого может быть достаточно. Если upload платный и расходы должны идти с server Turbo Credits: ```properties arweave.blocks.publish.turbo.walletJwkPath=/home/player/SHiNE/secrets/turbo-wallet.json # либо вместо JWK сразу публичный адрес: # arweave.blocks.publish.turbo.paidByAddress= ``` JWK не отправляется Turbo: из него вычисляется публичный address для `x-paid-by`. Для чужого signed DataItem платные Turbo Credits требуют действующего Credit Share Approval от server payer к signer-адресу DataItem. Если его нет, Turbo вернёт HTTP 402, а блок останется pending для повторной попытки. ## Direct Arweave fallback ```properties arweave.blocks.publish.mode=arweave arweave.blocks.publish.walletJwkPath=/home/player/SHiNE/secrets/arweave-wallet.json arweave.blocks.publish.gateway=https://arweave.net ``` Root bundle больше не получает `App=test5590-batch`; child DataItems уже содержат `App=test5590` и именно их индексирует importer. ## Отключение публикации ```properties arweave.blocks.publish.mode=none ``` Это не отключает `arweave.blocks.sync.enabled`: read/import и publish независимы. ## Importer ```properties arweave.blocks.sync.enabled=true arweave.blocks.sync.gateway=https://turbo-gateway.com arweave.blocks.sync.maxDataItemBytes=8388608 ``` Importer: 1. GraphQL `App=test5590`; 2. `/ar-io/offsets/`; 3. range `GET /raw/`; 4. проверка exact signed DataItem ID + signature; 5. обычный `AddBlock` import. ## Миграция БД При старте schema v24 автоматически применит `migration_v25.sql`, которая удаляет два root-tx поля и ставит version 25. ## Проверка после применения 1. Создать новый channel/post и проверить signed tag `c_test5590=`. 2. В `mode=turbo` убедиться, что `blocks.data_item_id` совпадает с Turbo response `id` и pending становится false. 3. На втором сервере включить sync и убедиться, что DataItem находится GraphQL-запросом `App=test5590` и импортируется без прямой server-to-server связи. 4. Переключить первый сервер в `mode=arweave`, создать ещё несколько блоков и убедиться, что тот же importer второго сервера видит child DataItems без знания root bundle ID. 5. Проверить `mode=none`: новые локальные блоки остаются pending, наружу ничего не отправляется.