# AddBlock API ## Назначение Добавляет один готовый подписанный пользовательский SHiNE Frame v1 / ANS-104 DataItem в blockchain. ## Request ```json { "op": "AddBlock", "requestId": "...", "payload": { "blockchainName": "alice-...", "blockNumber": 42, "prevBlockHash": "64 hex chars", "blockBytesB64": "..." } } ``` - `blockchainName` — целевая пользовательская chain; - `blockNumber` — должен совпадать с номером внутри Frame v1 и быть `serverLast + 1`; - `prevBlockHash` — 32-byte SHiNE hash предыдущего Frame в hex; должен совпадать с `prevHash32` внутри Frame и серверной вершиной; - `blockBytesB64` — **полный serialized ANS-104 DataItem** в Base64. Старый формат `preimage + sigMarker + signature` не поддерживается. ## Требования к DataItem - generic Ed25519 signature type `2`; - Ed25519 signature 64 bytes; - owner 32 bytes и равен текущему blockchain public key; - обязательный тестовый tag `App=test5590`; - для channel block — `c=`; - `data` содержит SHiNE Frame v1 (`frameCode=1`). ## Основные ошибки - `bad_app_tag` — отсутствует/неверен `App=test5590`; - `bad_channel_tag` — `c` отсутствует, лишний или не совпадает с canonical slug; - `bad_signature` / `signature_verify_failed` — DataItem не подписан текущим blockchain key; - `bad_block_number` — нарушена последовательность; - `bad_prev_hash` — нарушена SHiNE hash chain; - `bad_block_bytes` — DataItem/Frame не парсится. ## Storage/publish После успешного локального AddBlock полный DataItem хранится в PostgreSQL и ставится в Arweave publish queue. Импорт из Arweave использует ту же проверку, но не ставит блок на повторную публикацию.