# Полный архив документации FastNear Builder Docs AI-читабельные Markdown-копии авторских гайдов и канонических маршрутов `/rpcs/**` и `/apis/**`. --- ## Справочник RPC / API - HTML-маршрут: https://docs.fastnear.com/ru - Markdown-маршрут: https://docs.fastnear.com/ru/index.md **Источник:** [https://docs.fastnear.com/ru](https://docs.fastnear.com/ru) Обзор документации FastNear Выберите API или справочник FastNear. Используйте RPC для канонических чтений состояния по JSON-RPC, вызовов контрактов и отправки транзакций. Используйте индексированные API для балансов, активов, истории активности и свежих данных семейства блоков. [Начать с FastNear API](https://docs.fastnear.com/ru/api) [Начать с RPC](https://docs.fastnear.com/ru/rpc) [Получить API-ключ](https://docs.fastnear.com/ru/auth) Аутентификация API-ключи FastNear работают и для RPC, и для API. Заголовок Authorization: Bearer ... URL-параметр ?apiKey=... Сначала возьмите ключ — войдите на [dashboard.fastnear.com](https://dashboard.fastnear.com) через Google или email, получите бесплатные стартовые кредиты и подключайте месячную подписку или бессрочные резервные кредиты только тогда, когда понадобятся повышенные лимиты. Быстрая маршрутизация Большинство команд начинают здесь [FastNear API](https://docs.fastnear.com/ru/api) Индексированные эндпоинты для аккаунтов, активов, стейкинга и публичных ключей для чтения в прикладных сценариях вокруг аккаунта. На уровне протокола [Справочник RPC](https://docs.fastnear.com/ru/rpc) Канонические методы JSON-RPC для блоков, вызовов контрактов, валидаторов и отправки транзакций. История исполнения [Транзакции API](https://docs.fastnear.com/ru/tx) Активность аккаунта, квитанции, поиск транзакций и история по блокам из индексированных данных исполнения. Чтения с низкой задержкой [NEAR Data API](https://docs.fastnear.com/ru/neardata) Свежие оптимистичные и финализированные блоки, заголовки и вспомогательные перенаправления для опроса и лёгкого мониторинга. Основные API и справочники Это основные точки входа FastNear. Начните с API или раздела справочника, подходящего под нужные данные, затем переходите к подробному справочнику по конкретному эндпоинту. Индексированные представления аккаунта [FastNear API](https://docs.fastnear.com/ru/api) Используйте индексированные REST-эндпоинты для балансов, NFT, позиций стейкинга и поиска по публичному ключу без сырых обёрток запросов и ответов JSON-RPC. Полезные ссылки [Полное состояние аккаунта](https://docs.fastnear.com/ru/api/v1/account-full) [Балансы FT-токенов](https://docs.fastnear.com/ru/api/v1/account-ft) [Активы NFT](https://docs.fastnear.com/ru/api/v1/account-nft) [Поиск по публичному ключу](https://docs.fastnear.com/ru/api/v1/public-key) Канонический JSON-RPC [Справочник RPC](https://docs.fastnear.com/ru/rpc) Используйте методы на уровне протокола для прямых чтений состояния, отправки транзакций, вызовов контрактов и инспекции цепочки. Полезные ссылки [Состояние аккаунта](https://docs.fastnear.com/ru/rpc/account/view-account) [Поиск блоков](https://docs.fastnear.com/ru/rpc/block/block-by-id) [view-вызовы контрактов](https://docs.fastnear.com/ru/rpc/contract/call-function) [Данные валидаторов](https://docs.fastnear.com/ru/rpc/validators/validators-current) История исполнения [Транзакции API](https://docs.fastnear.com/ru/tx) Используйте индексированные эндпоинты для активности аккаунта, квитанций, поиска транзакций и истории исполнения по блокам. Полезные ссылки [Активность аккаунта](https://docs.fastnear.com/ru/tx/account) [Поиск транзакций](https://docs.fastnear.com/ru/tx/transactions) [Трассировка квитанций](https://docs.fastnear.com/ru/tx/receipt) [История транзакций по блоку](https://docs.fastnear.com/ru/tx/blocks) Свежие чтения семейства блоков [NEAR Data API](https://docs.fastnear.com/ru/neardata) Используйте NEAR Data для свежих оптимистичных и финализированных блоков, заголовков блоков и маршрутов-помощников по последнему блоку, когда нужны чтения почти в реальном времени или лёгкий мониторинг. Полезные ссылки [Оптимистичные чтения блоков](https://docs.fastnear.com/ru/neardata/block-optimistic) [Последний финализированный блок](https://docs.fastnear.com/ru/neardata/last-block-final) [Опрос заголовков блоков](https://docs.fastnear.com/ru/neardata/block-headers) Операции и доступ Всё, о чём команды обычно спрашивают перед переходом на продовые лимиты. Держите под рукой на переходе от исследования к продовым нагрузкам. Повышенные лимиты [Аутентификация и доступ](https://docs.fastnear.com/ru/auth) Один API-ключ FastNear работает и для RPC, и для REST API. Ключи и оплата [Dashboard](https://dashboard.fastnear.com) Войдите, создайте ключи и переходите на сценарии с более высокими лимитами, когда понадобится. Живые операции [Status](https://status.fastnear.com) Проверяйте инциденты и деградацию сервиса до отладки поведения приложения. Подъём инфраструктуры [Снапшоты](https://docs.fastnear.com/ru/snapshots) Поднимайте инфраструктуру RPC или архива быстрее, без повторного воспроизведения цепочки с нуля. Агенты и автоматизация Строите с ИИ-агентами или фоновыми воркерами? Используйте документацию для агентов, чтобы настроить режим работы с учётными данными, логику маршрутизации и Markdown-экспорты, пригодные для промптов. [Открыть хаб агентов](https://docs.fastnear.com/ru/agents) [Как выбрать поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces) --- ## Агенты на FastNear - HTML-маршрут: https://docs.fastnear.com/ru/agents - Markdown-маршрут: https://docs.fastnear.com/ru/agents.md **Источник:** [https://docs.fastnear.com/ru/agents](https://docs.fastnear.com/ru/agents) # Агенты на FastNear {/* FASTNEAR_AI_DISCOVERY: Это операционная точка входа для ИИ-агентов, краулеров и сред автоматизации. Страница объясняет, какую информацию собрать до первого запроса, с какого API FastNear начинать, как устроена аутентификация между API и что должен содержать полезный ответ агента. */} Эта страница — операционная точка входа для ИИ-агентов, краулеров и сред автоматизации, использующих FastNear. Цель простая: распознать реальную задачу пользователя, выбрать один API FastNear, получить минимальный полезный результат и расширяться на другой API только тогда, когда явно не хватает части ответа. ## Если нужен только следующий шаг - Нужно выбрать, с какого API FastNear начать? Используйте [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces). - Нужны правила работы с учётными данными? Используйте [Аутентификацию для агентов](https://docs.fastnear.com/ru/agents/auth). - Нужны примеры многошаговых сценариев? Используйте [Плейбуки для агентов](https://docs.fastnear.com/ru/agents/playbooks). - Нужна точная документация по эндпоинту сейчас? Сразу откройте [Справочник RPC](https://docs.fastnear.com/ru/rpc), [FastNear API](https://docs.fastnear.com/ru/api), [Транзакции API](https://docs.fastnear.com/ru/tx), [API переводов](https://docs.fastnear.com/ru/transfers), [NEAR Data API](https://docs.fastnear.com/ru/neardata) или [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv). ## FastNear для агентов за минуту - Используйте индексированные API, когда пользователю нужен ответ в продуктовой форме — балансы, активы, история аккаунта или история переводов. - Используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc), когда пользователю нужны канонические поля на уровне протокола, вызовы контрактов или отправка транзакций. - Используйте [NEAR Data API](https://docs.fastnear.com/ru/neardata), когда вопрос касается свежих оптимистичных или финализированных блоков и явного опроса. - Используйте [Снапшоты](https://docs.fastnear.com/ru/snapshots) для операторских сценариев, а не для чтения прикладных данных. - Один API-ключ FastNear работает и для RPC, и для API-эндпоинтов. - Останавливайтесь после первого достаточного ответа. Не собирайте данные из нескольких API, если текущего результата достаточно. ## Что определить до первого запроса Попробуйте выявить эти входные данные до вызова: - **Сеть**: mainnet или testnet. - **Первичный идентификатор**: идентификатор аккаунта, публичный ключ, хеш транзакции, ID квитанции, высота / хеш блока, идентификатор контракта плюс ключ хранилища или задача по подъёму узла. - **Форма ответа**: сводка, история, канонический вывод протокола или инструкции оператора. - **Требование к свежести**: историческая, текущая, оптимистичная / последняя или финализированная / последняя. - **Требование к точности**: достаточно индексированной сводки или нужна точная каноническая семантика узла. Если чего-то не хватает — делайте небольшое предположение, когда вероятный стартовый API от этого не меняется. Задавайте уточняющий вопрос только тогда, когда неверный выбор API существенно изменит результат. ## API FastNear с одного взгляда | API | Начните здесь, когда... | Типичные входы | Расширяйтесь, только если... | | --- | --- | --- | --- | | [FastNear API](https://docs.fastnear.com/ru/api) | Пользователю нужны балансы, NFT, стейкинг, разрешение публичного ключа или сводка по аккаунту | `account_id`, публичный ключ | Нужны точные канонические поля узла | | [Справочник RPC](https://docs.fastnear.com/ru/rpc) | Пользователю нужен канонический вывод протокола, вызовы контрактов, данные валидаторов или отправка транзакций | `account_id`, высота / хеш блока, параметры конкретного метода | Также нужна сводка более высокого уровня или индексированная история | | [Транзакции API](https://docs.fastnear.com/ru/tx) | Пользователю нужна история транзакций, квитанций, аккаунта или исполнения по блокам | хеш транзакции, ID квитанции, `account_id`, идентификаторы блока | Нужна точная семантика продолжения или финальности на уровне RPC | | [API переводов](https://docs.fastnear.com/ru/transfers) | Пользователю нужна история только переводов | `account_id`, фильтры переводов | Вопрос расширяется до общего контекста исполнения | | [NEAR Data API](https://docs.fastnear.com/ru/neardata) | Пользователю нужны свежие оптимистичные или финализированные блоки, заголовки или помощники по последнему блоку | высота / хеш блока, требование к свежести | Нужно точное каноническое продолжение по блоку или состоянию | | [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) | Пользователю нужна индексированная история ключа контракта или последнее индексированное состояние «ключ–значение» | идентификатор контракта, ключ хранилища | Нужно точное текущее состояние в цепочке | | [Снапшоты](https://docs.fastnear.com/ru/snapshots) | Пользователь поднимает инфраструктуру | сеть, тип узла, цель оператора | Пользователь переключается на прикладные вопросы о цепочке | ## Рабочий цикл по умолчанию Используйте этот цикл, если задача явно не требует чего-то более специального: 1. Переформулируйте слова пользователя в реальную задачу. Примеры: сводка по аккаунту, инспекция канонического состояния, расследование транзакции, история только переводов, мониторинг свежих блоков или подъём узла. 2. Выберите один API FastNear. Не собирайте данные из нескольких API, пока первый результат не окажется недостаточным. 3. Подтяните минимальный релевантный контекст документации. Используйте страницу-индекс API, страницу эндпоинта или Markdown-зеркало вместо широкого неочевидного набора документов. 4. Сделайте первый запрос, соответствующий идентификатору пользователя и ожидаемой форме ответа. 5. Остановитесь, если результата уже достаточно для ответа пользователю. 6. Расширяйтесь, только когда можете точно назвать недостающую часть. Примеры: каноническое подтверждение, более широкая история исполнения, более свежие данные семейства блоков или точные поля протокола. ## Хорошие значения по умолчанию Когда формулировка пользователя коротка, но намерение типично, такие значения по умолчанию обычно корректны: - «Проверь этот аккаунт» обычно стартует с [FastNear API](https://docs.fastnear.com/ru/api). - «Проверь этот публичный ключ» обычно стартует с [FastNear API](https://docs.fastnear.com/ru/api) для разрешения ключа в аккаунт. - «Проверь эту транзакцию» обычно стартует с [Транзакции API](https://docs.fastnear.com/ru/tx). - «Проверь эту квитанцию» обычно стартует с [Транзакции API](https://docs.fastnear.com/ru/tx). - «Проверь этот блок» обычно стартует с [NEAR Data API](https://docs.fastnear.com/ru/neardata) для мониторинга свежих блоков или со [Справочника RPC](https://docs.fastnear.com/ru/rpc) для точных канонических данных блока. - «Проверь этот ключ / историю контракта» обычно стартует с [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv). - «Помоги поднять узел» стартует со [Снапшотов](https://docs.fastnear.com/ru/snapshots). Полные правила маршрутизации и компромиссы — в [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces). ## Расширяйтесь осторожно Хорошие шаблоны эскалации: - Начните с [FastNear API](https://docs.fastnear.com/ru/api), затем переходите в [Справочник RPC](https://docs.fastnear.com/ru/rpc), если пользователь просит каноническое подтверждение. - Начните с [Транзакции API](https://docs.fastnear.com/ru/tx), затем переходите в [Справочник RPC](https://docs.fastnear.com/ru/rpc), если пользователю нужно протокольное продолжение по транзакции или квитанции. - Начните с [API переводов](https://docs.fastnear.com/ru/transfers), затем расширяйтесь в [Транзакции API](https://docs.fastnear.com/ru/tx), если вопрос выходит за рамки событий переводов. - Начните с [NEAR Data API](https://docs.fastnear.com/ru/neardata), затем переходите в [Справочник RPC](https://docs.fastnear.com/ru/rpc), если нужна точная каноническая инспекция блока или состояния. Плохой шаблон: - Тянуть данные из нескольких API FastNear до того, как понятно, что именно нужно пользователю. Обычно это даёт более шумный ответ, а не более полезный. ## Аутентифицируйтесь один раз, используйте везде Публичные эндпоинты часто работают и без ключа. Добавьте ключ, если нужны повышенные лимиты, единая аутентифицированная модель или платные сценарии. Один и тот же ключ работает со всеми API FastNear выше, включая обычные и архивные RPC-хосты; передавайте его либо в HTTP-заголовке, либо в URL-параметре: ```bash title="Заголовок Authorization" curl "https://rpc.mainnet.fastnear.com" \ -H "Authorization: Bearer ${API_KEY}" \ -H "Content-Type: application/json" \ --data '{"method":"block","params":{"finality":"final"},"id":1,"jsonrpc":"2.0"}' ``` ```bash title="URL-параметр" curl "https://rpc.mainnet.fastnear.com?apiKey=${API_KEY}" ``` Получить ключ: [dashboard.fastnear.com](https://dashboard.fastnear.com). Операционный режим для неинтерактивных сред: [Аутентификация для агентов](https://docs.fastnear.com/ru/agents/auth) — ключи должны жить в переменных окружения или менеджере секретов, а не в браузерном хранилище, логах чатов или промптах. Полный сценарий и детали заголовков: [Аутентификация и доступ](https://docs.fastnear.com/ru/auth). ## Как вынимать чистую документацию в промпт - На каждой странице в правом верхнем углу есть кнопка **Копировать Markdown**. Она отдаёт Markdown-версию страницы без навигации, готовую к вставке в промпт или RAG-хранилище. - Соглашение `llms.txt` поддерживается: - [`/llms.txt`](https://docs.fastnear.com/ru/llms.txt) — индекс страниц и краткие описания. - [`/llms-full.txt`](https://docs.fastnear.com/ru/llms-full.txt) — полный корпус документации в одном файле. - Русскоязычные аналоги: [`/ru/llms.txt`](https://docs.fastnear.com/ru/llms.txt) и [`/ru/llms-full.txt`](https://docs.fastnear.com/ru/llms-full.txt). - Машиночитаемая структура сайта для поглощения с учётом графа: [`/structured-data/site-graph.json`](https://docs.fastnear.com/ru/structured-data/site-graph.json) (зеркало в `/ru/`). - Под тем же slug с суффиксом `.md` лежит Markdown-зеркало каждой страницы, если прямой запрос удобнее кнопки «Копировать Markdown». ## Подсказки на каждый вызов - Имена параметров, поля ответа и примеры пэйлоадов отрисовываются на каждой странице эндпоинта в реальном времени. Первоисточник — реестр `src/data/generatedFastnearPageModels.json`, используйте его, если зеркалите схему в другой системе. - `?network=testnet` поддерживается только на конкретных страницах. Каждая страница отмечает поддержку сетей в разделе **Аутентификация и доступность**; не считайте, что переключение работает везде. - Токены пагинации (`resume_token`, `page_token`) непрозрачны. Используйте их ровно в том виде, в котором они пришли, и только с тем же эндпоинтом и фильтрами, что их вернули. - В каждом REST-семействе есть маршруты `/status` и `/health` для проверки живости и задержки синхронизации. ## Что должен содержать полезный ответ агента - Краткое указание на то, какой API FastNear был использован и почему, особенно если выбор был выводом. - Ответ в форме, которая, скорее всего, понадобится пользователю следующей: сначала сводка для людей; точные поля или подсказки по следующему вызову для технического потребителя. - Любое важное предостережение о свежести, каноничности, пагинации или выборе сети. - Путь продолжения — только когда это реально помогает. Примеры: «используйте RPC для канонического подтверждения» или «используйте Транзакции API, если нужен более широкий контекст исполнения». Избегайте сбрасывать сырые пэйлоады, когда пользователь на самом деле спрашивает об интерпретации. ## Следующие документы по потребности - Нужна глубина маршрутизации и компромиссы? [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces) - Нужен режим работы с учётными данными и обращение с секретами? [Аутентификация для агентов](https://docs.fastnear.com/ru/agents/auth) - Нужны примеры сценариев? [Плейбуки для агентов](https://docs.fastnear.com/ru/agents/playbooks) --- ## Аутентификация для агентов - HTML-маршрут: https://docs.fastnear.com/ru/agents/auth - Markdown-маршрут: https://docs.fastnear.com/ru/agents/auth.md **Источник:** [https://docs.fastnear.com/ru/agents/auth](https://docs.fastnear.com/ru/agents/auth) # Аутентификация для агентов Агенты должны аутентифицироваться в FastNear так же, как это делают продовые бэкенды. Не переносите браузерно-демонстрационный режим из UI документации в агента, воркера или среду автоматизации. Один API-ключ FastNear работает во всех RPC и API-эндпоинтах. Многие публичные чтения работают и без ключа. Для агента важнее не само наличие аутентификации, а где живёт учётная запись, как она прикрепляется к запросам и как не допустить её утечки в промпты, логи или состояние браузера. ## Если нужно только правило - Храните ключ в переменной окружения или менеджере секретов. - Внедряйте его со стороны сервера или из среды выполнения воркера. - Предпочитайте заголовок `Authorization: Bearer ...`. - Одинаковые правила ключа и способа передачи действуют и для обычных, и для архивных RPC-хостов. - Никогда не просите пользователя вставлять ключ FastNear в чат, промпт или агента, работающего только в браузере. ## Рекомендуемые шаблоны среды выполнения Используйте один из этих шаблонов: - **Серверный воркер или автоматизация**: загружайте ключ из переменных окружения или менеджера секретов и прикрепляйте его к исходящим запросам к FastNear напрямую. - **Тонкий бэкенд-прокси**: если пользовательское приложение работает в браузере, сначала отправляйте запрос на свой бэкенд, и пусть бэкенд подставляет учётные данные FastNear. - **Мульти-тенантный сервис**: храните ключи по тенантам в полноценном хранилище секретов и заставьте агента выбирать правильный ключ по контексту тенанта или проекта. Избегайте архитектур «агент только в браузере», где ключ FastNear приходится держать в клиентском хранилище. ## Выбор способа передачи учётных данных | Способ | Используйте, когда... | Заметки | | --- | --- | --- | | `Authorization: Bearer ${API_KEY}` | HTTP-клиентом или бэкендом управляете вы | Лучшее значение по умолчанию для агентов. Меньше шансов утечь в логи URL, аналитику или скопированные ссылки. | | `?apiKey=${API_KEY}` | используется простой curl или система, которой сложно выставлять заголовки | Тоже допустимо, но URL обычно дальше путешествуют через логи и инструменты. Применяйте осознанно. | Если есть выбор — используйте заголовочную форму. ## Минимальный безопасный поток 1. Читайте ключ из переменной окружения или менеджера секретов во время выполнения. 2. Прикрепляйте его к запросу как заголовок или URL-параметр. 3. Чистите промпты, трассировки и логи, чтобы сырой ключ не попадал в транскрипты. 4. Ротируйте ключ, если он появился в промпте, отладочной трассировке, браузерном хранилище или скопированном URL. Пример: ```js const apiKey = process.env.FASTNEAR_API_KEY; const response = await fetch('https://rpc.mainnet.fastnear.com', { method: 'POST', headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'block', params: {finality: 'final'}, }), }); ``` ## Когда аутентификации не хватает Многие публичные эндпоинты FastNear по-прежнему доступны на чтение без ключа. Если агент может ответить на вопрос пользователя через публичный трафик — делайте так. Когда ключ нужен для повышенных лимитов, платного доступа или аутентифицированного трафика: - подскажите пользователю создать или забрать ключ на [dashboard.fastnear.com](https://dashboard.fastnear.com) - попросите настроить его в переменной окружения, менеджере секретов или конфигурации бэкенда - не просите вставлять сырой ключ в чат, чтобы агент «носил» его с собой Если агент не может получить настроенный секрет — пусть честно скажет это и остановится, а не импровизирует небезопасное хранение. ## Так делать не надо - Не вынимайте ключ из браузерного `localStorage` и не считайте его учётной записью агента. - Не зашивайте ключи в агент-приложения, доставляемые в браузер. - Не храните ключи в промптах, ячейках ноутбуков или в виде открытого текста в конфигах, закоммиченных в систему контроля версий. - Не предпочитайте `?apiKey=` только за краткость, если инфраструктура агрессивно логирует полные URL. ## Что агенту стоит сказать пользователю Когда аутентификация уместна, полезный ответ агента обычно содержит: - можно ли выполнить текущий запрос без аутентификации - нужно ли пользователю далее настроить API-ключ FastNear - где этому ключу жить — обычно в переменной окружения, менеджере секретов или бэкенд-прокси - какой способ передачи использует агент — обычно `Authorization: Bearer ...` ## Связанные руководства - [Аутентификация и доступ](https://docs.fastnear.com/ru/auth) - [Агенты на FastNear](https://docs.fastnear.com/ru/agents) - [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces) --- ## Как выбрать подходящую поверхность - HTML-маршрут: https://docs.fastnear.com/ru/agents/choosing-surfaces - Markdown-маршрут: https://docs.fastnear.com/ru/agents/choosing-surfaces.md **Источник:** [https://docs.fastnear.com/ru/agents/choosing-surfaces](https://docs.fastnear.com/ru/agents/choosing-surfaces) # Как выбрать подходящую поверхность {/* FASTNEAR_AI_DISCOVERY: Эта страница — для ИИ-агентов, которые выбирают поверхность FastNear по намерению пользователя. Она объясняет, как перейти от цели пользователя к лучшей первой поверхности, когда комбинировать поверхности и каких типичных ошибок избегать. */} Не начинайте с того, чтобы отдавать агенту каждый эндпоинт FastNear. Сначала сформулируйте, какую задачу на самом деле хочет решить пользователь, а затем выберите один API или раздел справочника FastNear, который наиболее прямо отвечает на эту задачу. Для агента важнее не вопрос «какой эндпоинт существует?», а вопрос «какой ответ поможет пользователю сделать следующий шаг?». ## Что определяет маршрут Прежде чем выбрать API, определите четыре вещи: - **Объект**: аккаунт, публичный ключ, хеш транзакции, квитанция, блок, хранилище контракта или задача по настройке инфраструктуры. - **Форма ответа**: сводка в продуктовой форме, история исполнения, канонический вывод протокола или инструкции для оператора. - **Свежесть**: историческая, текущая или последняя / почти в реальном времени. - **Точность**: достаточно индексированной сводки или требуется каноническая корректность в форме узла. На практике: - аккаунт плюс сводка обычно означают [FastNear API](https://docs.fastnear.com/ru/api) - аккаунт плюс точное каноническое состояние обычно означают [Справочник RPC](https://docs.fastnear.com/ru/rpc) - транзакция или квитанция обычно означают [Транзакции API](https://docs.fastnear.com/ru/tx) - история только переводов обычно означает [API переводов](https://docs.fastnear.com/ru/transfers) - самые свежие блоки обычно означают [NEAR Data API](https://docs.fastnear.com/ru/neardata) - история ключей контракта обычно означает [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) - подъём узла обычно означает [Снапшоты](https://docs.fastnear.com/ru/snapshots) ## Начните с намерения пользователя - Если пользователю нужен ответ в стиле кошелька или обозревателя, предпочитайте индексированные API. - Если пользователю нужно каноническое поведение протокола или точное состояние в форме узла, используйте сырой [Справочник RPC](https://docs.fastnear.com/ru/rpc). - Если пользователю нужна история, квитанции или последовательности событий, используйте API, ориентированные на историю, прежде чем возвращаться к RPC. - Если пользователю нужны самые свежие данные семейства блоков, используйте [NEAR Data API](https://docs.fastnear.com/ru/neardata) для свежести, ориентированной на опрос. - Если пользователю нужны инструкции по подъёму инфраструктуры, направляйте его к [Снапшотам](https://docs.fastnear.com/ru/snapshots), а не к прикладным поверхностям запросов. ## Порядок принятия решений Используйте этот порядок перед выбором поверхности: 1. Пользователь пытается поднять инфраструктуру, а не запрашивать данные цепочки? Если да — используйте [Снапшоты](https://docs.fastnear.com/ru/snapshots). 2. Пользователь просит сводку в продуктовой форме: балансы, NFT, стейкинг или активы аккаунта? Если да — начните с [FastNear API](https://docs.fastnear.com/ru/api). 3. Пользователь спрашивает, что происходило со временем: транзакции, квитанции, переводы или история активности? Если да — начните с [Транзакции API](https://docs.fastnear.com/ru/tx) или с [API переводов](https://docs.fastnear.com/ru/transfers) для вопросов только о переводах. 4. Пользователю нужны самые свежие блоки или чтения семейства блоков с низкой задержкой? Если да — используйте [NEAR Data API](https://docs.fastnear.com/ru/neardata). 5. Корректность зависит от канонического поведения узла, полей протокола или точного состояния в цепочке? Если да — используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc). 6. Пользователь спрашивает об истории индексированного хранилища «ключ–значение» или о последнем индексированном состоянии контракта? Если да — используйте [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv). Если подходит несколько поверхностей, выбирайте ту, которая даёт наиболее прямой полезный ответ с минимумом реконструкции со стороны агента. ## Перед первым вызовом Попробуйте определить эти входные данные до отправки запроса: - сеть: mainnet или testnet - первичный идентификатор: идентификатор аккаунта, публичный ключ, хеш транзакции, ID квитанции, высота / хеш блока, идентификатор контракта плюс ключ хранилища - ожидаемый вывод: сводка, история, канонические поля или шаги оператора - требование к свежести: последнее, финализированное, историческое или «что актуально сейчас» Если чего-то не хватает: - делайте небольшое предположение, когда вероятный стартовый API от этого не меняется - задавайте уточняющий вопрос только тогда, когда неверный выбор существенно изменит результат ## Направление типовых запросов пользователя | Если пользователь говорит... | Вероятно, ему нужно... | Начните с | Переключайтесь, только если... | | --- | --- | --- | --- | | «Каково точное состояние аккаунта в цепочке?» | Каноническое состояние на уровне протокола | [Справочник RPC](https://docs.fastnear.com/ru/rpc) | Также нужна сводка более высокого уровня для людей. | | «Что принадлежит этому аккаунту?» | Балансы, NFT, стейкинг и активы в продуктовой форме | [FastNear API](https://docs.fastnear.com/ru/api) | Нужны точные поля узла, которых нет в индексированном представлении. | | «Какая активность затронула этот аккаунт?» | Индексированная история транзакций и квитанций | [Транзакции API](https://docs.fastnear.com/ru/tx) | Пользователю нужны только события переводов или требуется канонический протокольный уровень детализации. | | «Покажи только переводы.» | История переводов по аккаунту | [API переводов](https://docs.fastnear.com/ru/transfers) | Пользователю на самом деле нужен более широкий контекст исполнения транзакции. | | «Что изменилось в последних блоках?» | Свежие оптимистичные или финализированные чтения семейства блоков | [NEAR Data API](https://docs.fastnear.com/ru/neardata) | Нужны канонические детали RPC по конкретному блоку или чтению состояния. | | «Какая история хранилища у этого контракта?» | Индексированная история состояния «ключ–значение» | [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) | Нужно текущее каноническое состояние в цепочке, а не индексированная история. | | «Почему эта транзакция упала?» | Сначала хронология исполнения, затем канонические детали | [Транзакции API](https://docs.fastnear.com/ru/tx) | Нужно подтверждение финального статуса протокола на уровне RPC или поведение при отправке транзакции. | | «Как мне отправить транзакцию или посмотреть поле протокола?» | Каноническое поведение узла | [Справочник RPC](https://docs.fastnear.com/ru/rpc) | Позже понадобится сводка по итоговому состоянию аккаунта или активности для человека. | | «Как поднять узел или архивную установку?» | Инфраструктурный сценарий, а не данные приложения | [Снапшоты](https://docs.fastnear.com/ru/snapshots) | Пользователь затем начинает задавать прикладные вопросы о цепочке. | ## Когда подсказкой служит идентификатор Если формулировка пользователя размытая, но идентификатор ясен — пусть идентификатор задаст первый шаг: | Если есть... | Первый шаг по умолчанию | Почему | | --- | --- | --- | | `account_id` | Начните с [FastNear API](https://docs.fastnear.com/ru/api) для сводок или со [Справочника RPC](https://docs.fastnear.com/ru/rpc), если пользователь явно просит точное состояние | Вопросы по аккаунту обычно означают сначала балансы и активы, если пользователь не попросил канонический уровень. | | публичный ключ | Начните с [FastNear API](https://docs.fastnear.com/ru/api) для разрешения ключа в аккаунт | Обычно это задача обнаружения аккаунта, а не первой задачи на уровне RPC. | | хеш транзакции | Начните с [Транзакции API](https://docs.fastnear.com/ru/tx) | Большинству пользователей нужен контекст исполнения и читаемая история, а не сырые поля протокола. | | ID квитанции | Начните с [Транзакции API](https://docs.fastnear.com/ru/tx) | Трассировка квитанций уже индексирована там. | | высота или хеш блока | Начните с [NEAR Data API](https://docs.fastnear.com/ru/neardata) для мониторинга, ориентированного на свежесть, либо со [Справочника RPC](https://docs.fastnear.com/ru/rpc) для точных канонических данных блока | Нужна либо свежесть, либо каноничность. | | идентификатор контракта плюс ключ хранилища | Начните с [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) для индексированной истории ключа или со [Справочника RPC](https://docs.fastnear.com/ru/rpc) для точного текущего состояния в цепочке | Вопрос о хранилище обычно определяет, что важнее: индексированная история или каноническое состояние. | | задача по подъёму узла или архива | Начните со [Снапшотов](https://docs.fastnear.com/ru/snapshots) | Это операторский сценарий, а не доступ к данным приложения. | ## Для чего лучше всего подходит каждая поверхность ### Справочник RPC Используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc), когда пользователю нужны точные данные или поведение на уровне протокола: - точное состояние аккаунта, ключи доступа, валидаторы, чанки, блоки, метаданные протокола - view-вызовы контрактов и отправка транзакций - ответы, где имена и семантика полей должны быть максимально близки к узлам NEAR Не стартуйте с RPC, когда пользователю на самом деле нужна аккуратная сводка по активам или истории. Это заставит агента пересобирать продуктовый ответ из данных более низкого уровня. ### FastNear API Используйте [FastNear API](https://docs.fastnear.com/ru/api), когда пользователю нужен ответ, уже похожий на данные приложения: - балансы - NFT - позиции стейкинга - поиск по публичному ключу - объединённые снимки аккаунта Обычно это первый шаг для запросов кошелька, портфеля, обозревателя и обзора аккаунта. ### Транзакции API Используйте [Транзакции API](https://docs.fastnear.com/ru/tx), когда пользователю нужна история исполнения: - активность аккаунта - поиск транзакции - трассировка квитанций - история транзакций по блокам Это поверхность истории по умолчанию, когда пользователь спрашивает «что произошло?», а не «что есть прямо сейчас?». ### API переводов Используйте [API переводов](https://docs.fastnear.com/ru/transfers), когда вопрос пользователя именно о событиях переводов, а не о полном контексте исполнения: - входящие и исходящие переводы - пагинация, ориентированная на переводы - представления активности аккаунта только по переводам Если пользователь начинает спрашивать про квитанции, действия кроме переводов или полное поведение транзакций — переходите в [Транзакции API](https://docs.fastnear.com/ru/tx). ### NEAR Data API Используйте [NEAR Data API](https://docs.fastnear.com/ru/neardata), когда свежесть важнее сводки в продуктовой форме: - оптимистичные или недавно финализированные блоки - чтения последних блоков семейства - явные сценарии с опросом Не представляйте это как сервис на основе WebSocket или webhook. Это поверхность чтения, ориентированная на опрос. ### KV FastData API Используйте [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv), когда вопрос об истории индексированного хранилища контракта или о последнем индексированном состоянии «ключ–значение»: - анализ хранилища - история ключей - поиск состояния контракта, где уместна индексированная абстракция «ключ–значение» ### Снапшоты Используйте [Снапшоты](https://docs.fastnear.com/ru/snapshots), когда сценарий связан с подъёмом инфраструктуры оператором: - подъём mainnet или testnet - инициализация RPC- или архивного узла - операторские руководства Это не путь прикладных запросов. ## Ближайшие шаги после выбора Как только выбрана стартовая поверхность, следующий шаг тоже должен быть предсказуемым: | Выбранный API | Первое, что нужно сделать | Как выглядит успех | Расширяйтесь только если... | | --- | --- | --- | --- | | [FastNear API](https://docs.fastnear.com/ru/api) | Выберите эндпоинт, соответствующий идентификатору или запросу на сводку | Можно сразу ответить на вопросы по балансам, активам, стейкингу или сводке аккаунта | Нужны точные канонические поля узла или подтверждение на уровне протокола | | [Справочник RPC](https://docs.fastnear.com/ru/rpc) | Выберите конкретный RPC-метод, соответствующий объекту и требуемому набору канонических полей | Можно вернуть поля на уровне протокола или выполнить точное действие по состоянию / отправке | Также нужна сводка более высокого уровня или индексированная история | | [Транзакции API](https://docs.fastnear.com/ru/tx) | Начните с эндпоинта по хешу транзакции, квитанции, истории аккаунта или истории блока, подходящего под вопрос | Можно объяснить, что произошло и в каком порядке | Нужна точная семантика финальности или отправки на уровне RPC | | [API переводов](https://docs.fastnear.com/ru/transfers) | Запросите историю переводов для аккаунта или в нужном объёме актива | Можно отвечать на вопросы только о переводах без лишних деталей исполнения | Вопрос расширяется до квитанций, действий или полного контекста транзакции | | [NEAR Data API](https://docs.fastnear.com/ru/neardata) | Запросите последние оптимистичные или финализированные данные семейства блоков по требованию к свежести | Можно отвечать «что изменилось недавно?» или «каково последнее состояние семейства блоков?» | Нужно точное каноническое продолжение по блоку или состоянию | | [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) | Запросите последнее индексированное состояние «ключ–значение» или историю ключа | Можно отвечать на вопросы инспекции хранилища контракта в индексированном виде | Нужно точное текущее состояние в цепочке, а не индексированные представления хранилища | | [Снапшоты](https://docs.fastnear.com/ru/snapshots) | Выберите нужную сеть и тип узла, затем следуйте руководству по подъёму | Можно дать операторские шаги, предусловия и ориентиры для подъёма | Пользователь переключается с настройки инфраструктуры на прикладные вопросы о цепочке | ## Условия остановки перед расширением Не расширяйтесь на второй API только потому, что он существует. Оставайтесь на первом API, когда: - ответ уже соответствует ожидаемой пользователем форме - текущий API уже отдаёт поля, которые просил пользователь - пользователь просил историю и индексированная история уже получена - пользователь просил сводку и сводка уже получена Расширяйтесь, когда: - пользователь явно просит каноническое подтверждение - текущему API не хватает поля, свежести или детализации исполнения - вопрос расширился с истории только переводов до общего поведения транзакций - вопрос расширился со сводки до инспекции на уровне протокола ## Комбинируйте поверхности, только когда это помогает пользователю Хорошие шаблоны с несколькими поверхностями: - Начните с [FastNear API](https://docs.fastnear.com/ru/api), затем опуститесь в [Справочник RPC](https://docs.fastnear.com/ru/rpc), если пользователь просит каноническое подтверждение. - Начните с [Транзакции API](https://docs.fastnear.com/ru/tx), затем используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc), когда нужны финальные детали протокола по конкретной транзакции или квитанции. - Начните с [NEAR Data API](https://docs.fastnear.com/ru/neardata) для самых свежих блоков, затем используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc) для точной инспекции конкретного блока или запроса состояния. - Начните с [API переводов](https://docs.fastnear.com/ru/transfers) для вопросов только о переводах, затем расширяйтесь в [Транзакции API](https://docs.fastnear.com/ru/tx), если пользователь просит больше контекста исполнения. Плохой шаблон с несколькими поверхностями: - Тянуть данные из нескольких поверхностей до того, как понятно, что именно нужно пользователю. Обычно это даёт более шумный ответ, а не более полезный. ## Что агенту стоит вывести из типовых формулировок - «Что есть у этого кошелька?» обычно означает балансы, NFT, стейкинг и, возможно, разрешение по публичному ключу. Начните с [FastNear API](https://docs.fastnear.com/ru/api). - «Почему эта транзакция упала?» обычно означает, что пользователю сначала нужна читаемая история исполнения, а не сырой вывод протокола. Начните с [Транзакции API](https://docs.fastnear.com/ru/tx). - «Это точное состояние цепочки?» обычно означает, что каноническая корректность важнее удобства. Начните со [Справочника RPC](https://docs.fastnear.com/ru/rpc). - «Что только что произошло в последнем блоке?» обычно означает, что главное требование — свежесть. Начните с [NEAR Data API](https://docs.fastnear.com/ru/neardata). - «Как быстро поднять узел?» — это операторский сценарий. Начните со [Снапшотов](https://docs.fastnear.com/ru/snapshots). ## Частые ошибки маршрутизации - Не начинайте с RPC только потому, что он канонический. Каноничность не равна полезности для каждой задачи пользователя. - Не используйте снапшоты для прикладных чтений. - Не описывайте [NEAR Data API](https://docs.fastnear.com/ru/neardata) как поверхность потоковой передачи. - Не расширяйтесь с истории переводов до полной истории транзакций, если вопрос пользователя сам не стал шире. - Не уходите с индексированного API только потому, что существует сырой RPC. Переходите, только когда индексированного ответа недостаточно. ## Если намерение пользователя неоднозначно Когда пользователь формулирует размыто, делайте наименьшее полезное предположение о маршруте: - «Проверь этот аккаунт» обычно стоит начинать с [FastNear API](https://docs.fastnear.com/ru/api) — большинству пользователей нужна читаемая сводка по аккаунту. - «Проверь эту транзакцию» обычно стоит начинать с [Транзакции API](https://docs.fastnear.com/ru/tx) — большинству пользователей нужен контекст исполнения, а не только поля протокола. - «Проверь этот блок» можно начинать с [NEAR Data API](https://docs.fastnear.com/ru/neardata) для мониторинга, ориентированного на свежесть, либо со [Справочника RPC](https://docs.fastnear.com/ru/rpc), когда пользователя явно интересует канонический вывод узла. Если делаете предположение — кратко укажите его в ответе и идите дальше. Просите уточнения только тогда, когда выбор неверной поверхности существенно изменит результат. ## Что агенту делать после первого результата После возврата первого ответа: 1. Проверьте, можно ли теперь ответить на вопрос пользователя напрямую. 2. Если да — отвечайте в ожидаемой пользователем форме, а не собирайте дополнительные данные. 3. Если нет — точно назовите недостающую часть. Примеры: каноническое подтверждение, более широкая история, более свежие данные семейства блоков, точное поле протокола или специфический контекст инфраструктуры. 4. Только тогда переключайте API. Цель — не доказать, что существует несколько API FastNear. Цель — ответить на следующий реальный вопрос пользователя за минимальное число необходимых шагов. ## Связанные руководства - [Агенты на FastNear](https://docs.fastnear.com/ru/agents) — полная карта поверхностей, базовые URL и подсказки по поглощению промптов. - [Аутентификация для агентов](https://docs.fastnear.com/ru/agents/auth) — работа с учётными данными и операционный режим. - [Плейбуки для агентов](https://docs.fastnear.com/ru/agents/playbooks) — примеры многошаговых сценариев. --- ## Плейбуки для агентов - HTML-маршрут: https://docs.fastnear.com/ru/agents/playbooks - Markdown-маршрут: https://docs.fastnear.com/ru/agents/playbooks.md **Источник:** [https://docs.fastnear.com/ru/agents/playbooks](https://docs.fastnear.com/ru/agents/playbooks) # Плейбуки для агентов {/* FASTNEAR_AI_DISCOVERY: Эта страница даёт ИИ-агентам конкретные многошаговые сценарии для типовых задач FastNear. Каждый плейбук называет минимальные входы, первый API, с которого начать, момент для расширения на другой API и то, что должен содержать полезный ответ. */} Используйте эту страницу, когда агент уже знает, какой тип задачи он обрабатывает, и ему нужны ближайшие шаги по умолчанию. Каждый плейбук начинается с одного API FastNear, называет минимально полезные входы и подсказывает, когда остановиться, а когда расширяться. Базовое правило остаётся одним для всех плейбуков: начните с одного API, получите минимальный полезный результат и расширяйтесь, только когда можете точно назвать недостающую часть. ## Как использовать эти плейбуки 1. Сопоставьте запрос пользователя с ближайшим плейбуком ниже. 2. Соберите минимальные входы. 3. Сделайте первый запрос к рекомендуемому стартовому API. 4. Остановитесь, как только можете ответить в форме, которая реально нужна пользователю. 5. Расширяйтесь только под конкретное недостающее поле, требование к свежести или к каноничности. ## Быстрая карта | Если пользователю нужно... | Начните с... | Расширяйтесь, только если... | | --- | --- | --- | | балансы, активы, стейкинг или сводка аккаунта в стиле кошелька | [FastNear API](https://docs.fastnear.com/ru/api) | требуются точные канонические поля узла | | история транзакций, квитанций или исполнения по аккаунту | [Транзакции API](https://docs.fastnear.com/ru/tx) | требуется точный статус или семантика отправки на уровне RPC | | история только переводов | [API переводов](https://docs.fastnear.com/ru/transfers) | вопрос выходит за рамки переводов | | последние оптимистичные или финализированные блоки | [NEAR Data API](https://docs.fastnear.com/ru/neardata) | требуется точное каноническое продолжение по блоку или состоянию | | индексированное состояние ключей контракта или история ключей | [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) | требуется точное текущее состояние в цепочке | | подъём узла или настройка оператором | [Снапшоты](https://docs.fastnear.com/ru/snapshots) | задача уходит обратно к прикладным данным цепочки | Если до сих пор непонятно, какой плейбук подходит — сначала используйте [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces). ## Сводка и активы аккаунта Используйте, когда пользователь говорит «проверь этот аккаунт», «что хранит этот кошелёк», «какие NFT у этого аккаунта» или «какому аккаунту принадлежит этот ключ?». **Минимальные входы** - сеть - `account_id` или публичный ключ - хочет пользователь широкую сводку или один конкретный класс активов **Начните здесь** - [Полный снимок аккаунта V1](https://docs.fastnear.com/ru/api/v1/account-full) для широкой сводки аккаунта - [Поиск по публичному ключу V1](https://docs.fastnear.com/ru/api/v1/public-key), если стартовый идентификатор — публичный ключ - [Индекс FastNear API](https://docs.fastnear.com/ru/api), когда сначала нужно выбрать более узкий эндпоинт **Последовательность по умолчанию** 1. Если стартовый идентификатор — публичный ключ, разрешите его в один или несколько `account_id` через [Поиск по публичному ключу V1](https://docs.fastnear.com/ru/api/v1/public-key). 2. Возьмите самое широкое полезное представление аккаунта через [Полный снимок аккаунта V1](https://docs.fastnear.com/ru/api/v1/account-full). 3. Если пользователь просит только одно семейство активов или нужна более узкая детализация — переходите к целевым эндпоинтам: [балансы FT-токенов](https://docs.fastnear.com/ru/api/v1/account-ft), [активы NFT](https://docs.fastnear.com/ru/api/v1/account-nft) или [позиции стейкинга](https://docs.fastnear.com/ru/api/v1/account-staking). 4. Остановитесь, как только можете напрямую ответить на вопрос об активах. **Расширяйтесь, только если** - пользователь просит точные канонические поля состояния, а не индексированные сводки - пользователю нужна протокольная семантика аккаунта или ключей доступа Тогда расширяйтесь на [Состояние аккаунта](https://docs.fastnear.com/ru/rpc/account/view-account) или другие страницы [Справочника RPC](https://docs.fastnear.com/ru/rpc). **Полезный ответ должен содержать** - определённую идентичность аккаунта - балансы или активы, о которых спросил пользователь - короткую пометку, что это индексированные сводные данные, а не сырое состояние RPC ## Расследование транзакции или квитанции Используйте, когда пользователь говорит «прошла ли эта транзакция», «почему она упала», «что случилось с этой квитанцией» или «покажи недавнюю активность аккаунта». **Минимальные входы** - сеть - хеш транзакции, ID квитанции или `account_id` - нужна инспекция одного элемента или диапазон истории **Начните здесь** - [Поиск транзакций](https://docs.fastnear.com/ru/tx/transactions) для хеша транзакции - [Поиск квитанций](https://docs.fastnear.com/ru/tx/receipt) для ID квитанции - [История аккаунта](https://docs.fastnear.com/ru/tx/account) для активности по аккаунту **Последовательность по умолчанию** 1. Выберите стартовый эндпоинт по уже известному идентификатору. 2. Запросите индексированную запись исполнения и восстановите историю в читаемом порядке. 3. Выделите статус, затронутые аккаунты, ключевые квитанции и контекст блока, если он существенен. 4. Остановитесь, если можете объяснить, что произошло, без канонического подтверждения через RPC. **Расширяйтесь, только если** - пользователь явно просит точную семантику статуса RPC - индексированной записи недостаточно, чтобы ответить на вопрос уровня протокола - вопрос сместился к поведению при отправке транзакции Тогда расширяйтесь на [Статус транзакции](https://docs.fastnear.com/ru/rpc/transaction/tx-status) или другой подходящий метод [Справочника RPC](https://docs.fastnear.com/ru/rpc). **Полезный ответ должен содержать** - успех, неудачу или ожидание транзакции или квитанции - сначала главный вывод исполнения, потом сырые поля - путь продолжения — только если он добавляет ценность, например «используйте RPC для канонического подтверждения» ## История только переводов Используйте, когда пользователя интересует движение активов и не нужен более широкий контекст квитанций или действий. **Минимальные входы** - сеть - `account_id` - опциональные фильтры: токен, направление или временной интервал **Начните здесь** - [Запрос переводов](https://docs.fastnear.com/ru/transfers/query) - [Индекс API переводов](https://docs.fastnear.com/ru/transfers) **Последовательность по умолчанию** 1. Запросите историю переводов для нужного аккаунта и фильтров. 2. Используйте пагинацию только до такой глубины, которая реально нужна для ответа. 3. Сосредоточьте ответ на переводах и не пересобирайте полную историю транзакции. 4. Остановитесь, если пользователь спросил только кто, когда и какой актив отправил. **Расширяйтесь, только если** - пользователь начинает спрашивать про действия, не связанные с переводами - пользователю нужны трассировки квитанций или более широкий контекст исполнения - пользователь хочет понять, почему действие произошло, а не просто что был перевод Тогда расширяйтесь на [Историю аккаунта](https://docs.fastnear.com/ru/tx/account) или другую страницу [Транзакций API](https://docs.fastnear.com/ru/tx). **Полезный ответ должен содержать** - значимые входящие или исходящие события переводов - предположения о фильтрах, которые были сделаны - пометку, что это история переводов, а не полная история исполнения ## Мониторинг свежих блоков Используйте, когда пользователю нужны самые свежие данные оптимистичных или финализированных блоков или он спрашивает «что изменилось недавно?». **Минимальные входы** - сеть - требование к свежести: оптимистичная или финализированная - опционально — высота или хеш блока, если пользователь привязывается к конкретному блоку **Начните здесь** - [Редирект на последний финализированный блок](https://docs.fastnear.com/ru/neardata/last-block-final) для последнего финализированного блока - [Оптимистичный блок по высоте](https://docs.fastnear.com/ru/neardata/block-optimistic), когда сценарий явно оптимистичный - [Заголовки блоков](https://docs.fastnear.com/ru/neardata/block-headers), когда достаточно опроса на уровне заголовков - [Индекс NEAR Data API](https://docs.fastnear.com/ru/neardata), когда нужно выбрать между ними **Последовательность по умолчанию** 1. Определите, нужна ли пользователю оптимистичная свежесть или финализированная стабильность. 2. Используйте помощника по последнему блоку или маршрут семейства блоков, соответствующий требованию к свежести. 3. Опрашивайте явно и в ответе чётко указывайте, какой режим свежести использован. 4. Остановитесь, если пользователю достаточно свежих данных семейства блоков и каноническое продолжение через RPC не требуется. **Расширяйтесь, только если** - пользователь просит точный канонический вывод блока - пользователь хочет проверить состояние или поля протокола за пределами данных семейства блоков - пользователю нужна точная семантика RPC для конкретного продолжения по блоку Тогда расширяйтесь на [Справочник RPC](https://docs.fastnear.com/ru/rpc), обычно начиная с [Блока по высоте](https://docs.fastnear.com/ru/rpc/block/block-by-height) или [Блока по ID](https://docs.fastnear.com/ru/rpc/block/block-by-id). **Полезный ответ должен содержать** - пометку, что данные получены из оптимистичных или финализированных чтений - детали последнего блока или заголовка, которые реально отвечают на вопрос пользователя - пометку, если более глубокое каноническое продолжение существенно изменит интерпретацию ## Инспекция хранилища контракта Используйте, когда пользователю нужна индексированная история ключей контракта, последнее индексированное состояние ключей или анализ хранилища контракта по ключу. **Минимальные входы** - сеть - идентификатор контракта - точный ключ, префикс ключа или область аккаунта / `predecessor_id` - хочет пользователь последнее индексированное состояние или исторические изменения ключа **Начните здесь** - [Последнее по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-latest-key) для одного точного ключа - [Индекс KV FastData API](https://docs.fastnear.com/ru/fastdata/kv), когда вопрос шире одного ключа **Последовательность по умолчанию** 1. Определите, хочет пользователь один ключ, семейство ключей или историю хранилища в разрезе аккаунта. 2. Запросите минимальное индексированное представление «ключ–значение», соответствующее этой области. 3. Если нужна история, а не последнее значение — оставайтесь внутри [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) и переключайтесь на подходящий исторический эндпоинт. 4. Остановитесь, если индексированные данные «ключ–значение» уже отвечают на вопрос. **Расширяйтесь, только если** - пользователю нужно точное текущее состояние в цепочке, а не индексированное состояние хранилища - пользователю нужна протокольная семантика состояния контракта - индексированного представления хранилища недостаточно для запрошенного точного ключа или префикса Тогда расширяйтесь на [Просмотр состояния контракта](https://docs.fastnear.com/ru/rpc/contract/view-state) в [Справочнике RPC](https://docs.fastnear.com/ru/rpc). **Полезный ответ должен содержать** - контракт и область ключа, которая была проинспектирована - пометку, это последнее индексированное состояние или история ключа - пометку, если каноническое состояние RPC отличается по свежести или семантике ## Подъём узла и настройка оператором Используйте, когда пользователь пытается поднять инфраструктуру, а не запросить данные цепочки. **Минимальные входы** - сеть - тип узла, например RPC или архивный - цель: скорость подъёма, восстановление синхронизации или операционный сценарий **Начните здесь** - [Снапшоты](https://docs.fastnear.com/ru/snapshots) **Последовательность по умолчанию** 1. Сразу направляйте к подходящему снапшоту или операторскому руководству. 2. Сосредоточьте ответ на предусловиях, пути подъёма и следующих операционных шагах. 3. Не подтягивайте прикладные API, пока пользователь сам не сменит задачу. **Расширяйтесь, только если** - пользователь перестаёт спрашивать про инфраструктуру и начинает спрашивать про сами данные цепочки Тогда возвращайтесь к [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces) и выбирайте нужный API данных. **Полезный ответ должен содержать** - сеть и тип узла, которые вы предполагаете - операторские шаги, которые нужно сделать дальше - любое чёткое предусловие или оговорку, меняющую путь подъёма ## Общие правила для всех плейбуков - Называйте сеть, если её пришлось вывести по контексту. - Называйте выбранный API, если выбор был выводом. - Предпочитайте один достаточный ответ исчерпывающему ответу по нескольким API. - Считайте токены пагинации непрозрачными и переиспользуйте их только с тем же эндпоинтом и набором фильтров, которые их создали. - Не расширяйтесь только потому, что существует более канонический API. ## Если ни один плейбук не подходит чисто Если запрос по-прежнему неоднозначен после этой страницы: - используйте [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces), чтобы выбрать первый API - используйте [Аутентификацию для агентов](https://docs.fastnear.com/ru/agents/auth), если блокер — работа с учётными данными - возвращайтесь к [Агентам на FastNear](https://docs.fastnear.com/ru/agents) за правилами рабочего цикла по умолчанию и формы ответа --- ## FastNear API - HTML-маршрут: https://docs.fastnear.com/ru/api - Markdown-маршрут: https://docs.fastnear.com/ru/api.md **Источник:** [https://docs.fastnear.com/ru/api](https://docs.fastnear.com/ru/api) # FastNear API FastNear API — это индексированное REST-семейство для продуктовых представлений аккаунтов. Это самый быстрый способ ответить на вопросы вроде «чем владеет этот аккаунт?» или «какие аккаунты соответствуют этому публичному ключу?» без сборки результата из сырых RPC-вызовов. ## Базовые URL ```bash title="FastNear API Mainnet" https://api.fastnear.com ``` ```bash title="FastNear API Testnet" https://test.api.fastnear.com ``` ## Лучше всего подходит для - балансов кошельков и обзоров активов; - представлений аккаунта по NFT и FT-токенам; - поиска аккаунтов по публичному ключу; - объединённых снимков аккаунта для дашбордов, обозревателей и агентов. ## Когда его не стоит использовать - Используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc), когда нужны канонические методы JSON-RPC из протокола. - Используйте [Транзакции API](https://docs.fastnear.com/ru/tx), когда основная задача — история транзакций или квитанций. - Используйте [NEAR Data API](https://docs.fastnear.com/ru/neardata), когда нужен опрос данных по блокам и проверка свежести. ## Аутентификация и доступность по сетям - Публичные REST-эндпоинты FastNear часто работают без API-ключа. - Тот же формат ключа FastNear работает и на API-эндпоинтах, когда нужна единая аутентифицированная модель или повышенные лимиты, а интерфейс документации может передать ключ в интерактивные примеры. - Добавьте `?network=testnet`, чтобы переключить совместимые страницы на testnet-бэкенд и подготовленные значения по умолчанию для testnet. ## Общие интерактивные примеры - Используйте `Copy example URL` на любой интерактивной API-странице, чтобы поделиться выбранной сетью и заполненным состоянием запроса. - Общие URL примеров выполняются автоматически при загрузке, когда в них есть состояние операции. - Сохранённые API-ключи и токены никогда не включаются в такие общедоступные URL документации. ## С чего обычно начинают - [V1 полный снимок аккаунта](https://docs.fastnear.com/ru/api/v1/account-full) — для объединённого снимка аккаунта. - [V1 FT-токены аккаунта](https://docs.fastnear.com/ru/api/v1/account-ft) и [V1 NFT аккаунта](https://docs.fastnear.com/ru/api/v1/account-nft) — для продуктовых представлений активов. - [V1 поиск по публичному ключу](https://docs.fastnear.com/ru/api/v1/public-key) — когда нужно определить аккаунт по ключу. - [V1 топ держателей FT](https://docs.fastnear.com/ru/api/v1/ft-top) — для представлений распределения токенов. ## Нужен сценарий? Используйте [примеры FastNear API](https://docs.fastnear.com/ru/api/examples) для простых пошаговых сценариев: сводки по аккаунтам, определения аккаунта по ключу и перехода к узким представлениям активов. ## Устранение неполадок ### Мне нужно только одно низкоуровневое значение из состояния цепочки Используйте сырой RPC. Эта индексированная поверхность оптимизирована для продуктовых представлений, а не для дублирования каждого RPC-метода. ### Страница всё ещё показывает данные mainnet Проверьте, поддерживает ли страница `?network=testnet`. Некоторые сценарии работают только с mainnet, и документация явно отмечает такие случаи. ### Мне нужны транзакции, а не балансы Переходите в [Транзакции API](https://docs.fastnear.com/ru/tx), чтобы не перегружать поверхность представления аккаунта запросами по истории. --- ## Примеры API - HTML-маршрут: https://docs.fastnear.com/ru/api/examples - Markdown-маршрут: https://docs.fastnear.com/ru/api/examples.md **Источник:** [https://docs.fastnear.com/ru/api/examples](https://docs.fastnear.com/ru/api/examples) ## Готовые сценарии Читайте эту страницу как короткую лестницу: сначала определите, что это за аккаунт, затем классифицируйте форму кошелька, а потом переходите к более насыщенному сценарию происхождения, если хотите превратить живой BOS-артефакт в отчеканенную запись. ### Определить аккаунт по публичному ключу, а затем получить сводку по нему Используйте этот сценарий, когда у вас сначала есть только публичный ключ, а следующий практический вопрос пользователя звучит как «какому аккаунту он соответствует?» и сразу после этого «что сейчас видно по этому аккаунту?» Стратегия Сначала определите личность, а затем переиспользуйте тот же аккаунт для одной читаемой сводки по кошельку. 01GET /v1/public_key возвращает кандидатные значения account_id для этого ключа. 02jq поднимает тот аккаунт, который вы хотите смотреть дальше. 03GET /v1/account/.../full в одном ответе показывает балансы, NFT и стейкинг. **Что вы делаете** - Ищете по публичному ключу один или несколько `account_id`. - Извлекаете первый найденный `account_id` через `jq`. - Переиспользуете это значение в широком эндпоинте полного снимка аккаунта. ```bash API_BASE_URL=https://api.fastnear.com PUBLIC_KEY='ed25519:YOUR_PUBLIC_KEY' # Пример публичного ключа из модели страницы в документации: # PUBLIC_KEY='ed25519:CCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT' ENCODED_PUBLIC_KEY="$(jq -rn --arg public_key "$PUBLIC_KEY" '$public_key | @uri')" ACCOUNT_ID="$( curl -s "$API_BASE_URL/v1/public_key/$ENCODED_PUBLIC_KEY" \ | tee /tmp/fastnear-public-key.json \ | jq -r '.account_ids[0]' )" jq '{account_ids}' /tmp/fastnear-public-key.json curl -s "$API_BASE_URL/v1/account/$ACCOUNT_ID/full" \ | jq '{ account_id, state, token_count: (.tokens | length), nft_count: (.nfts | length), pool_count: (.pools | length) }' ``` **Зачем нужен следующий шаг?** Поиск по публичному ключу говорит, с каким аккаунтом вы имеете дело. Полный снимок аккаунта — естественный следующий запрос, если нужны балансы, NFT, стейкинг и пулы в одном ответе. Если ключ сопоставляется не с одним, а с несколькими аккаунтами, переходите к [V1 Public Key Lookup All](https://docs.fastnear.com/ru/api/v1/public-key-all) или пройдитесь по каждому найденному `account_id`. ### У меня обычный стейкинг или liquid staking? Используйте этот сценарий, когда история звучит так: «покажи, связан ли этот кошелёк с прямыми staking pool, liquid staking token или и с тем и с другим». Стратегия Сначала сравните staking-позиции и FT-балансы, а уже потом интерпретируйте кошелёк. 01GET /v1/account/.../staking находит прямую экспозицию через пулы. 02GET /v1/account/.../ft находит liquid staking token, которые лежат рядом с пулами или вместо них. 03jq превращает эти два индексированных чтения в direct_only, liquid_only или mixed. **Сеть** - mainnet **Официальные ссылки** - [Валидаторский стейкинг](https://docs.near.org/concepts/basics/staking) - [Liquid staking](https://docs.near.org/primitives/liquid-staking) Этот пример намеренно остаётся наблюдательным. Он классифицирует то, что FastNear видит сейчас по staking-позициям и FT-балансам. Он не доказывает каждую возможную синтетическую или внешнюю форму стейкинг-экспозиции. **Что вы делаете** - Читаете индексированные прямые staking-позиции через staking-эндпоинт аккаунта. - Читаете индексированные FT-балансы через FT-эндпоинт аккаунта. - Классифицируете аккаунт как `direct_only`, `liquid_only`, `mixed` или `no_visible_staking_position`. - Выводите список прямых пулов и список liquid staking-токенов, на которых основана эта классификация. ```bash API_BASE_URL=https://api.fastnear.com ACCOUNT_ID=YOUR_ACCOUNT_ID LIQUID_PROVIDERS_JSON='["meta-pool.near","lst.rhealab.near","linear-protocol.near"]' ``` 1. Получите представление по прямому стейкингу. ```bash curl -s "$API_BASE_URL/v1/account/$ACCOUNT_ID/staking" \ | tee /tmp/account-staking.json \ | jq '{account_id, pools}' ``` 2. Получите FT-балансы, чтобы увидеть liquid staking-позиции. ```bash curl -s "$API_BASE_URL/v1/account/$ACCOUNT_ID/ft" \ | tee /tmp/account-ft.json >/dev/null ``` 3. Классифицируйте аккаунт на основе этих двух индексированных представлений. ```bash jq -n \ --slurpfile staking /tmp/account-staking.json \ --slurpfile ft /tmp/account-ft.json \ --argjson providers "$LIQUID_PROVIDERS_JSON" ' ($staking[0].pools // []) as $direct_pools | ($ft[0].tokens // []) as $tokens | ($tokens | map(select(.contract_id as $id | $providers | index($id)))) as $liquid_tokens | { classification: if (($direct_pools | length) > 0 and ($liquid_tokens | length) > 0) then "mixed" elif (($direct_pools | length) > 0) then "direct_only" elif (($liquid_tokens | length) > 0) then "liquid_only" else "no_visible_staking_position" end, direct_pools: ($direct_pools | map(.pool_id)), liquid_tokens: ( $liquid_tokens | map({ contract_id, balance, last_update_block_height }) ) }' ``` **Зачем нужен следующий шаг?** Если классификация показывает `direct_only`, следующий практический вопрос обычно касается сроков `unstake` и `withdraw`. Если она показывает `liquid_only`, следующий вопрос обычно про `redeem`, `swap` или провайдерский путь выхода. Если результат `mixed`, эти пути лучше рассматривать раздельно, а не пытаться свести их к одному сценарию. ### Заархивировать версию BOS-виджета как provenance NFT Используйте этот сценарий, когда история звучит так: «этот BOS-виджет — реальный on-chain-артефакт. Хочу выпустить NFT, который фиксирует, какую именно версию я заархивировал». Стратегия Сначала прочитайте точный виджет, а mint делайте только тогда, когда provenance-поля уже детерминированы. 01GET /v1/account/.../nft проверяет, есть ли у получателя уже архивные NFT из этой коллекции. 02RPC call_function get на social.near читает точный исходник виджета и блок его записи в SocialDB. 03Захешируйте исходник, выполните nft_mint в testnet, а потом проверьте provenance-поля через nft_tokens_for_owner. **Сети** - mainnet для чтения виджета из `social.near` - testnet для безопасного mint provenance NFT в `nft.examples.testnet` **Официальные ссылки** - [Предразвёрнутый NFT-контракт](https://docs.near.org/tutorials/nfts/js/predeployed-contract) - [Стандарт NFT NEP-171](https://docs.near.org/primitives/nft/standard) - [API SocialDB и поверхность контракта](https://github.com/NearSocial/social-db#api) **Что вы делаете** - Через FastNear API проверяете, есть ли у получателя NFT из архивной коллекции. - Читаете один точный BOS-виджет из `social.near`, включая SocialDB-блок именно этого виджета. - Хешируете исходник виджета и превращаете его в provenance-метаданные. - Выпускаете NFT в testnet, чьи метаданные фиксируют автора, widget-path, SocialDB-блок и хеш исходника. - Подтверждаете, что выпущенный токен действительно несёт эти provenance-поля. Зафиксированный исходный виджет: - аккаунт автора: `mob.near` - путь виджета: `mob.near/widget/Profile` - SocialDB-блок уровня виджета: `86494825` ```bash API_BASE_URL=https://test.api.fastnear.com MAINNET_RPC_URL=https://rpc.mainnet.fastnear.com TESTNET_RPC_URL=https://rpc.testnet.fastnear.com AUTHOR_ACCOUNT_ID=mob.near WIDGET_NAME=Profile DESTINATION_COLLECTION_ID=nft.examples.testnet RECEIVER_ACCOUNT_ID=YOUR_ACCOUNT_ID.testnet SIGNER_ACCOUNT_ID="$RECEIVER_ACCOUNT_ID" ``` 1. Через FastNear API посмотрите, держит ли получатель уже какие-то NFT из архивной коллекции. ```bash curl -s "$API_BASE_URL/v1/account/$RECEIVER_ACCOUNT_ID/nft" \ | tee /tmp/provenance-account-nfts.json >/dev/null jq --arg destination_collection_id "$DESTINATION_COLLECTION_ID" '{ existing_archive_tokens: [ .tokens[]? | select(.contract_id == $destination_collection_id) | { contract_id, token_id, last_update_block_height } ] }' /tmp/provenance-account-nfts.json ``` 2. Прочитайте точное тело виджета и widget-level SocialDB-блок из mainnet. ```bash WIDGET_ARGS_BASE64="$( jq -nc --arg author_account_id "$AUTHOR_ACCOUNT_ID" --arg widget_name "$WIDGET_NAME" '{ keys: [($author_account_id + "/widget/" + $widget_name)], options: {with_block_height: true} }' | base64 | tr -d '\n' )" curl -s "$MAINNET_RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg args_base64 "$WIDGET_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: "social.near", method_name: "get", args_base64: $args_base64, finality: "final" } }')" \ | jq '.result.result | implode | fromjson' \ | tee /tmp/bos-widget.json >/dev/null jq --arg author_account_id "$AUTHOR_ACCOUNT_ID" --arg widget_name "$WIDGET_NAME" '{ widget_path: ($author_account_id + "/widget/" + $widget_name), socialdb_block_height: .[$author_account_id].widget[$widget_name][":block"], source_preview: ( .[$author_account_id].widget[$widget_name][""] | split("\n")[0:8] ) }' /tmp/bos-widget.json ``` 3. Захешируйте исходник виджета и постройте детерминированные provenance-метаданные. ```bash jq -r --arg author_account_id "$AUTHOR_ACCOUNT_ID" --arg widget_name "$WIDGET_NAME" ' .[$author_account_id].widget[$widget_name][""] ' /tmp/bos-widget.json > /tmp/bos-widget-source.jsx WIDGET_BLOCK_HEIGHT="$( jq -r --arg author_account_id "$AUTHOR_ACCOUNT_ID" --arg widget_name "$WIDGET_NAME" ' .[$author_account_id].widget[$widget_name][":block"] ' /tmp/bos-widget.json )" SOURCE_SHA256="$(shasum -a 256 /tmp/bos-widget-source.jsx | awk '{print $1}')" SOURCE_HASH_SHORT="$(printf '%s' "$SOURCE_SHA256" | cut -c1-12)" TOKEN_ID="bos-widget-$SOURCE_HASH_SHORT" PROVENANCE_METADATA_JSON="$( jq -nc \ --arg author_account_id "$AUTHOR_ACCOUNT_ID" \ --arg widget_name "$WIDGET_NAME" \ --arg widget_path "$AUTHOR_ACCOUNT_ID/widget/$WIDGET_NAME" \ --arg block_height "$WIDGET_BLOCK_HEIGHT" \ --arg source_sha256 "$SOURCE_SHA256" '{ title: ("BOS widget archive: " + $widget_path), description: ("Archived from social.near on mainnet at block " + $block_height), copies: 1, extra: ({ author_account_id: $author_account_id, widget_name: $widget_name, widget_path: $widget_path, source_contract_id: "social.near", source_network: "mainnet", socialdb_block_height: ($block_height | tonumber), source_sha256: $source_sha256 } | @json) }' )" printf '%s\n' "$PROVENANCE_METADATA_JSON" | jq '.' ``` 4. Выпустите provenance NFT в testnet. ```bash near call "$DESTINATION_COLLECTION_ID" nft_mint "$(jq -nc \ --arg token_id "$TOKEN_ID" \ --arg receiver_id "$RECEIVER_ACCOUNT_ID" \ --argjson metadata "$PROVENANCE_METADATA_JSON" '{ token_id: $token_id, receiver_id: $receiver_id, metadata: $metadata }')" \ --accountId "$SIGNER_ACCOUNT_ID" \ --deposit 0.1 \ --networkId testnet ``` 5. Подтвердите, что выпущенный NFT действительно несёт ожидаемые provenance-поля. Не считайте отсутствие токена ошибкой мгновенно: после mint-транзакции опросите view-метод несколько раз. ```bash NFT_TOKEN_ARGS_BASE64="$( jq -nc --arg token_id "$TOKEN_ID" '{token_id: $token_id}' \ | base64 | tr -d '\n' )" for attempt in 1 2 3 4 5; do curl -s "$TESTNET_RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$DESTINATION_COLLECTION_ID" \ --arg args_base64 "$NFT_TOKEN_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "nft_token", args_base64: $args_base64, finality: "final" } }')" \ | jq '.result.result | implode | fromjson' \ | tee /tmp/bos-widget-provenance-token.json >/dev/null if jq -e '. != null' /tmp/bos-widget-provenance-token.json >/dev/null; then break fi sleep 1 done jq '{ token_id, owner_id, title: .metadata.title, provenance: (.metadata.extra | fromjson) }' /tmp/bos-widget-provenance-token.json ``` **Зачем нужен следующий шаг?** FastNear API даёт быстрый чек со стороны получателя. Mainnet RPC даёт точное тело виджета и его SocialDB-блок. После этого mint в testnet превращает чтение в долговечную NFT-запись. Если позже понадобится доказать, какая именно историческая транзакция записала этот виджет, переходите к NEAR Social proof-расследованиям в [Transactions API examples](https://docs.fastnear.com/ru/tx/examples). ## Частые задачи ### Что этот аккаунт вообще держит прямо сейчас? **Начните здесь** - [V1 Full Account View](https://docs.fastnear.com/ru/api/v1/account-full), когда нужен самый быстрый понятный ответ на вопрос «что сейчас лежит в этом аккаунте?» **Следующая страница при необходимости** - [V1 Account FT](https://docs.fastnear.com/ru/api/v1/account-ft), [V1 Account NFT](https://docs.fastnear.com/ru/api/v1/account-nft) или [V1 Account Staking](https://docs.fastnear.com/ru/api/v1/account-staking), если широкая сводка уже помогла, но дальше хочется остаться только в одной категории активов. - [Transactions API account history](https://docs.fastnear.com/ru/tx/account), если следующий вопрос звучит как «как аккаунт пришёл к такому состоянию?», а не «что он держит сейчас?» **Остановитесь, когда** - Сводка уже отвечает на вопрос по активам в одной выдаче. **Переходите дальше, когда** - Пользователь спрашивает о точном состоянии аккаунта, о семантике ключей доступа или о протокольных полях. Переходите к [RPC Reference](https://docs.fastnear.com/ru/rpc). - Пользователя интересует история активности или исполнения, а не текущий набор активов. Переходите к [Transactions API](https://docs.fastnear.com/ru/tx). ### Определить аккаунты по публичному ключу **Начните здесь** - [V1 Public Key Lookup](https://docs.fastnear.com/ru/api/v1/public-key), когда нужен основной аккаунт для ключа. - [V1 Public Key Lookup All](https://docs.fastnear.com/ru/api/v1/public-key-all), когда нужен более полный список связанных аккаунтов. **Следующая страница при необходимости** - [V1 Full Account View](https://docs.fastnear.com/ru/api/v1/account-full) после поиска, если сразу нужна сводка по балансам или активам найденных аккаунтов. **Остановитесь, когда** - Уже определён аккаунт или набор аккаунтов, которым принадлежит ключ. **Переходите дальше, когда** - Пользователь спрашивает о точных правах ключа, nonce или текущем состоянии access key. Переходите к [View Access Key](https://docs.fastnear.com/ru/rpc/account/view-access-key) или [View Access Key List](https://docs.fastnear.com/ru/rpc/account/view-access-key-list). - Пользователя интересует недавняя активность найденных аккаунтов, а не только их идентификация. Переходите к [Transactions API](https://docs.fastnear.com/ru/tx). ### Есть ли у этого аккаунта FT, NFT или стейкинг-позиции? **Начните здесь** - [V1 Account FT](https://docs.fastnear.com/ru/api/v1/account-ft), когда вопрос относится только к балансам FT-токенов. - [V1 Account NFT](https://docs.fastnear.com/ru/api/v1/account-nft), когда вопрос конкретно про владение NFT. - [V1 Account Staking](https://docs.fastnear.com/ru/api/v1/account-staking), когда пользователя интересуют именно стейкинг-позиции, а не вся картина по аккаунту. **Следующая страница при необходимости** - [V1 Full Account View](https://docs.fastnear.com/ru/api/v1/account-full), если после одной категории активов позже понадобится вся картина по аккаунту. - [Transactions API account history](https://docs.fastnear.com/ru/tx/account), если вопрос уже меняется с «чем аккаунт владеет?» на «как он к этому пришёл?» **Остановитесь, когда** - Эндпоинт по конкретной категории активов уже отвечает на вопрос о владении без пересборки всей картины аккаунта. **Переходите дальше, когда** - Индексированного представления недостаточно и нужна точная семантика состояния в цепочке. Переходите к [RPC Reference](https://docs.fastnear.com/ru/rpc). - Вопрос становится историческим или связанным с исполнением вместо «чем этот аккаунт владеет сейчас?». Переходите к [Transactions API](https://docs.fastnear.com/ru/tx). ## Частые ошибки - Сразу идти в широкий снимок аккаунта, когда пользователя интересует только одна категория активов. - Использовать FastNear API, хотя пользователю прямо нужны точные поля RPC или права доступа. - Оставаться на страницах сводок по аккаунту, когда вопрос уже стал вопросом об истории транзакций. - Забывать, что `?network=testnet` поддерживается только на совместимых страницах. ## Полезные связанные страницы - [FastNear API](https://docs.fastnear.com/ru/api) - [API Reference](https://docs.fastnear.com/ru/api/reference) - [RPC Reference](https://docs.fastnear.com/ru/rpc) - [Transactions API](https://docs.fastnear.com/ru/tx) - [Choosing the Right Surface](https://docs.fastnear.com/ru/agents/choosing-surfaces) - [Agent Playbooks](https://docs.fastnear.com/ru/agents/playbooks) --- ## Справочник API - HTML-маршрут: https://docs.fastnear.com/ru/api/reference - Markdown-маршрут: https://docs.fastnear.com/ru/api/reference.md **Источник:** [https://docs.fastnear.com/ru/api/reference](https://docs.fastnear.com/ru/api/reference) # Справочник API Этот раздел объясняет, что относится к REST-слою FastNear и как выбрать между REST-семействами до перехода к сырому JSON-RPC. Сайдбар `/api` намеренно посвящён именно **FastNear API**, а не универсальному REST-разделу. Другие REST-семейства — [Транзакции API](https://docs.fastnear.com/ru/tx), [API переводов](https://docs.fastnear.com/ru/transfers), [NEAR Data API](https://docs.fastnear.com/ru/neardata) и [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) — живут в собственных верхнеуровневых разделах. ## REST-семейства с одного взгляда | Семейство | Начните здесь, когда... | Переключайтесь, когда... | | --- | --- | --- | | [FastNear API](https://docs.fastnear.com/ru/api) | нужны индексированные представления аккаунтов, токенов, NFT, стейкинга или публичных ключей | требуется каноническая семантика RPC на уровне протокола | | [Транзакции API](https://docs.fastnear.com/ru/tx) | нужна история транзакций, квитанций, аккаунта или блока | нужны только события переводов или точное поведение на уровне RPC | | [API переводов](https://docs.fastnear.com/ru/transfers) | вопрос именно о движении NEAR или FT-токенов | вопрос расширяется до общей истории исполнения | | [NEAR Data API](https://docs.fastnear.com/ru/neardata) | нужны свежие оптимистичные или финализированные чтения семейства блоков | нужно точное каноническое продолжение по блоку или состоянию | | [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) | нужна индексированная история «ключ–значение» или последнее индексированное состояние ключа | нужно точное текущее состояние контракта в цепочке | ## Для чего нужен сам `/api` Используйте раздел [FastNear API](https://docs.fastnear.com/ru/api), когда пользователю нужен ответ в продуктовой форме без сшивания сырых ответов узла: - сводки по аккаунту - балансы FT-токенов - активы NFT - позиции стейкинга - разрешение публичного ключа в аккаунт Хорошие стартовые страницы в этом сайдбаре: - [V1 Full Account View](https://docs.fastnear.com/ru/api/v1/account-full) - [V1 Account FT](https://docs.fastnear.com/ru/api/v1/account-ft) - [V1 Account NFT](https://docs.fastnear.com/ru/api/v1/account-nft) - [V1 Account Staking](https://docs.fastnear.com/ru/api/v1/account-staking) - [V1 Public Key](https://docs.fastnear.com/ru/api/v1/public-key) ## Когда не стоит стартовать с `/api` Не начинайте с этого сайдбара, когда: - основная задача — история; используйте [Транзакции API](https://docs.fastnear.com/ru/tx) или [API переводов](https://docs.fastnear.com/ru/transfers) - основная задача — опрос свежих блоков; используйте [NEAR Data API](https://docs.fastnear.com/ru/neardata) - ответ должен оставаться близким к каноническим формам запроса и ответа узла; используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc) ## Для агентов Если вызывающая сторона — ИИ-агент и выбор всё ещё не ясен: - [Агенты на FastNear](https://docs.fastnear.com/ru/agents) - [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces) --- ## Аутентификация и доступ - HTML-маршрут: https://docs.fastnear.com/ru/auth - Markdown-маршрут: https://docs.fastnear.com/ru/auth.md **Источник:** [https://docs.fastnear.com/ru/auth](https://docs.fastnear.com/ru/auth) # Аутентификация и доступ Один API-ключ FastNear работает и для [RPC](https://docs.fastnear.com/ru/rpc), и для [API-эндпоинтов](https://docs.fastnear.com/ru/api). Многие публичные чтения работают и без него, но когда ключ нужен, модель остаётся простой: используйте один и тот же ключ везде и передавайте его либо через заголовок `Authorization: Bearer`, либо как URL-параметр `?apiKey=`. Та же модель действует и на обычных, и на архивных RPC-хостах. Хранение ключа в браузере для UI документации — это удобство документации, а не продовый шаблон. Войдите на [dashboard.fastnear.com](https://dashboard.fastnear.com), чтобы получить ключ, и отправляйте его в каждом запросе одним из способов ниже. Страницы с интерактивными примерами также поддерживают `Copy example URL`, чтобы делиться уже заполненными запросами. Общие URL примеров выполняются автоматически при загрузке, когда в них есть состояние операции, а сохранённые API-ключи и токены никогда не включаются в такие общедоступные URL документации. ## Через заголовок Authorization ```bash curl "https://rpc.mainnet.fastnear.com" \ -H "Authorization: Bearer ${API_KEY}" \ -H "Content-Type: application/json" \ --data '{"method":"block","params":{"finality":"final"},"id":1,"jsonrpc":"2.0"}' ``` ## Через URL-параметр `?apiKey=` ```bash curl "https://rpc.mainnet.fastnear.com?apiKey=${API_KEY}" \ -H "Content-Type: application/json" \ --data '{"method":"block","params":{"finality":"final"},"id":1,"jsonrpc":"2.0"}' ``` --- ## KV FastData API - HTML-маршрут: https://docs.fastnear.com/ru/fastdata/kv - Markdown-маршрут: https://docs.fastnear.com/ru/fastdata/kv.md **Источник:** [https://docs.fastnear.com/ru/fastdata/kv](https://docs.fastnear.com/ru/fastdata/kv) # KV FastData API KV FastData API — это индексированное семейство «ключ–значение». Используйте его, когда уже известен контракт, аккаунт, `predecessor_id` или область ключа, которую нужно проинспектировать, и нужны индексированные строки без построения собственного слоя индексации хранилища. ## Базовые URL ```bash title="KV FastData API Mainnet" https://kv.main.fastnear.com ``` ```bash title="KV FastData API Testnet" https://kv.test.fastnear.com ``` ## Используйте этот API, когда - нужно последнее индексированное состояние по одному ключу или известному семейству ключей - нужна история изменений по аккаунту, ключу или `predecessor_id` - нужны пакетные поиски по уже известным точным ключам - идёт отладка хранилища контракта в индексированном виде ## Не стартуйте здесь, когда - нужны балансы, активы токенов, NFT или сводки аккаунта - нужны свежие данные семейства блоков - нужно точное текущее состояние в цепочке с канонической семантикой RPC Используйте [FastNear API](https://docs.fastnear.com/ru/api) для представлений аккаунта более высокого уровня, [NEAR Data API](https://docs.fastnear.com/ru/neardata) для чтений семейства блоков и [Справочник RPC](https://docs.fastnear.com/ru/rpc) для канонической инспекции состояния контракта. ## Минимально полезные входы - сеть - идентификатор контракта или другая точная область — аккаунт, `predecessor_id` или точный ключ - нужно пользователю последнее индексированное значение или история изменений ## Выберите форму запроса - [Последнее по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-latest-key) — когда уже известен один точный ключ - [История по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-history-key) — когда нужна история изменений одного точного ключа - [Последнее по аккаунту](https://docs.fastnear.com/ru/fastdata/kv/latest-by-account) или [История по аккаунту](https://docs.fastnear.com/ru/fastdata/kv/history-by-account) — когда область привязана к аккаунту - [Всё по `predecessor_id`](https://docs.fastnear.com/ru/fastdata/kv/all-by-predecessor) или [История по `predecessor_id`](https://docs.fastnear.com/ru/fastdata/kv/history-by-predecessor) — когда правильная область — `predecessor_id` - [Пакетный поиск по ключам](https://docs.fastnear.com/ru/fastdata/kv/multi) — когда уже известно несколько точных ключей ## Нужен сценарий? Используйте [примеры KV FastData](https://docs.fastnear.com/ru/fastdata/kv/examples) для простых пошаговых сценариев: поиска по точному ключу, истории ключей, анализа по `predecessor_id` и перехода к каноническому RPC. ## Рабочий цикл по умолчанию 1. Выберите самую узкую область, подходящую под вопрос пользователя. 2. Оставайтесь внутри KV FastData, пока вопрос остаётся про индексированные данные «ключ–значение». 3. Используйте эндпоинты «последнего значения» для текущих индексированных представлений, а исторические эндпоинты — только когда пользователю нужны ответы с изменением во времени. 4. Остановитесь, как только индексированных строк уже достаточно для ответа на вопрос о хранилище. ## Аутентификация и доступность - Публичные индексированные чтения хранилища часто работают и без ключа. - Если вы стандартизируете один FastNear API-ключ на всех поверхностях FastNear, используйте здесь тот же формат через заголовок или параметр запроса. - Добавьте `?network=testnet`, чтобы переключить страницу на testnet-бэкенд там, где это поддерживается. - В ответах со списками поле `page_token` отсутствует, когда новых результатов больше нет. ## Расширяйтесь, только если - пользователю нужно точное текущее состояние в цепочке, а не индексированные данные хранилища - пользователю нужна каноническая семантика состояния контракта - индексированное представление хранилища — неподходящая абстракция для вопроса Тогда расширяйтесь на [Просмотр состояния контракта](https://docs.fastnear.com/ru/rpc/contract/view-state) в [Справочнике RPC](https://docs.fastnear.com/ru/rpc). ## Устранение неполадок ### Токен пагинации перестал работать Считайте значения `page_token` непрозрачными и переиспользуйте их только с тем же эндпоинтом и фильтрами. ### Мне нужны продуктовые балансы аккаунта, а не сырые строки «ключ–значение» Переходите на [FastNear API](https://docs.fastnear.com/ru/api). --- ## Примеры KV FastData - HTML-маршрут: https://docs.fastnear.com/ru/fastdata/kv/examples - Markdown-маршрут: https://docs.fastnear.com/ru/fastdata/kv/examples.md **Источник:** [https://docs.fastnear.com/ru/fastdata/kv/examples](https://docs.fastnear.com/ru/fastdata/kv/examples) ## Готовое расследование ### Проверить один ключ контракта, а затем пройти по его истории Используйте это расследование, когда один ключ хранилища контракта выглядит подозрительно и вы хотите увидеть его последнее индексированное значение, историю записей по тому же ключу и финальную проверку через `view_state`. Стратегия Начните с одного точного ключа, расширяйтесь только до его истории и завершайте одной проверкой текущего chain-state. 01get-latest-key даёт самую новую индексированную запись по точному ключу. 02get-history-key или history-by-key показывают, как тот же ключ менялся во времени. 03RPC view_state — это финальное точное чтение, когда нужно сравнить индексированную историю с тем, что цепочка возвращает прямо сейчас. **Цель** - Объяснить, как этот ключ выглядит в индексе, как он менялся и совпадает ли с этим `view_state` прямо сейчас. | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Последнее индексированное значение | KV FastData [`get-latest-key`](https://docs.fastnear.com/ru/fastdata/kv/get-latest-key) | Сначала получаем последнюю индексированную запись по точному ключу | Даёт самый быстрый узкий ответ до перехода к истории | | История индексированного ключа | KV FastData [`get-history-key`](https://docs.fastnear.com/ru/fastdata/kv/get-history-key) или [`history-by-key`](https://docs.fastnear.com/ru/fastdata/kv/history-by-key) | Забираем историю изменений того же ключа во времени | Показывает, стабильно ли текущее значение, насколько оно недавнее и не входит ли в подозрительную последовательность | | Более широкий паттерн записей | KV FastData [`latest-by-account`](https://docs.fastnear.com/ru/fastdata/kv/latest-by-account) или [`history-by-predecessor`](https://docs.fastnear.com/ru/fastdata/kv/history-by-predecessor) | Смотрим аккаунт или предшественника, если один ключ — только часть более широкой картины | Помогает понять, менялся ли ключ сам по себе или как часть большего набора записей | | Точная проверка состояния | RPC [`view_state`](https://docs.fastnear.com/ru/rpc/contract/view-state) | Подтверждаем текущее состояние в цепочке, когда индексированная картина уже понятна | Разводит индексированную историю и точное состояние, которое цепочка вернёт прямо сейчас | **Что должен включать полезный ответ** - какой именно ключ и какая область контракта были исследованы - как выглядит последнее индексированное значение и какие изменения видны в истории - совпал ли `view_state` с текущим индексированным значением ### Shell-сценарий истории точного ключа Используйте этот сценарий, когда один полностью определённый ключ уже известен и нужно аккуратно перейти от вопроса «какая последняя индексированная запись?» к вопросу «как этот конкретный ключ дошёл до такого состояния?» **Что вы делаете** - Читаете последнюю индексированную запись по точному контракту, predecessor и пути ключа. - Извлекаете точный `key` через `jq`. - Переиспользуете этот ключ в `POST /v0/history`, чтобы получить историю записей по тому же ключу. ```bash KV_BASE_URL=https://kv.main.fastnear.com CURRENT_ACCOUNT_ID=social.near PREDECESSOR_ID=james.near KEY='graph/follow/sleet.near' ENCODED_KEY="$(jq -rn --arg key "$KEY" '$key | @uri')" EXACT_KEY="$( curl -s "$KV_BASE_URL/v0/latest/$CURRENT_ACCOUNT_ID/$PREDECESSOR_ID/$ENCODED_KEY" \ | tee /tmp/kv-latest.json \ | jq -r '.entries[0].key' )" jq '{ latest: ( .entries[0] | { current_account_id, predecessor_id, block_height, key, value } ) }' /tmp/kv-latest.json curl -s "$KV_BASE_URL/v0/history" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg key "$EXACT_KEY" '{key: $key, limit: 10}')" \ | jq '{ page_token, entries: [ .entries[] | { current_account_id, predecessor_id, block_height, value } ] }' ``` **Зачем нужен следующий шаг?** Первый запрос отвечает на вопрос «что у нас есть прямо сейчас?». Повторное использование точного `key` в `POST /v0/history` отвечает на вопрос «как мы к этому пришли?». Если результат получается слишком широким, снова сузьте его через [GET History by Exact Key](https://docs.fastnear.com/ru/fastdata/kv/get-history-key). ## Частые задачи ### Посмотреть один точный ключ прямо сейчас **Начните здесь** - [Последнее по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-latest-key), когда точный ключ уже известен. **Следующая страница при необходимости** - [История по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-history-key), если вопрос превращается в «как менялся этот ключ?» **Остановитесь, когда** - Последняя индексированная запись уже отвечает на вопрос о хранилище. **Переходите дальше, когда** - Пользователю нужно точное текущее состояние в цепочке, а не индексированное хранилище. Переходите к [View State](https://docs.fastnear.com/ru/rpc/contract/view-state). ### Превратить один точный ключ в историю изменений **Начните здесь** - [История по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-history-key) для поиска истории по пути. - [History by Key](https://docs.fastnear.com/ru/fastdata/kv/history-by-key), когда лучше подходит маршрут по полному ключу. **Следующая страница при необходимости** - Возвращайтесь к [Последнему по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-latest-key), если нужно увидеть текущее индексированное значение рядом с историей. **Остановитесь, когда** - Уже можно объяснить, как ключ менялся со временем. **Переходите дальше, когда** - Пользователь спрашивает, совпадает ли последнее индексированное значение с тем, что цепочка возвращает прямо сейчас. ### Проследить записи от одного `predecessor_id` **Начните здесь** - [Всё по `predecessor_id`](https://docs.fastnear.com/ru/fastdata/kv/all-by-predecessor) для последних записей по контрактам, затронутым одним предшественником. - [История по `predecessor_id`](https://docs.fastnear.com/ru/fastdata/kv/history-by-predecessor), когда нужна история записей во времени. **Следующая страница при необходимости** - Сузьте область до точного ключа, если одна строка становится настоящим фокусом расследования. **Остановитесь, когда** - Уже можно ответить, что именно этот предшественник изменил и где. **Переходите дальше, когда** - Пользователя перестают интересовать индексированные записи и начинает интересовать текущее состояние в цепочке. ### Пакетно проверить несколько известных ключей **Начните здесь** - [Пакетный поиск по ключам](https://docs.fastnear.com/ru/fastdata/kv/multi), когда уже известен фиксированный набор точных ключей. **Следующая страница при необходимости** - Переведите один интересный ключ в [Историю по точному ключу](https://docs.fastnear.com/ru/fastdata/kv/get-history-key), если batch-ответ вызывает исторический вопрос. **Остановитесь, когда** - Пакетный ответ уже показывает, какие ключи действительно важны. **Переходите дальше, когда** - У вас больше нет фиксированного списка ключей и нужно смотреть на контракт или предшественника шире. ## Частые ошибки - Начинать с широких выборок по аккаунту или предшественнику, когда точный ключ уже известен. - Использовать KV FastData, хотя пользователю на самом деле нужны балансы или активы. - Путать индексированную историю с точным текущим состоянием в цепочке. - Переиспользовать токен пагинации или менять фильтры прямо во время просмотра. ## Полезные связанные страницы - [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv) - [RPC Reference](https://docs.fastnear.com/ru/rpc) - [FastNear API](https://docs.fastnear.com/ru/api) - [Choosing the Right Surface](https://docs.fastnear.com/ru/agents/choosing-surfaces) - [Agent Playbooks](https://docs.fastnear.com/ru/agents/playbooks) --- ## Руководство по интернационализации - HTML-маршрут: https://docs.fastnear.com/ru/internationalization - Markdown-маршрут: https://docs.fastnear.com/ru/internationalization.md **Источник:** [https://docs.fastnear.com/ru/internationalization](https://docs.fastnear.com/ru/internationalization) Это руководство описывает локализационный фреймворк в `builder-docs`. Русская локаль была первой полной реализацией, но теперь это уже не отдельный разовый проект. Следующие локали должны использовать тот же каркас: - общий реестр локалей - собственные для локали файлы glossary и policy - безопасный bootstrap без перезаписи вычитанного контента - редакционный QA по волнам - маршрутизация, SEO и discovery-артефакты с учётом локали - локализованные FastNear-оверлеи без изменения сгенерированного английского источника ## Цели Этот фреймворк нужен, чтобы следующие локали были в основном задачей контента, а не инфраструктуры. Базовые правила такие: - английский остаётся локалью по умолчанию на `/` - локализованные docs публикуются по `//...` - канонические технические идентификаторы не переводятся - slug - пути эндпоинтов - ключи payload - имена свойств схем - operation ID - локализация сгенерированного контента остаётся оверлеем, а не правкой vendored-данных на месте ## Основные файлы ### Реестр локалей Поддерживаемые локали находятся в `src/data/localeRegistry.json`. Этот реестр является общим источником истины для: - конфигурации локалей Docusaurus - locale-aware route helpers - bootstrap и audit-скриптов - клиентских метаданных для скрытых разделов ### Глоссарий локали У каждой недефолтной локали есть `i18n//glossary.yml`. Глоссарий задаёт терминологический контракт и для людей, и для скриптов. Благодаря этому решения о переводе не расползаются по JS-массивам и prose-документам. Текущая схема: - `preserve` Термины, которые должны оставаться в канонической форме, например `RPC`, `API`, `JSON-RPC`, `GET`, `POST`, `FastNear`, `mainnet`. - `translate` Предпочтительные точные и словарные замены для повторяющихся UI- и docs-фраз. - `transliterate` Предпочтительные транслитерации для технического жаргона, если это лучше, чем оставлять латиницу. - `notes` Человеческие примечания с редакционным смыслом, которые не нужны скриптам напрямую. ### Policy-файл локали У каждой недефолтной локали есть и `i18n//translation-policy.yml`. Этот файл описывает редакционный объём и правила процесса: - `waves.wave1` Обязательные для ship docs и page model IDs. Это редакционная планка, которую проверяет CI. - `waves.wave2` Более широкий публичный охват для следующего прохода. - `hiddenSections` Префиксы маршрутов и путей docs, которые намеренно остаются вне редакционной планки, пока раздел не станет публичным. - `bootstrap` Локальные route labels и JSON overrides, которые использует scaffold-поток. Для русской локали первым таким скрытым разделом является `/transaction-flow`. ## Общие команды Теперь фреймворк использует generic-команды вместо русско-специфичных скриптов. ```bash yarn bootstrap:i18n --locale yarn bootstrap:i18n:reseed --locale yarn audit:i18n --locale --wave <1|2|all> yarn audit:i18n:all ``` Что они делают: - `bootstrap:i18n` Безопасно обновляет scaffold и добавляет отсутствующие файлы и ключи, не перезаписывая вычитанный контент. - `bootstrap:i18n:reseed` Явно разрушительный режим для случая, когда локаль нужно полностью пересоздать из bootstrap-эвристик. - `audit:i18n` Glossary-aware редакционный QA для одной локали и выбранной волны. - `audit:i18n:all` CI-ориентированная проверка `wave1` для всех недефолтных локалей. Русские совместимые алиасы всё ещё поддерживаются: ```bash yarn bootstrap:i18n:ru yarn bootstrap:i18n:ru:reseed yarn audit:i18n:ru ``` Но каноническим интерфейсом теперь считаются generic-команды. ## Как работает bootstrap `scripts/bootstrap-i18n.js` по умолчанию ведёт себя безопасно. Для локали вроде `ru` он: - запускает `write-translations --locale ru` - создаёт отсутствующие docs в `i18n/ru/docusaurus-plugin-content-docs/current` - сохраняет уже вычитанные локальные docs - добавляет отсутствующие ключи рантайма в locale JSON catalogs - обновляет `src/data/fastnearTranslations..json`, не выбрасывая уже вычитанные оверлеи - применяет локальные route labels и JSON overrides из `translation-policy.yml` То есть свежесть scaffold и ручная редактура больше не конфликтуют. ## Как работает audit `scripts/audit-i18n.js` — это лёгкий редакционный барьер качества. Он читает: - glossary локали для списка допустимых literal-терминов - translation policy для границ волн и исключений скрытых разделов - docs локали в `i18n//...` - каталоги переводов рантайма для локали - FastNear overlay catalog локали Проверка ищет подозрительные английские остатки, но уважает допустимые literal-термины: - названия протоколов - HTTP verbs - продуктовые имена - code identifiers - канонические фрагменты путей Это практический QA, а не попытка отполировать весь длинный хвост в первый же день. ## Политика волн Каждая локаль должна проходить через одну и ту же редакционную модель. ### Wave 1 Wave 1 — это shipping bar. Сюда входят: - главная страница и ключевые decision pages - основные входные точки для auth, API, RPC и transactions - самые заметные generated operation wrappers и overlay entries - живые строки интерфейса рантайма на этих страницах Только Wave 1 проверяется в CI. ### Wave 2 Wave 2 — это расширение публичной поверхности. Сюда входят: - дополнительные leaf docs - overview-страницы из длинного хвоста - дополнительные generated overlay entries - менее приоритетный, но всё ещё публичный текст рантайма Wave 2 важен, но специально остаётся неблокирующим. ### Long tail Long-tail работа — это дальнейшая полировка: - maintainer docs - редкие leaf pages - редко видимые theme strings - малопосещаемые generated pages Эта работа должна продолжаться, но не должна блокировать здоровый выпуск локали. ## Скрытые разделы Скрытые разделы должны быть явно помечены, чтобы широкое файловое покрытие не принимали за редакционную готовность. Источник истины — `translation-policy.yml.hiddenSections`. Эти префиксы влияют на две вещи: - исключаются из обязательной `wave1`-готовности - на страницах этих разделов показывается заметный баннер, который объясняет, что перевод и редакторская полировка намеренно отложены до публикации раздела Сейчас по этому правилу живёт `/transaction-flow`. ## Рантайм, маршрутизация и discovery Фреймворк покрывает не только prose, но и остальные поверхности, которые будущие локали должны наследовать автоматически. Важные файлы: - `docusaurus.config.js` - `src/utils/localizedRoutes.js` - `src/utils/fastnearLocalization.js` - `scripts/generate-ai-surfaces.js` - `plugins/finalizeLocalizedStaticAssets.cjs` Вместе они обеспечивают: - корректную работу locale dropdown и locale-aware routing - сохранение активной локали для внутренних ссылок - локализацию FastNear overlay без изменения source page models - выпуск локализованных Markdown mirrors, `llms.txt` и site graph из правильного корня локали - локализованные URL и `inLanguage` в structured data и SEO ## Лёгкий CI-барьер Locale-quality gate намеренно сделан небольшим. Обязательный workflow запускает: ```bash yarn audit:i18n:all yarn build node scripts/audit-indexing-surface.js ``` Этого достаточно, чтобы защитить: - качество `wave1` - корректность сборки - корректность discovery и indexing Playwright, relevance scoring и более тяжёлые редакционные проверки сюда специально не включены. ## Как добавить новую локаль Используйте такой чеклист: 1. Добавьте локаль в `src/data/localeRegistry.json`. 2. Создайте `i18n//glossary.yml`. 3. Создайте `i18n//translation-policy.yml`. 4. Запустите `yarn bootstrap:i18n --locale `. 5. Вычитайте `i18n//code.json` и дерево docs. 6. Добавьте `src/data/fastnearTranslations..json` для generated FastNear overlay. 7. Запустите `yarn audit:i18n --locale --wave 1`. 8. Запустите `yarn build` и `node scripts/audit-indexing-surface.js`. 9. Добавьте браузерные smoke-checks только там, где локаль вносит новое поведение рантайма. Если идти по этому списку, следующие локали будут в основном редакционной задачей поверх уже готового фреймворка. --- ## NEAR Data API - HTML-маршрут: https://docs.fastnear.com/ru/neardata - Markdown-маршрут: https://docs.fastnear.com/ru/neardata.md **Источник:** [https://docs.fastnear.com/ru/neardata](https://docs.fastnear.com/ru/neardata) # NEAR Data API NEAR Data API — это поверхность для чтения данных почти в реальном времени, а также по семействам блоков. Используйте её, когда нужны свежие срезы блоков, вспомогательные маршруты с перенаправлением или недавние финализированные и оптимистичные чтения, но без позиционирования продукта как потокового сервиса. ## Базовые URL ```bash title="NEAR Data API Mainnet" https://mainnet.neardata.xyz ``` ```bash title="NEAR Data API Testnet" https://testnet.neardata.xyz ``` ## Лучше всего подходит для - опроса недавних финализированных и оптимистичных блоков; - вспомогательных маршрутов по блокам и сценариев с перенаправлением; - лёгких проверок свежести данных и мониторинга. ## Когда его не стоит использовать - Используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc) для канонических методов JSON-RPC и отправки транзакций. - Используйте [Снапшоты](https://docs.fastnear.com/ru/snapshots) для поднятия инфраструктуры, а не для чтения живых данных. ## Аутентификация и доступность - Тот же FastNear API-ключ работает и здесь; на публичном трафике на поддерживаемых маршрутах по-прежнему можно использовать необязательный параметр запроса `apiKey`. - Неверный API-ключ возвращает `401` ещё до того, как сработают вспомогательные перенаправления, поэтому при отладке с неверным ключом канонический URL не будет виден. - Добавьте `?network=testnet`, чтобы переключить совместимые страницы на значения по умолчанию для testnet. ## С чего обычно начинают - [Оптимистичный блок](https://docs.fastnear.com/ru/neardata/block-optimistic) — для самого свежего опроса блоков. - [Финализированный блок по высоте](https://docs.fastnear.com/ru/neardata/block) и [Заголовки блока](https://docs.fastnear.com/ru/neardata/block-headers) — для запросов по финализированным блокам. - [Перенаправление на последний финализированный блок](https://docs.fastnear.com/ru/neardata/last-block-final) и [Перенаправление на последний оптимистичный блок](https://docs.fastnear.com/ru/neardata/last-block-optimistic) — когда нужны вспомогательные маршруты с перенаправлением. ## Нужен сценарий? Используйте [примеры NEAR Data API](https://docs.fastnear.com/ru/neardata/examples) для простых пошаговых сценариев: опроса оптимистичных блоков, подтверждения финализированных блоков, работы с перенаправлениями и перехода к каноническому RPC. ## Устранение неполадок ### Некоторые эндпоинты перенаправляют на канонический URL вместо прямого возврата результата Это ожидаемое поведение для вспомогательных маршрутов с перенаправлением. Если клиенту нужен итоговый ресурс, переходите по канонической цели. ### Ответ по блоку равен `null` Обычно это означает, что запрошенной высоты нет в этой сети или запрос вышел за ожидаемый диапазон свежести либо архива. ### Нужна потоковая передача, а не опрос Эта поверхность предназначена для чтения через опрос почти в реальном времени. Не позиционируйте её как продукт на основе WebSocket или вебхуков. --- ## Примеры NEAR Data - HTML-маршрут: https://docs.fastnear.com/ru/neardata/examples - Markdown-маршрут: https://docs.fastnear.com/ru/neardata/examples.md **Источник:** [https://docs.fastnear.com/ru/neardata/examples](https://docs.fastnear.com/ru/neardata/examples) ## Готовое расследование ### Поймать новый блок как можно раньше, а затем подтвердить его после finality Используйте это расследование, когда нужно заметить новый блок как можно раньше, но финальный ответ всё равно должен опираться на финализированный блок и иногда на точное чтение через RPC. Стратегия Пусть NEAR Data сначала скажет, что что-то изменилось, а затем переиспользуйте то же семейство блоков для стабильного подтверждения. 01block-optimistic или last-block-optimistic дают самый ранний полезный сигнал. 02block или last-block-final подтверждают, что то же наблюдение дошло до финализированной истории. 03RPC block нужен только в самом конце, когда уже известна точная высота или хеш. **Цель** - Быстро заметить недавний блок, а затем проверить то же самое, когда догонит finality. | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Самое быстрое обнаружение | NEAR Data [`block-optimistic`](https://docs.fastnear.com/ru/neardata/block-optimistic) | Опрашиваем оптимистичные блоки, чтобы как можно раньше заметить новое изменение в семействе блоков | Даёт самый ранний полезный сигнал ещё до финализированного подтверждения | | Маршрут для последнего оптимистичного блока | NEAR Data [`last-block-optimistic`](https://docs.fastnear.com/ru/neardata/last-block-optimistic) | Используем маршрут перенаправления, когда клиент должен всегда следовать за самым новым оптимистичным блоком | Упрощает клиент опроса, когда важнее получать последний блок, а не работать с явными высотами | | Стабильное подтверждение | NEAR Data [`block`](https://docs.fastnear.com/ru/neardata/block) или [`last-block-final`](https://docs.fastnear.com/ru/neardata/last-block-final) | Повторно проверяем то же семейство блоков, когда финальность догоняет ранее замеченное изменение | Подтверждает, что замеченное в оптимистичном режиме изменение действительно попало в финализированную историю | | Лёгкая сводка по блоку | NEAR Data [`block-headers`](https://docs.fastnear.com/ru/neardata/block-headers) | Читаем данные заголовков, если для ответа достаточно времени и общего хода событий | Позволяет не запрашивать более широкий блок, когда хватает заголовков | | Точный разбор через RPC | RPC [Блок по ID](https://docs.fastnear.com/ru/rpc/block/block-by-id) или [Блок по высоте](https://docs.fastnear.com/ru/rpc/block/block-by-height) | Получаем точный блок, как только понятно, какой именно блок важен | Здесь уже имеет смысл RPC, если нужен тот самый блок-объект, который вернул бы сам протокол | **Что должен включать полезный ответ** - какое наблюдение по оптимистичному блоку впервые запустило расследование - когда то же наблюдение стало финализированным - изменил ли точный разбор через RPC интерпретацию ### Shell-сценарий проверки финализированного блока Используйте этот сценарий, когда вспомогательный маршрут сам выбирает для вас последний финализированный блок, но следующий шаг всё равно требует точной проверки через RPC. **Что вы делаете** - Смотрите redirect, который возвращает `GET /v0/last_block/final`. - Загружаете итоговый документ блока. - Извлекаете `block.header.height` через `jq`. - Переиспользуете эту высоту в RPC `block` по высоте. ```bash NEARDATA_BASE_URL=https://mainnet.neardata.xyz RPC_URL=https://rpc.mainnet.fastnear.com FINAL_LOCATION="$( curl -s -D - -o /dev/null "$NEARDATA_BASE_URL/v0/last_block/final" \ | awk 'tolower($1) == "location:" {print $2}' \ | tr -d '\r' )" printf 'Redirect target: %s\n' "$FINAL_LOCATION" curl -s "$NEARDATA_BASE_URL$FINAL_LOCATION" \ | tee /tmp/neardata-final-block.json \ | jq '{height: .block.header.height, hash: .block.header.hash}' BLOCK_HEIGHT="$(jq -r '.block.header.height' /tmp/neardata-final-block.json)" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg block_height "$BLOCK_HEIGHT" '{ jsonrpc: "2.0", id: "fastnear", method: "block", params: { block_id: ($block_height | tonumber) } }')" \ | jq '{height: .result.header.height, hash: .result.header.hash, chunks: (.result.chunks | length)}' ``` **Зачем нужен следующий шаг?** Helper route — самый простой способ опрашивать сценарий «последний финализированный блок». Как только он сообщил точную высоту блока, RPC становится естественным следующим шагом, если нужен точный блок-объект без догадок о том, что именно проверять. ## Частые задачи ### Отслеживать последний оптимистичный блок **Начните здесь** - [Оптимистичный блок](https://docs.fastnear.com/ru/neardata/block-optimistic) для самого свежего чтения по семейству блоков. **Следующая страница при необходимости** - [Перенаправление на последний оптимистичный блок](https://docs.fastnear.com/ru/neardata/last-block-optimistic), если нужен маршрут перенаправления, который всегда ведёт к самому новому оптимистичному блоку. **Остановитесь, когда** - Уже можно сообщить о последнем оптимистичном блоке или зафиксировать отставание по свежести. **Переходите дальше, когда** - Нужна finalized-стабильность вместо максимальной свежести. Переходите к [Финализированному блоку по высоте](https://docs.fastnear.com/ru/neardata/block) или [Перенаправлению на последний финализированный блок](https://docs.fastnear.com/ru/neardata/last-block-final). ### Безопасно отслеживать ход финализации блоков **Начните здесь** - [Финализированный блок по высоте](https://docs.fastnear.com/ru/neardata/block), когда уже известна нужная высота. - [Заголовки блока](https://docs.fastnear.com/ru/neardata/block-headers), когда достаточно чтения заголовков. **Следующая страница при необходимости** - [Перенаправление на последний финализированный блок](https://docs.fastnear.com/ru/neardata/last-block-final), когда клиент должен следовать за самым новым финализированным блоком без предварительного вычисления высоты. **Остановитесь, когда** - Уже можно показывать движение финализированных блоков без перехода к более глубоким протокольным деталям. **Переходите дальше, когда** - Пользователю нужны точные поля блока или семантика транзакций. Переходите к [RPC Reference](https://docs.fastnear.com/ru/rpc). ### Использовать маршруты перенаправления в клиенте опроса **Начните здесь** - [Перенаправление на последний финализированный блок](https://docs.fastnear.com/ru/neardata/last-block-final) или [Перенаправление на последний оптимистичный блок](https://docs.fastnear.com/ru/neardata/last-block-optimistic) в зависимости от требуемой свежести. **Следующая страница при необходимости** - Следуйте по URL блока, который вернул маршрут перенаправления, и уже там читайте нужные данные. **Остановитесь, когда** - Клиент надёжно проходит по маршруту перенаправления и получает нужный ресурс блока. **Переходите дальше, когда** - Само перенаправление мешает клиенту. Тогда переходите на прямые маршруты блоков. ### Перейти от опроса свежих блоков к точному RPC-разбору **Начните здесь** - Используйте подходящий маршрут NEAR Data, чтобы найти недавний блок или событие в семействе блоков, которое нужно исследовать. **Следующая страница при необходимости** - [Block by Height](https://docs.fastnear.com/ru/rpc/block/block-by-height), [Block by ID](https://docs.fastnear.com/ru/rpc/block/block-by-id) или другой RPC-метод, как только станет понятно, какой именно блок или следующий объект для проверки нужен. **Остановитесь, когда** - Уже можно чётко назвать недавний блок, который заслуживает проверки через RPC. **Переходите дальше, когда** - Пользователь просит точную структуру данных в терминах протокола, а не просто свежее чтение. ## Частые ошибки - Воспринимать NEAR Data как push-стрим, а не как API для опроса. - Начинать с RPC, когда настоящая задача — мониторинг свежих блоков. - Забывать, что невалидный ключ может вернуть `401` ещё до перенаправления, а сами перенаправления подходят не каждому HTTP-клиенту. - Оставаться на NEAR Data после того, как пользователь уже попросил точные протокольные детали блока. ## Полезные связанные страницы - [NEAR Data API](https://docs.fastnear.com/ru/neardata) - [RPC Reference](https://docs.fastnear.com/ru/rpc) - [Transactions API](https://docs.fastnear.com/ru/tx) - [Choosing the Right Surface](https://docs.fastnear.com/ru/agents/choosing-surfaces) - [Agent Playbooks](https://docs.fastnear.com/ru/agents/playbooks) --- ## redocly-config - HTML-маршрут: https://docs.fastnear.com/ru/redocly-config - Markdown-маршрут: https://docs.fastnear.com/ru/redocly-config.md **Источник:** [https://docs.fastnear.com/ru/redocly-config](https://docs.fastnear.com/ru/redocly-config) # Заметки о прежнем бэкенде Redocly Этот документ фиксирует текущую роль прежнего бэкенда Redocly в `mike-docs`. ## Текущее состояние Публичная документация больше не использует Redocly как основной рантайм. - Публичные страницы API и RPC рендерятся напрямую в `builder-docs`. - Канонические маршруты `/rpcs/...` и `/apis/...` хостятся в `builder-docs`. - `mike-docs` сохраняет Redocly только для проверок, сверки паритета и завершающей миграционной очистки. ## Где Redocly всё ещё нужен Используйте путь через Redocly только тогда, когда нужно проверить: - поведение `@theme/ext/configure.ts`; - параметры, влияющие на форму запроса, такие как `preset`, `body`, `path.*`, `query.*` и `header.*`; - локальный паритет между прямым рантаймом и прежним порталом. Локальные команды: ```bash cd /Users/mikepurvis/near/mike-docs npm run preview:headless npm run preview:portal ``` ## Текущая схема аутентификации Общий браузерный контракт аутентификации такой: 1. `?apiKey=` 2. `localStorage.fastnear:apiKey` 3. legacy `localStorage.fastnear_api_key` Bearer-токены по-прежнему используют: 1. `?token=` 2. `localStorage.fastnear:bearer` ## Текущие источники истины Для актуальных деталей реализации используйте: - `mike-docs/README.md` - `mike-docs/INTEGRATION_GUIDE.md` - `builder-docs/CLAUDE.md` --- ## Справочник RPC - HTML-маршрут: https://docs.fastnear.com/ru/rpc - Markdown-маршрут: https://docs.fastnear.com/ru/rpc.md **Источник:** [https://docs.fastnear.com/ru/rpc](https://docs.fastnear.com/ru/rpc) # Справочник RPC FastNear RPC даёт прямой доступ по JSON-RPC к узлам NEAR для запросов состояния, проверки блоков и чанков, отправки транзакций, чтения данных валидаторов и диагностики протокола. ## Базовые URL Обычные RPC хранят самые свежие эпохи состояния и подходят для большинства прикладных запросов по умолчанию: ```bash title="Обычный RPC mainnet" https://rpc.mainnet.fastnear.com ``` ```bash title="Обычный RPC testnet" https://rpc.testnet.fastnear.com ``` Архивные RPC открывают всю историю цепочки, когда нужны старые блоки, квитанции или историческое состояние контракта: ```bash title="Архивный RPC mainnet" https://archival-rpc.mainnet.fastnear.com ``` ```bash title="Архивный RPC testnet" https://archival-rpc.testnet.fastnear.com ``` ## С чего обычно начинают - [`view_account`](https://docs.fastnear.com/ru/rpc/account/view-account), [`view_access_key`](https://docs.fastnear.com/ru/rpc/account/view-access-key), [`view_access_key_list`](https://docs.fastnear.com/ru/rpc/account/view-access-key-list) — запросы по аккаунту и ключам доступа. - [`block`](https://docs.fastnear.com/ru/rpc/block/block-by-id) — поиск по высоте или хешу; [`block_effects`](https://docs.fastnear.com/ru/rpc/block/block-effects) — изменения внутри блока. - [`call_function`](https://docs.fastnear.com/ru/rpc/contract/call-function), [`view_code`](https://docs.fastnear.com/ru/rpc/contract/view-code), [`view_state`](https://docs.fastnear.com/ru/rpc/contract/view-state) — работа с контрактами. - [`status`](https://docs.fastnear.com/ru/rpc/protocol/status), [`health`](https://docs.fastnear.com/ru/rpc/protocol/health), [`gas_price`](https://docs.fastnear.com/ru/rpc/protocol/gas-price) — диагностика узла и протокола. - [`send_tx`](https://docs.fastnear.com/ru/rpc/transaction/send-tx) — отправка транзакций; [`tx`](https://docs.fastnear.com/ru/rpc/transaction/tx-status) — статус исполнения. - [`validators`](https://docs.fastnear.com/ru/rpc/validators/validators-current) — валидаторы текущей эпохи. ## Нужен сценарий? Используйте [примеры RPC](https://docs.fastnear.com/ru/rpc/examples) для простых пошаговых сценариев: точных проверок состояния, анализа блоков, view-вызовов контрактов и отправки транзакций с подтверждением. ## Используйте RPC, когда - нужны канонические формы запросов и ответов из протокола; - важно поведение настоящего узла для запросов состояния и поиска блоков; - требуется отправка транзакций или проверка результатов исполнения; - нужен самый низкоуровневый доступ до перехода к индексированным или продуктовым представлениям. ## Не используйте RPC, когда - нужен единый вызов для получения балансов, NFT, позиций стейкинга или поиска по публичному ключу; - нужна индексированная история транзакций по аккаунту вместо опроса узлов и сшивания ответов; - простота продуктового интерфейса важнее прямого контроля над протоколом. В этих случаях переходите к индексированным REST-семействам, например [FastNear API](https://docs.fastnear.com/ru/api), [Транзакции API](https://docs.fastnear.com/ru/tx) или [NEAR Data API](https://docs.fastnear.com/ru/neardata). ## Аутентификация и лимиты - API-ключи FastNear необязательны; публичные эндпоинты работают и без них. - Для повышенных лимитов или единой аутентифицированной модели используйте [Аутентификацию и доступ](https://docs.fastnear.com/ru/auth): один и тот же ключ работает и на обычных, и на архивных RPC-хостах и передаётся либо в заголовке `Authorization: Bearer`, либо в URL-параметре `?apiKey=`. ## Общие интерактивные примеры - Используйте `Copy example URL` на любой интерактивной RPC-странице, чтобы поделиться выбранной сетью, вкладкой примера, финальностью и заполненными входными данными. - Общие URL примеров выполняются автоматически при загрузке, когда в них есть состояние операции. - Сохранённые API-ключи и токены никогда не включаются в такие общедоступные URL документации. ## Устранение неполадок ### Запрос работает локально, но падает на продовом контуре Проверьте, не полагались ли вы на то, что интерфейс документации автоматически подставляет API-ключ. Продовые бэкенды должны передавать учётные данные явно и не зависеть от хранения в браузере. ### Мне нужно более старое состояние, чем возвращает обычный RPC Переключитесь с обычного RPC-эндпоинта на архивный RPC-эндпоинт. Один и тот же FastNear API-ключ и один и тот же способ передачи через заголовок или параметр запроса работают на обоих хостах. ### Мне нужен более простой ответ, чем даёт JSON-RPC Обычно это означает, что нужно индексированное REST-семейство, а не сырой RPC. Воспользуйтесь страницей выбора поверхности и подберите более высокий уровень абстракции. --- ## Примеры RPC - HTML-маршрут: https://docs.fastnear.com/ru/rpc/examples - Markdown-маршрут: https://docs.fastnear.com/ru/rpc/examples.md **Источник:** [https://docs.fastnear.com/ru/rpc/examples](https://docs.fastnear.com/ru/rpc/examples) # Примеры RPC Используйте эту страницу, когда уже ясно, что ответ надо брать прямо из RPC, и нужен самый короткий путь по документации. Цель не в том, чтобы запомнить каждый метод, а в том, чтобы начать с правильного RPC-запроса, остановиться, как только ответ уже решает задачу, и переходить к более высокоуровневому API только тогда, когда это действительно экономит время. ## Отправка и отслеживание транзакции Начинайте отсюда, когда настоящий вопрос звучит не просто как «как мне это отправить?», а как «какой RPC-эндпоинт здесь правильный и как довести отслеживание транзакции до полного завершения?» ### Отправить транзакцию и затем проследить её от хеша до финального исполнения Используйте этот сценарий, когда история звучит просто: «у меня есть подписанная транзакция. Какой эндпоинт вызвать первым и что потом опрашивать после получения хеша?» Разные вопросы про транзакции требуют разных RPC-методов. Практичный паттерн здесь один: быстро отправить, а потом осознанно отслеживать. Этот walkthrough специально сделан зафиксированным и историческим. Он использует одну реальную mainnet-транзакцию, которая записала follow edge в NEAR Social: - хеш транзакции: `FLLmTvFx9vCof79scy2uUviF5WwYmevkz9TZ8azPGVQb` - signer: `mike.near` - receiver: `social.near` - высота блока включения: `79574923` - высота блока исполнения receipt для записи в SocialDB: `79574924` Поскольку эта транзакция уже старая и давно финализирована, вы не можете буквально воспроизвести её настоящий интервал до включения. Это нормально. Смысл примера в том, чтобы показать правильный паттерн отправки и отслеживания, а затем посмотреть на одну зафиксированную транзакцию теми же инструментами. Стратегия Сначала быстро отправьте, затем идите по более простому статусному пути и переходите к дереву receipts только когда общего статуса уже недостаточно. 01RPC broadcast_tx_async — это способ отправки с минимальной задержкой, когда клиент сам будет отслеживать статус дальше. 02RPC tx — это базовый способ опроса статуса для гарантий включения, optimistic finality и полного завершения. 03RPC EXPERIMENTAL_tx_status — это уже более глубокое продолжение, когда нужен не общий статус, а дерево receipts. **Что вы здесь решаете** - какой эндпоинт отправки брать первым - что опрашивать после того, как у вас появился tx hash - как `wait_until` связан с included-, optimistic- и final-гарантиями - когда пора перестать использовать `tx` и перейти на `EXPERIMENTAL_tx_status` ```mermaid flowchart LR S["Подписываем транзакцию"] --> A["broadcast_tx_async
возвращает tx hash"] A --> T["Polling через tx
INCLUDED_FINAL -> FINAL"] T --> F["Транзакция полностью завершена"] T -. "только при необходимости" .-> E["EXPERIMENTAL_tx_status
дерево receipts + outcomes"] F -. "необязательная читаемая история" .-> X["POST /v0/transactions"] ``` | Метод | Когда использовать | Что вернётся | Роль здесь | | --- | --- | --- | --- | | [`broadcast_tx_async`](https://docs.fastnear.com/ru/rpc/transaction/broadcast-tx-async) | клиент сам будет отслеживать транзакцию после отправки | только tx hash | **базовый путь отправки** | | [`send_tx`](https://docs.fastnear.com/ru/rpc/transaction/send-tx) | вы хотите, чтобы узел сам подождал до выбранного порога | результат tx до уровня `wait_until` | блокирующая альтернатива | | [`broadcast_tx_commit`](https://docs.fastnear.com/ru/rpc/transaction/broadcast-tx-commit) | у вас старый код или важен быстрый режим “одним вызовом” | результат исполнения с commit-ожиданием | устаревшее удобство | | [`tx`](https://docs.fastnear.com/ru/rpc/transaction/tx-status) | у вас уже есть tx hash и нужно понять, насколько далеко всё продвинулось | статус и outcomes на выбранном пороге | **базовый путь отслеживания** | | [`EXPERIMENTAL_tx_status`](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) | вам уже нужно дерево receipts или более богатая async-история | полное дерево receipts и детальные outcomes | только глубокое продолжение | **Карта статусов и ожидания** Значения `wait_until` — это пороги ожидания, а не один постоянный статус транзакции, который стоит считать единственно правильным. Слово `pending` всё ещё полезно в человеческом разговоре, но здесь оно означает только одно: транзакция уже отправлена клиентом, но ещё не включена в блок. | Фаза или порог | Что это значит на практике | Лучшая RPC-поверхность | | --- | --- | --- | | до включения (`pending`) | клиент уже отправил tx, но она ещё не заякорена в блоке | собственное состояние клиента плюс логика повторов и пауз | | `INCLUDED` | транзакция уже в блоке, но сам блок ещё может быть не финальным | `tx` | | `INCLUDED_FINAL` | блок включения уже финален | `tx` | | `EXECUTED_OPTIMISTIC` | исполнение уже произошло с optimistic finality | `tx` или `send_tx` | | `FINAL` | всё релевантное исполнение завершилось и финализировалось | по умолчанию `tx`, а `EXPERIMENTAL_tx_status` — если нужна более глубокая детализация | Практическое различие очень простое: - используйте `broadcast_tx_async`, когда для продолжения вам достаточно tx hash - используйте `tx` как обычный цикл опроса - используйте `EXPERIMENTAL_tx_status`, когда следующий вопрос относится уже к дереву receipts, а не к общему статусу **Что вы делаете** - Показываете, как выглядела бы живая отправка через `broadcast_tx_async`. - Опрашиваете зафиксированную tx через `tx` на двух порогах: `INCLUDED_FINAL` и `FINAL`. - Только после этого смотрите ту же tx через `EXPERIMENTAL_tx_status`. - Необязательно переходите в Transactions API, если дальше уже нужна человеческая история. ```bash RPC_URL=https://rpc.mainnet.fastnear.com TX_BASE_URL=https://tx.main.fastnear.com TX_HASH=FLLmTvFx9vCof79scy2uUviF5WwYmevkz9TZ8azPGVQb SIGNER_ACCOUNT_ID=mike.near RECEIVER_ID=social.near ``` 1. Если бы это был живой клиентский сценарий, вы бы отправили транзакцию через `broadcast_tx_async` и сохранили возвращённый хеш. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data '{ "jsonrpc": "2.0", "id": "fastnear", "method": "broadcast_tx_async", "params": ["BASE64_SIGNED_TX"] }' \ | jq . ``` В реальном приложении именно в этот момент вы перестаёте ждать завершения отправки и переходите к отслеживанию по tx hash. 2. Опрашивайте `tx` на первом пороге, который уже отвечает на вопрос пользователя. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$TX_HASH" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "tx", params: { tx_hash: $tx_hash, sender_account_id: $signer_account_id, wait_until: "INCLUDED_FINAL" } }')" \ | jq '{ final_execution_status: .result.final_execution_status, status: .result.status, transaction_handoff: .result.transaction_outcome.outcome.status }' ``` Что здесь важно заметить: - на живой транзакции этот порог полезен, когда важно понять, что включение уже безопасно с точки зрения finality - на этой исторической tx ответ приходит сразу, потому что она давно прошла фазу включения - `transaction_outcome.outcome.status` всё равно показывает, что исходное действие передало управление в исполнение через receipt 3. Опрашивайте снова, но уже с `FINAL`, когда нужна завершённая история транзакции, а не просто безопасное включение. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$TX_HASH" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "tx", params: { tx_hash: $tx_hash, sender_account_id: $signer_account_id, wait_until: "FINAL" } }')" \ | jq '{ final_execution_status: .result.final_execution_status, status: .result.status, receipts_outcome_count: (.result.receipts_outcome | length) }' ``` Что здесь важно заметить: - для исторической tx этот вызов тоже возвращается сразу - в реальном цикле опроса именно этот порог отвечает на вопрос «транзакция уже действительно завершена?» - для многих приложений именно здесь и стоит остановиться 4. Переходите к `EXPERIMENTAL_tx_status` только тогда, когда вам уже нужно более богатое дерево receipts. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$TX_HASH" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "EXPERIMENTAL_tx_status", params: { tx_hash: $tx_hash, sender_account_id: $signer_account_id, wait_until: "FINAL" } }')" \ | jq '{ final_execution_status: .result.final_execution_status, status: .result.status, transaction_handoff: .result.transaction_outcome.outcome.status, receipts_outcome_count: (.result.receipts_outcome | length) }' ``` Сюда стоит идти, когда вопрос меняется с «дошло ли всё до конца?» на «покажи мне дерево receipts и полную async-историю исполнения». 5. Необязательно: переходите в Transactions API только если дальше нужна именно читаемая история. ```bash curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, included_block_height: .transactions[0].execution_outcome.block_height }, actions: ( .transactions[0].transaction.actions | map(if type == "string" then . else keys[0] end) ), transaction_handoff: .transactions[0].transaction_outcome.outcome.status }' ``` Этот последний шаг специально сделан необязательным. Для отправки и отслеживания RPC-правды уже достаточно. Это просто читаемая история на тот случай, если следующий вопрос уже звучит как «что именно произошло?», а не «насколько далеко продвинулась tx?» **Рекомендуемый паттерн** - Используйте `broadcast_tx_async` плюс опрос через `tx`, если хотите максимум клиентского контроля и самую быструю обратную связь. - Используйте `send_tx`, когда вам действительно нужен один блокирующий вызов, который подождёт до выбранного порога. - Используйте `EXPERIMENTAL_tx_status`, когда обычного цикла опроса уже недостаточно и настоящий вопрос относится к дереву receipts. ## Механика аккаунтов и ключей Начинайте отсюда, когда вопрос касается точных прав, точного состояния ключей или одного сценария записи на уровне контракта. ### Проверить и удалить старые function-call-ключи Near Social Используйте этот сценарий, когда вы знаете, что на аккаунте накопились старые function-call-ключи для `social.near`, и хотите осмысленно их просмотреть, выбрать один конкретный ключ и удалить его через сырой RPC. Стратегия Сначала сузьте набор точными чтениями ключей, а уже потом подписывайте ровно одно удаление. 01RPC view_access_key_list находит только function-call-ключи, привязанные к social.near. 02RPC view_access_key перепроверяет конкретный ключ перед удалением, а POST /v0/account нужен только для необязательного контекста на уровне аккаунта. 03RPC send_tx отправляет DeleteKey, а RPC view_access_key_list подтверждает результат. **Что вы делаете** - Через сам RPC получаете полный список access key аккаунта. - Сужаете этот список до function-call-ключей, привязанных к `social.near`. - Точно проверяете один выбранный ключ перед удалением. - Собираете и подписываете транзакцию `DeleteKey` с помощью full-access-key, затем отправляете её через RPC и подтверждаете, что ключ исчез. Сразу важны два ограничения: - Ключ, которым вы удаляете другой ключ, должен быть full-access. Function-call-key не может подписать действие `DeleteKey`. - Этот сценарий про точное состояние ключей и очистку. Необязательный шаг с Transactions API ниже даёт контекст на уровне аккаунта, но не является надёжным источником «когда использовался именно этот ключ». ```bash export NETWORK_ID=mainnet export RPC_URL=https://rpc.mainnet.fastnear.com export TX_BASE_URL=https://tx.main.fastnear.com export ACCOUNT_ID=YOUR_ACCOUNT_ID export SOCIAL_RECEIVER_ID=social.near export DELETE_PUBLIC_KEY='ed25519:PASTE_THE_KEY_YOU_PLAN_TO_REMOVE' export FULL_ACCESS_PUBLIC_KEY='ed25519:PASTE_THE_FULL_ACCESS_PUBLIC_KEY_YOU_WILL_SIGN_WITH' export FULL_ACCESS_PRIVATE_KEY='ed25519:PASTE_THE_MATCHING_FULL_ACCESS_PRIVATE_KEY' ``` 1. Получите все access key аккаунта, затем сузьте результат до function-call-ключей для `social.near`. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "view_access_key_list", account_id: $account_id, finality: "final" } }')" \ | tee /tmp/fastnear-access-keys.json >/dev/null jq -r --arg receiver "$SOCIAL_RECEIVER_ID" ' .result.keys[] | select((.access_key.permission | type) == "object") | select(.access_key.permission.FunctionCall.receiver_id == $receiver) | { public_key, nonce: .access_key.nonce, receiver_id: .access_key.permission.FunctionCall.receiver_id, method_names: .access_key.permission.FunctionCall.method_names, allowance: (.access_key.permission.FunctionCall.allowance // "unlimited") } ' /tmp/fastnear-access-keys.json ``` Выберите один `public_key` из этого отфильтрованного списка и присвойте его переменной `DELETE_PUBLIC_KEY`. 2. Ещё раз проверьте конкретный ключ перед удалением. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$ACCOUNT_ID" \ --arg public_key "$DELETE_PUBLIC_KEY" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "view_access_key", account_id: $account_id, public_key: $public_key, finality: "final" } }')" \ | jq '{nonce: .result.nonce, permission: .result.permission}' ``` 3. Необязательно: получите недавнюю function-call-активность аккаунта, если хотите понять, стоит ли сначала расследовать контекст, а уже потом чистить ключи. ```bash curl -s "$TX_BASE_URL/v0/account" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$ACCOUNT_ID" '{ account_id: $account_id, is_function_call: true, limit: 10 }')" \ | jq '{ account_txs: [ .account_txs[] | { transaction_hash, tx_block_height, is_success } ] }' ``` Этот запрос помогает ответить на вопрос «делал ли аккаунт недавно function-call-операции вообще?», но не доказывает, что использовался именно этот access key. 4. Подпишите транзакцию `DeleteKey` для `DELETE_PUBLIC_KEY` с помощью full-access-key. Выполняйте это в каталоге, где установлен `near-api-js@5`. Команда использует переменные окружения выше, получает актуальный nonce для `FULL_ACCESS_PUBLIC_KEY`, запрашивает свежий хеш финализированного блока, подписывает действие `DeleteKey` и сохраняет `signed_tx_base64` в `SIGNED_TX_BASE64`. ```bash SIGNED_TX_BASE64="$( node --input-type=module <<'EOF' const { ACCOUNT_ID, NETWORK_ID = 'mainnet', RPC_URL = 'https://rpc.mainnet.fastnear.com', DELETE_PUBLIC_KEY, FULL_ACCESS_PUBLIC_KEY, FULL_ACCESS_PRIVATE_KEY, } = process.env; for (const name of [ 'ACCOUNT_ID', 'DELETE_PUBLIC_KEY', 'FULL_ACCESS_PUBLIC_KEY', 'FULL_ACCESS_PRIVATE_KEY', ]) { if (!process.env[name]) { throw new Error(`Missing ${name}`); } } async function rpc(method, params) { const response = await fetch(RPC_URL, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 'fastnear', method, params, }), }); const json = await response.json(); if (json.error) { throw new Error(JSON.stringify(json.error)); } return json.result; } const keyPair = KeyPair.fromString(FULL_ACCESS_PRIVATE_KEY); const derivedPublicKey = keyPair.getPublicKey().toString(); if (derivedPublicKey !== FULL_ACCESS_PUBLIC_KEY) { throw new Error( `FULL_ACCESS_PUBLIC_KEY does not match FULL_ACCESS_PRIVATE_KEY (${derivedPublicKey})` ); } const signer = await InMemorySigner.fromKeyPair(NETWORK_ID, ACCOUNT_ID, keyPair); const accessKey = await rpc('query', { request_type: 'view_access_key', account_id: ACCOUNT_ID, public_key: FULL_ACCESS_PUBLIC_KEY, finality: 'final', }); const block = await rpc('block', { finality: 'final' }); const transaction = transactions.createTransaction( ACCOUNT_ID, utils.PublicKey.fromString(FULL_ACCESS_PUBLIC_KEY), ACCOUNT_ID, BigInt(accessKey.nonce) + 1n, [transactions.deleteKey(utils.PublicKey.fromString(DELETE_PUBLIC_KEY))], utils.serialize.base_decode(block.header.hash) ); const [, signedTx] = await transactions.signTransaction( transaction, signer, ACCOUNT_ID, NETWORK_ID ); process.stdout.write(Buffer.from(signedTx.encode()).toString('base64')); EOF )" ``` 5. Отправьте подписанную транзакцию через сырой RPC и дождитесь `FINAL`. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg signed_tx_base64 "$SIGNED_TX_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "send_tx", params: { signed_tx_base64: $signed_tx_base64, wait_until: "FINAL" } }')" \ | jq '{ final_execution_status: .result.final_execution_status, transaction_hash: .result.transaction.hash, status: .result.status }' ``` 6. Повторно получите список access key и убедитесь, что нужного ключа больше нет. ```bash if curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "view_access_key_list", account_id: $account_id, finality: "final" } }')" \ | jq -e --arg public_key "$DELETE_PUBLIC_KEY" ' .result.keys[] | select(.public_key == $public_key) ' >/dev/null; then echo "Key is still present: $DELETE_PUBLIC_KEY" else echo "Key deleted: $DELETE_PUBLIC_KEY" fi ``` **Зачем нужен следующий шаг?** Повторный вызов `view_access_key_list` замыкает сценарий тем же RPC-методом, с которого вы начинали поиск. Если ключ исчез именно там, дополнительный индексированный API уже не нужен, чтобы подтвердить удаление. ### Какая транзакция добавила этот function-call-ключ для `social.near` и какой ключ его авторизовал? Используйте этот сценарий, когда ключ уже виден на аккаунте, но вы хотите вернуться назад до транзакции `AddKey`, которая его создала, и понять, каким public key это изменение было реально авторизовано. Стратегия Начинаем с уже существующего ключа и идём назад только настолько, насколько это действительно нужно. 01RPC view_access_key даёт текущий сохранённый nonce, а это лучшая историческая подсказка в этой истории. 02POST /v0/account превращает этот nonce в узкое окно кандидатов вместо полного поиска по истории аккаунта. 03POST /v0/transactions показывает, был ли ключ добавлен напрямую или через делегированную авторизацию, а POST /v0/receipt нужен только для точного блока исполнения AddKey. **Что вы делаете** - Сначала читаете точное состояние ключа через RPC и берёте его текущий nonce как улику. - Превращаете этот nonce в узкое окно высот блоков для вероятного `AddKey` receipt. - Ищете историю аккаунта только внутри этого окна, а не сканируете весь аккаунт. - Подтягиваете кандидата по транзакциям и различаете три разных ключа: - ключ, который был добавлен - public key верхнеуровневого signer - public key, который реально авторизовал изменение, если оно было завернуто в `Delegate` Сразу важны три детали про nonce: - Новый access key получает стартовый nonce, производный от высоты блока примерно как `block_height * 1_000_000`, поэтому деление текущего nonce на `1_000_000` даёт полезное поисковое окно. - В payload действия `AddKey` часто будет `access_key.nonce: 0`. Это не тот сохранённый nonce, который вы потом видите через `view_access_key`. - Если после создания ключ уже успели очень активно использовать, просто расширьте окно поиска. ```bash export NETWORK_ID=mainnet export RPC_URL=https://rpc.mainnet.fastnear.com export TX_BASE_URL=https://tx.main.fastnear.com export ACCOUNT_ID=YOUR_ACCOUNT_ID export TARGET_PUBLIC_KEY='ed25519:PASTE_THE_ACCESS_KEY_YOU_WANT_TO_TRACE' # Пример живого ключа, наблюдавшегося 18 апреля 2026 года: # export ACCOUNT_ID=mike.near # export TARGET_PUBLIC_KEY='ed25519:7GZgXkMPEyGXqRhxaLvHxWn6fVfeyuQGMqnLVQAh7bs' ``` 1. Сначала прочитайте точное состояние ключа, затем превратите его текущий nonce в поисковое окно. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$ACCOUNT_ID" \ --arg public_key "$TARGET_PUBLIC_KEY" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "view_access_key", account_id: $account_id, public_key: $public_key, finality: "final" } }')" \ | tee /tmp/key-origin-view.json >/dev/null CURRENT_NONCE="$(jq -r '.result.nonce' /tmp/key-origin-view.json)" ESTIMATED_RECEIPT_BLOCK="$(( CURRENT_NONCE / 1000000 + 1 ))" SEARCH_FROM="$(( ESTIMATED_RECEIPT_BLOCK - 20 ))" SEARCH_TO="$(( ESTIMATED_RECEIPT_BLOCK + 5 ))" jq -n \ --arg account_id "$ACCOUNT_ID" \ --arg target_public_key "$TARGET_PUBLIC_KEY" \ --argjson current_nonce "$CURRENT_NONCE" \ --argjson estimated_receipt_block "$ESTIMATED_RECEIPT_BLOCK" \ --argjson search_from "$SEARCH_FROM" \ --argjson search_to "$SEARCH_TO" \ --arg permission "$(jq -c '.result.permission' /tmp/key-origin-view.json)" '{ account_id: $account_id, target_public_key: $target_public_key, current_nonce: $current_nonce, estimated_receipt_block: $estimated_receipt_block, search_from_tx_block_height: $search_from, search_to_tx_block_height: $search_to, permission: ($permission | fromjson) }' ``` Если использовать пример ключа выше, оценочный блок receipt должен получиться `112057392`. 2. Ищите историю аккаунта только внутри этого диапазона блоков. ```bash curl -s "$TX_BASE_URL/v0/account" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$ACCOUNT_ID" \ --argjson from_tx_block_height "$SEARCH_FROM" \ --argjson to_tx_block_height "$SEARCH_TO" '{ account_id: $account_id, is_real_signer: true, from_tx_block_height: $from_tx_block_height, to_tx_block_height: $to_tx_block_height, desc: false, limit: 50 }')" \ | tee /tmp/key-origin-candidates.json >/dev/null jq '{ txs_count, candidate_txs: [ .account_txs[] | { transaction_hash, tx_block_height, is_signer, is_real_signer, is_predecessor, is_receiver } ] }' /tmp/key-origin-candidates.json ``` Для примерного ключа `mike.near` выше это окно возвращает одну кандидатную транзакцию: `6ZT8UGPRC6L3NGs2qHnECPVexKWNQ5LWLK9w95tgj3tV` во внешнем tx-блоке `112057390`. 3. Подтяните этих кандидатов целиком и оставьте только ту транзакцию, которая действительно добавила ваш целевой ключ. ```bash TX_HASHES_JSON="$( jq -c '[.account_txs[].transaction_hash]' /tmp/key-origin-candidates.json )" curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --argjson tx_hashes "$TX_HASHES_JSON" '{tx_hashes: $tx_hashes}')" \ | tee /tmp/key-origin-transactions.json >/dev/null jq --arg target_public_key "$TARGET_PUBLIC_KEY" ' .transactions[] | . as $tx | ( ($tx.transaction.actions[]? | .AddKey? | select(.public_key == $target_public_key) | { authorization_mode: "direct", top_level_signer_id: $tx.transaction.signer_id, top_level_signer_public_key: $tx.transaction.public_key, authorizing_public_key: $tx.transaction.public_key, added_public_key: .public_key, add_key_payload_nonce: .access_key.nonce, permission: .access_key.permission }), ($tx.transaction.actions[]? | .Delegate? | .delegate_action as $delegate | $delegate.actions[]? | .AddKey? | select(.public_key == $target_public_key) | { authorization_mode: "delegated", top_level_signer_id: $tx.transaction.signer_id, top_level_signer_public_key: $tx.transaction.public_key, authorizing_public_key: $delegate.public_key, added_public_key: .public_key, add_key_payload_nonce: .access_key.nonce, permission: .access_key.permission }) ) | { transaction_hash: $tx.transaction.hash, tx_block_height: $tx.execution_outcome.block_height, tx_block_hash: $tx.execution_outcome.block_hash, receiver_id: $tx.transaction.receiver_id } + . ' /tmp/key-origin-transactions.json | tee /tmp/key-origin-match.json ``` Если `authorization_mode` равен `direct`, то top-level signer public key и authorizing public key — это один и тот же ключ. Если `authorization_mode` равен `delegated`, то ключ, который реально авторизовал `AddKey`, находится внутри `Delegate.delegate_action.public_key`. Для примерного ключа `mike.near` выше совпадение оказывается делегированным: - `transaction_hash`: `6ZT8UGPRC6L3NGs2qHnECPVexKWNQ5LWLK9w95tgj3tV` - `top_level_signer_public_key`: `ed25519:Ez817Dgs2uYP5a6GoijzFarcS3SWPT5eEB82VJXsd4oM` - `authorizing_public_key`: `ed25519:GaYgzN1eZUgwA7t8a5pYxFGqtF4kon9dQaDMjPDejsiu` - `added_public_key`: `ed25519:7GZgXkMPEyGXqRhxaLvHxWn6fVfeyuQGMqnLVQAh7bs` 4. Необязательно: если нужен ещё и точный блок `AddKey` receipt, сделайте ещё один шаг по `receipt_id`. ```bash ADD_KEY_RECEIPT_ID="$( jq -r --arg target_public_key "$TARGET_PUBLIC_KEY" ' .transactions[] | .receipts[] | select(any((.receipt.receipt.Action.actions // [])[]; .AddKey.public_key? == $target_public_key)) | .receipt.receipt_id ' /tmp/key-origin-transactions.json | head -n 1 )" curl -s "$TX_BASE_URL/v0/receipt" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg receipt_id "$ADD_KEY_RECEIPT_ID" '{receipt_id: $receipt_id}')" \ | jq '{ receipt_id: .receipt.receipt_id, receipt_block_height: .receipt.block_height, tx_block_height: .receipt.tx_block_height, predecessor_id: .receipt.predecessor_id, receiver_id: .receipt.receiver_id, transaction_hash: .receipt.transaction_hash }' ``` Для примерного ключа выше точный `AddKey` receipt — это `C5jsTftYwPiibyxdoDKd4LXFFru8n4weDKLV4cfb1bcX` в receipt-блоке `112057392`, тогда как внешняя транзакция попала раньше, в блок `112057390`. **Зачем нужен следующий шаг?** Начинайте с точного текущего состояния ключа, потому что именно оно даёт вам nonce-подсказку. Узкое окно в `/v0/account` превращает эту подсказку в маленький набор кандидатов. `/v0/transactions` показывает, был ли ключ добавлен напрямую или через делегированную авторизацию. `/v0/receipt` — это необязательный последний шаг, если нужен именно точный блок исполнения `AddKey`, а не только внешняя транзакция. ### Проверить регистрацию FT storage и затем перевести токены Используйте этот сценарий, когда история звучит так: «безопасно отправить FT-токен, но сначала доказать, зарегистрирован ли получатель для storage на этом FT-контракте». Стратегия Сначала прочитайте storage-состояние, а затем тратьте только те write-вызовы, которые действительно нужны переводу. 01RPC call_function storage_balance_of показывает, зарегистрирован ли получатель уже сейчас. 02RPC call_function storage_balance_bounds нужен только тогда, когда перед записью надо узнать точный минимальный депозит. 03RPC send_tx отправляет storage_deposit и ft_transfer, а RPC call_function ft_balance_of доказывает итог. **Сеть** - testnet **Официальные ссылки** - [FT storage и перевод токенов](https://docs.near.org/integrations/fungible-tokens) - [Предразвёрнутый FT-контракт](https://docs.near.org/tutorials/fts/predeployed-contract) В этом сценарии используется безопасный публичный контракт `ft.predeployed.examples.testnet`. Перед началом убедитесь, что у отправителя уже есть немного `gtNEAR` на этом контракте. Если баланса ещё нет, сначала получите небольшой объём через гайд по предразвёрнутому контракту и затем вернитесь к этому сценарию. **Что вы делаете** - Через точные RPC view-вызовы проверяете, есть ли у получателя FT storage на контракте. - При необходимости получаете минимальный размер storage deposit. - Подписываете и отправляете `storage_deposit`, а затем `ft_transfer`. - Подтверждаете баланс получателя тем же view-методом самого контракта. ```bash export NETWORK_ID=testnet export RPC_URL=https://rpc.testnet.fastnear.com export TOKEN_CONTRACT_ID=ft.predeployed.examples.testnet export SENDER_ACCOUNT_ID=YOUR_ACCOUNT_ID.testnet export RECEIVER_ACCOUNT_ID=YOUR_RECEIVER_ID.testnet export SENDER_PUBLIC_KEY='ed25519:YOUR_FULL_ACCESS_PUBLIC_KEY' export SENDER_PRIVATE_KEY='ed25519:YOUR_MATCHING_PRIVATE_KEY' export AMOUNT_YOCTO_GTNEAR='10000000000000000000000' ``` 1. Проверьте, зарегистрирован ли получатель на FT-контракте. ```bash STORAGE_BALANCE_ARGS_BASE64="$( jq -nc --arg account_id "$RECEIVER_ACCOUNT_ID" '{ account_id: $account_id }' | base64 | tr -d '\n' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$TOKEN_CONTRACT_ID" \ --arg args_base64 "$STORAGE_BALANCE_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "storage_balance_of", args_base64: $args_base64, finality: "final" } }')" \ | tee /tmp/ft-storage-balance.json >/dev/null jq '{ registered: ((.result.result | implode | fromjson) != null), storage_balance: (.result.result | implode | fromjson) }' /tmp/ft-storage-balance.json ``` 2. Если получатель ещё не зарегистрирован, получите минимальный storage deposit. ```bash MIN_STORAGE_YOCTO="$( curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$TOKEN_CONTRACT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "storage_balance_bounds", args_base64: "e30=", finality: "final" } }')" \ | tee /tmp/ft-storage-bounds.json \ | jq -r '.result.result | implode | fromjson | .min' )" printf 'Minimum storage deposit: %s yoctoNEAR\n' "$MIN_STORAGE_YOCTO" ``` 3. Определите одну переиспользуемую функцию подписи для function-call к контракту. Выполняйте этот шаг в каталоге, где установлен `near-api-js@5`. Функция ниже читает экспортированные shell-переменные выше и превращает каждый function-call в подписанный payload для отправки через сырой RPC. ```bash sign_function_call() { METHOD_NAME="$1" \ ARGS_JSON="$2" \ DEPOSIT_YOCTO="$3" \ GAS_TGAS="$4" \ node --input-type=module <<'EOF' const { NETWORK_ID = 'testnet', RPC_URL = 'https://rpc.testnet.fastnear.com', TOKEN_CONTRACT_ID, SENDER_ACCOUNT_ID, SENDER_PUBLIC_KEY, SENDER_PRIVATE_KEY, METHOD_NAME, ARGS_JSON, DEPOSIT_YOCTO = '0', GAS_TGAS = '100', } = process.env; for (const name of [ 'TOKEN_CONTRACT_ID', 'SENDER_ACCOUNT_ID', 'SENDER_PUBLIC_KEY', 'SENDER_PRIVATE_KEY', 'METHOD_NAME', 'ARGS_JSON', ]) { if (!process.env[name]) { throw new Error(`Missing ${name}`); } } async function rpc(method, params) { const response = await fetch(RPC_URL, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 'fastnear', method, params, }), }); const json = await response.json(); if (json.error) { throw new Error(JSON.stringify(json.error)); } return json.result; } const keyPair = KeyPair.fromString(SENDER_PRIVATE_KEY); const signer = await InMemorySigner.fromKeyPair( NETWORK_ID, SENDER_ACCOUNT_ID, keyPair ); const derivedPublicKey = keyPair.getPublicKey().toString(); if (derivedPublicKey !== SENDER_PUBLIC_KEY) { throw new Error( `SENDER_PUBLIC_KEY does not match SENDER_PRIVATE_KEY (${derivedPublicKey})` ); } const accessKey = await rpc('query', { request_type: 'view_access_key', account_id: SENDER_ACCOUNT_ID, public_key: SENDER_PUBLIC_KEY, finality: 'final', }); const block = await rpc('block', { finality: 'final' }); const action = transactions.functionCall( METHOD_NAME, Buffer.from(ARGS_JSON), BigInt(GAS_TGAS) * 10n ** 12n, BigInt(DEPOSIT_YOCTO) ); const transaction = transactions.createTransaction( SENDER_ACCOUNT_ID, utils.PublicKey.fromString(SENDER_PUBLIC_KEY), TOKEN_CONTRACT_ID, BigInt(accessKey.nonce) + 1n, [action], utils.serialize.base_decode(block.header.hash) ); const [, signedTx] = await transactions.signTransaction( transaction, signer, SENDER_ACCOUNT_ID, NETWORK_ID ); process.stdout.write(Buffer.from(signedTx.encode()).toString('base64')); EOF } ``` 4. При необходимости сначала зарегистрируйте storage для получателя. ```bash if jq -e '.result.result | implode | fromjson == null' /tmp/ft-storage-balance.json >/dev/null; then SIGNED_TX_BASE64="$( sign_function_call \ storage_deposit \ "$(jq -nc --arg account_id "$RECEIVER_ACCOUNT_ID" '{ account_id: $account_id, registration_only: true }')" \ "$MIN_STORAGE_YOCTO" \ 100 )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg signed_tx_base64 "$SIGNED_TX_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "send_tx", params: { signed_tx_base64: $signed_tx_base64, wait_until: "FINAL" } }')" \ | jq '{ final_execution_status: .result.final_execution_status, transaction_hash: .result.transaction.hash }' fi ``` 5. После готовности storage переведите FT. ```bash SIGNED_TX_BASE64="$( sign_function_call \ ft_transfer \ "$(jq -nc \ --arg receiver_id "$RECEIVER_ACCOUNT_ID" \ --arg amount "$AMOUNT_YOCTO_GTNEAR" '{ receiver_id: $receiver_id, amount: $amount, memo: "FastNear RPC example" }')" \ 1 \ 100 )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg signed_tx_base64 "$SIGNED_TX_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "send_tx", params: { signed_tx_base64: $signed_tx_base64, wait_until: "FINAL" } }')" \ | jq '{ final_execution_status: .result.final_execution_status, transaction_hash: .result.transaction.hash, status: .result.status }' ``` 6. Подтвердите FT-баланс получателя тем же view-методом контракта. ```bash RECEIVER_BALANCE_ARGS_BASE64="$( jq -nc --arg account_id "$RECEIVER_ACCOUNT_ID" '{ account_id: $account_id }' | base64 | tr -d '\n' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$TOKEN_CONTRACT_ID" \ --arg args_base64 "$RECEIVER_BALANCE_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "ft_balance_of", args_base64: $args_base64, finality: "final" } }')" \ | jq '{ receiver_balance: (.result.result | implode | fromjson) }' ``` **Зачем нужен следующий шаг?** Это хороший RPC-сценарий, потому что каждый шаг держится рядом с самим контрактом: сначала вы проверяете состояние storage, затем отправляете минимально необходимые change-call, а потом напрямую подтверждаете итоговое состояние на контракте. ## Чтения контракта и сырое состояние Начинайте отсюда, когда вопрос звучит как «достаточно ли мне вызова метода?» против «можно ли прочитать storage напрямую?» ### Прочитать счётчик прямо из состояния контракта, а потом подтвердить его через view-метод Используйте этот сценарий, когда история простая: «я знаю, что этот контракт держит счётчик, но можно ли прочитать это число напрямую из storage, не вызывая код контракта?» В этом walkthrough используется живой публичный testnet-контракт `counter.near-examples.testnet`. Число в нём может меняться со временем. Это нормально. Важен сам принцип: оба чтения должны совпасть в тот момент, когда вы их запускаете: - `view_state` читает сырой ключ `STATE` прямо из storage контракта - `call_function get_num` спрашивает у контракта то же текущее число через его публичный view API Стратегия Сначала прочитайте raw storage, затем декодируйте байты, а потом дайте контракту подтвердить тот же ответ через view-метод. 01RPC view_state читает сырой ключ STATE, не запуская код контракта. 02Декодируйте значение из base64 в байты, а затем интерпретируйте эти байты по известной Borsh-схеме контракта. 03RPC call_function get_num — это удобная перепроверка того, что raw-state-чтение и view-метод по-прежнему дают один и тот же ответ. Здесь важнее ментальная модель, чем сам счётчик: - `view_state` — это прямое чтение storage из trie - `call_function` исполняет read-only-метод контракта - оба способа могут ответить на один и тот же вопрос, но делают разную работу ```mermaid flowchart LR S["RPC view_state
prefix STATE"] --> R["Сырые байты STATE"] R --> D["Декодировать base64 + Borsh"] D --> N["Знаковое значение счётчика"] C["RPC call_function get_num"] --> J["JSON-результат метода"] N --> X["Сравнить"] J --> X X --> A["Одно и то же текущее значение"] ``` **Что вы делаете** - Читаете сырой ключ `STATE` из storage контракта. - Декодируете возвращённые байты в текущее знаковое значение счётчика. - Вызываете `get_num` через view-метод и подтверждаете, что ответ метода совпадает с raw-state-декодированием. ```bash export NETWORK_ID=testnet export RPC_URL=https://rpc.testnet.fastnear.com export CONTRACT_ID=counter.near-examples.testnet export STATE_PREFIX_BASE64=U1RBVEU= ``` 1. Сначала прочитайте сырое состояние контракта. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$CONTRACT_ID" \ --arg prefix_base64 "$STATE_PREFIX_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "view_state", account_id: $account_id, prefix_base64: $prefix_base64, finality: "final" } }')" \ | tee /tmp/counter-view-state.json >/dev/null jq '{ block_height: .result.block_height, key_base64: .result.values[0].key, value_base64: .result.values[0].value }' /tmp/counter-view-state.json jq -r '.result.values[0].key | @base64d' /tmp/counter-view-state.json ``` Последняя команда должна вывести `STATE`. Это и есть семейство ключей, которое вы уже заранее знаете, поэтому `view_state` может пойти прямо к raw storage entry, не заставляя контракт исполнять никакой метод. 2. Декодируйте байты значения в знаковое число счётчика. ```bash RAW_VALUE_BASE64="$(jq -r '.result.values[0].value' /tmp/counter-view-state.json)" python3 - "$RAW_VALUE_BASE64" <<'PY' | jq . raw = base64.b64decode(sys.argv[1]) print(json.dumps({ "value_base64": sys.argv[1], "bytes": list(raw), "hex": raw.hex(), "signed_i8": int.from_bytes(raw, "little", signed=True), "unsigned_u8": int.from_bytes(raw, "little", signed=False), })) PY ``` Для этого конкретного контракта достаточно одного байта, потому что Rust-счётчик хранит `val: i8` внутри состояния контракта. Поэтому raw-значение вроде `CQ==` декодируется в один байт `0x09`, а он уже читается как знаковое целое `9`. Ещё один важный момент про знак: если бы счётчик был отрицательным, тот же однобайтовый payload всё равно корректно декодировался бы как знаковый `i8` в дополнительном коде. Например, `/w==` — это один байт `0xff`, а значит `-1` как `signed_i8`, а не `255`. Переиспользуемый рецепт здесь короткий: - `view_state` возвращает сырые байты в base64 - вы декодируете эти байты по известной схеме хранения контракта - для больших контрактов схема может быть сложнее, но идея та же: сначала байты, потом схема 3. Теперь спросите контракт более привычным способом и сравните. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$CONTRACT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "get_num", args_base64: "e30=", finality: "final" } }')" \ | tee /tmp/counter-call-function.json >/dev/null jq '{ block_height: .result.block_height, view_method_value: (.result.result | implode | fromjson) }' /tmp/counter-call-function.json ``` 4. Сравните оба ответа напрямую. ```bash RAW_STATE_NUMBER="$( python3 - "$RAW_VALUE_BASE64" <<'PY' raw = base64.b64decode(sys.argv[1]) print(int.from_bytes(raw, "little", signed=True)) PY )" VIEW_METHOD_NUMBER="$( jq -r '.result.result | implode | fromjson' /tmp/counter-call-function.json )" jq -n \ --argjson raw_state "$RAW_STATE_NUMBER" \ --argjson view_method "$VIEW_METHOD_NUMBER" '{ raw_state: $raw_state, view_method: $view_method, agrees_now: ($raw_state == $view_method) }' ``` Если `agrees_now` равен `true`, значит вы доказали основную мысль этого примера: - `view_state` ответил на вопрос, прочитав storage напрямую - `call_function get_num` ответил на тот же вопрос, исполнив публичный read-метод контракта **Зачем нужен следующий шаг?** Используйте `view_state`, когда настоящий вопрос относится к точному storage и вы уже знаете семейство ключей. Используйте `call_function`, когда вам нужен публичный read API самого контракта. Если следующий вопрос становится историческим, а не «что там лежит прямо сейчас?», тогда и стоит расширяться в [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv). ## Трассировка чанков и шардов Начинайте отсюда, когда вопрос уже не просто «транзакция прошла или нет?», а «какой именно чанк на шарде исполнил каждый шаг работы?» ### Проследить, как сгенерированная `Transfer`-receipt переходит из одного чанка на шарде в другой Используйте этот сценарий, когда вызов контракта был только началом истории. В этом зафиксированном mainnet-примере подписанная транзакция стартует на шарде `11`, а сгенерированная `Transfer`-receipt заканчивает путь уже на шарде `6`. Именно ради таких cross-shard handoff и имеет смысл смотреть на чанки. Этот walkthrough привязан к: - транзакции `8xrcQU6Sr1jhnigenBbpfGzk9jN24rLmMqSWT7TF7xJP` от `7419369993.tg` к `game.hot.tg` с вызовом `l2_claim` - исходному чанку `BfydTxiPbGY34pejscBytYSXpBsk9gWA2ixKoAe7VsVw` на шарде `11` в блоке `194623170` - чанку первой receipt `FJWpAYzVXbZwqJUbGXELTnnBBkdvc6W8vWkwuUA3Zwz9` на шарде `11` в блоке `194623171` - сгенерированной `Transfer`-receipt `TtRn4DzLKzFmGEn5YqoZ35ts411Hz6Ci6WQMjphPMn4` - конечному чанку `EPauY1GBaeAgGf1TikxFcPUhmYsVhLf1cwy14vAYsUuU` на шарде `6` в блоке `194623172` Стратегия Сначала восстановите receipt-цепочку, потом напрямую посмотрите на сгенерированную receipt, а затем привяжите каждый шаг к тому чанку на шарде, который действительно нёс эту работу. 01RPC EXPERIMENTAL_tx_status быстро показывает граф receipts и в какие следующие блоки перешла работа. 02RPC EXPERIMENTAL_receipt позволяет посмотреть на тело сгенерированной receipt напрямую, а не выводить его только из логов. 03RPC chunk по блоку и шарду или по хешу чанка доказывает, какая именно единица исполнения на шарде нёсла каждый шаг. Оба experimental-метода здесь очень уместны: `EXPERIMENTAL_tx_status` быстро находит граф receipts, а `EXPERIMENTAL_receipt` показывает тело сгенерированной receipt ещё до того, как вы привяжете её обратно к чанкам. ```mermaid flowchart LR A["Tx 8xrc...
блок 194623170
чанк Bfyd...
шард 11"] --> B["Receipt AFC2...
блок 194623171
чанк FJWp...
шард 11
логи ft_mint"] B --> C["Сгенерированная receipt TtRn...
Transfer 1800930478788300000000 yoctoNEAR"] C --> D["Чанк EPau...
блок 194623172
шард 6
receipt исполняется"] ``` **Что вы делаете** - Сначала восстанавливаете receipt-цепочку из транзакции. - Напрямую смотрите на тело сгенерированной `Transfer`-receipt. - Используете координаты блока и шарда там, где они уже известны. - Используете хеш чанка там, где другой инструмент уже выдал точный конечный чанк. ```bash export NETWORK_ID=mainnet export RPC_URL=https://rpc.mainnet.fastnear.com export TX_HASH=8xrcQU6Sr1jhnigenBbpfGzk9jN24rLmMqSWT7TF7xJP export SIGNER_ACCOUNT_ID=7419369993.tg export ORIGIN_BLOCK_HEIGHT=194623170 export ORIGIN_SHARD_ID=11 export RECEIPT_BLOCK_HEIGHT=194623171 export RECEIPT_SHARD_ID=11 export GENERATED_RECEIPT_ID=TtRn4DzLKzFmGEn5YqoZ35ts411Hz6Ci6WQMjphPMn4 export DESTINATION_CHUNK_HASH=EPauY1GBaeAgGf1TikxFcPUhmYsVhLf1cwy14vAYsUuU ``` 1. Начните с `EXPERIMENTAL_tx_status`, чтобы сначала увидеть граф receipts, а уже потом думать о чанках. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$TX_HASH" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "EXPERIMENTAL_tx_status", params: [$tx_hash, $signer_account_id] }')" \ | tee /tmp/chunk-trace-status.json >/dev/null jq '{ final_execution_status: .result.final_execution_status, transaction_handoff: .result.transaction_outcome.outcome.status, receipts: ( .result.receipts_outcome | map({ receipt_id: .id, executor_id: .outcome.executor_id, block_hash, status: .outcome.status }) ) }' /tmp/chunk-trace-status.json ``` На что смотреть: - подписанная транзакция передаёт работу в receipt `AFC2xUPuuA6BKMMvAV47LLPtzsg3Moh7frvLSuyMeZ2Y` - позже в том же графе receipts исполняется `TtRn4DzLKzFmGEn5YqoZ35ts411Hz6Ci6WQMjphPMn4` для `7419369993.tg` - уже одного tx status достаточно, чтобы увидеть: настоящая работа продолжилась после исходной подписанной транзакции 2. Посмотрите на сгенерированную receipt напрямую, чтобы доказать, что это действительно `Transfer`-receipt. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg receipt_id "$GENERATED_RECEIPT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "EXPERIMENTAL_receipt", params: { receipt_id: $receipt_id } }')" \ | tee /tmp/chunk-trace-receipt.json >/dev/null jq '{ predecessor_id: .result.predecessor_id, receiver_id: .result.receiver_id, signer_id: .result.receipt.Action.signer_id, signer_public_key: .result.receipt.Action.signer_public_key, actions: .result.receipt.Action.actions }' /tmp/chunk-trace-receipt.json ``` Именно здесь история по шардам становится конкретной: эта цепочка исполнения контракта сгенерировала `Transfer` action receipt от `system` к `7419369993.tg` с депозитом `1800930478788300000000`. 3. Используйте `chunk` по блоку и шарду, чтобы найти исходную подписанную транзакцию на шарде `11`. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --argjson block_id "$ORIGIN_BLOCK_HEIGHT" \ --argjson shard_id "$ORIGIN_SHARD_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "chunk", params: { block_id: $block_id, shard_id: $shard_id } }')" \ | jq --arg tx_hash "$TX_HASH" '{ header: { chunk_hash: .result.header.chunk_hash, shard_id: .result.header.shard_id, height_created: .result.header.height_created }, matching_transaction: ( .result.transactions[] | select(.hash == $tx_hash) | { hash, signer_id, receiver_id } ) }' ``` Это самый чистый use case для `chunk` по блоку и шарду: координаты уже известны, а вам нужна точная единица исполнения на шарде, которая несла исходную подписанную транзакцию. 4. Оставайтесь на том же маршруте и посмотрите, как первая receipt исполняется в следующем блоке на том же шарде. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --argjson block_id "$RECEIPT_BLOCK_HEIGHT" \ --argjson shard_id "$RECEIPT_SHARD_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "chunk", params: { block_id: $block_id, shard_id: $shard_id } }')" \ | jq '{ header: { chunk_hash: .result.header.chunk_hash, shard_id: .result.header.shard_id, height_created: .result.header.height_created, tx_root: .result.header.tx_root, gas_used: .result.header.gas_used }, tx_count: (.result.transactions | length), receipt_count: (.result.receipts | length), matching_receipt: ( .result.receipts[] | select(.receipt_id == "AFC2xUPuuA6BKMMvAV47LLPtzsg3Moh7frvLSuyMeZ2Y") | { receipt_id, predecessor_id, receiver_id } ) }' ``` Вот здесь chunks наконец становятся естественными: - у чанка `tx_root = 11111111111111111111111111111111` - `tx_count` равен `0` - но шард всё равно жжёт gas и исполняет receipt `AFC2...` То есть этот шард реально сделал работу в этом блоке, хотя новая подписанная транзакция прямо в самом чанке не появилась. 5. Переключайтесь на `chunk` по хешу, когда другой инструмент уже выдал точный конечный чанк. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg chunk_id "$DESTINATION_CHUNK_HASH" '{ jsonrpc: "2.0", id: "fastnear", method: "chunk", params: { chunk_id: $chunk_id } }')" \ | jq --arg receipt_id "$GENERATED_RECEIPT_ID" '{ header: { chunk_hash: .result.header.chunk_hash, shard_id: .result.header.shard_id, height_created: .result.header.height_created, tx_root: .result.header.tx_root, gas_used: .result.header.gas_used }, tx_count: (.result.transactions | length), receipt_count: (.result.receipts | length), matching_receipt: ( .result.receipts[] | select(.receipt_id == $receipt_id) | { receipt_id, predecessor_id, receiver_id } ) }' ``` Это и подтверждает cross-shard hop: - сгенерированная `Transfer`-receipt исполняется в чанке `EPau...` - этот чанк живёт на шарде `6`, а не на шарде `11` - подписанная транзакция стартовала на одном шарде, а следующая receipt завершилась уже на другом **Зачем нужен следующий шаг?** Используйте [Chunk by Block and Shard](https://docs.fastnear.com/ru/rpc/protocol/chunk-by-block-shard), когда вы знаете координаты блока и шарда и хотите буквально спросить: «что этот шард исполнил в этом блоке?» Используйте [Chunk by Hash](https://docs.fastnear.com/ru/rpc/protocol/chunk-by-hash), когда другой инструмент уже выдал точный хеш чанка. Используйте [EXPERIMENTAL_tx_status](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) и [EXPERIMENTAL_receipt](https://docs.fastnear.com/ru/rpc/transaction/experimental-receipt), когда настоящий вопрос относится к трассировке на уровне receipts. Если ещё нужны state changes и produced receipts, расширяйтесь в [Block Shard](https://docs.fastnear.com/ru/neardata/block-shard). ## Точные чтения NEAR Social и BOS Эти сценарии остаются на точных чтениях SocialDB и on-chain-проверках готовности, пока вопрос не становится историческим. ### Может ли этот аккаунт прямо сейчас публиковать в NEAR Social? Используйте этот сценарий, когда история звучит так: «я собираюсь опубликовать изменение профиля, обновление виджета или запись в графе под `mike.near` и хочу получить простой ответ “готово / не готово” ещё до открытия окна подписи». Стратегия Спросите у social.near ровно о двух вещах, которые важны до подписи. 01RPC view_account проверяет, что signer-аккаунт вообще существует и может отправить транзакцию. 02RPC call_function get_account_storage показывает, осталось ли у целевого аккаунта место на social.near. 03RPC call_function is_write_permission_granted нужен только тогда, когда писать пытается другой signer. Именно на такие вопросы и должен ответить клиент NEAR Social перед записью: - есть ли у целевого аккаунта storage на `social.near`? - если есть, осталось ли там ещё место? - если писать под этим аккаунтом пытается другой signer, выдано ли ему право на запись заранее? **Официальные ссылки** - [API SocialDB и поверхность контракта](https://github.com/NearSocial/social-db#api) **Что вы делаете** - Проверяете, что аккаунт signer вообще существует и способен оплатить gas. - Спрашиваете у `social.near`, сколько storage осталось у аккаунта, под которым вы хотите писать. - Если signer отличается от целевого аккаунта, отдельно спрашиваете у `social.near`, разрешена ли уже такая делегированная запись. - Превращаете точные RPC-ответы в один понятный итог: «можно писать сейчас» или «сначала устраните блокер». ```bash export NETWORK_ID=mainnet export RPC_URL=https://rpc.mainnet.fastnear.com export SOCIAL_CONTRACT_ID=social.near export ACCOUNT_ID=mike.near export SIGNER_ACCOUNT_ID=mike.near ``` 1. Сначала проверьте сам аккаунт signer. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "view_account", account_id: $account_id, finality: "final" } }')" \ | tee /tmp/social-publish-signer.json >/dev/null jq --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ signer_account_id: $signer_account_id, amount: .result.amount, locked: .result.locked, storage_usage: .result.storage_usage }' /tmp/social-publish-signer.json ``` Если этот запрос падает, рабочего signer-аккаунта у вас нет. Если проходит, значит signer существует и хотя бы может оплатить gas. 2. Спросите у `social.near`, сколько storage уже доступно для аккаунта, под которым вы хотите писать. ```bash SOCIAL_STORAGE_ARGS_BASE64="$( jq -nc --arg account_id "$ACCOUNT_ID" '{ account_id: $account_id }' | base64 | tr -d '\n' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$SOCIAL_CONTRACT_ID" \ --arg args_base64 "$SOCIAL_STORAGE_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "get_account_storage", args_base64: $args_base64, finality: "final" } }')" \ | tee /tmp/social-account-storage.json >/dev/null jq --arg account_id "$ACCOUNT_ID" '{ account_id: $account_id, storage: (.result.result | implode | fromjson), storage_ready: ((.result.result | implode | fromjson | .available_bytes) > 0) }' /tmp/social-account-storage.json ``` Если `available_bytes` больше нуля, значит storage не является блокером. Если метод вернул `null` или `available_bytes` равен нулю, аккаунту нужен `storage_deposit`, иначе новая запись не ляжет. 3. Если signer отличается от целевого аккаунта, отдельно проверьте и делегированное право на запись. ```bash if [ "$SIGNER_ACCOUNT_ID" = "$ACCOUNT_ID" ]; then jq -n --arg account_id "$ACCOUNT_ID" '{ account_id: $account_id, signer_matches_target: true, permission_granted: true, reason: "owner write" }' else WRITE_PERMISSION_ARGS_BASE64="$( jq -nc \ --arg predecessor_id "$SIGNER_ACCOUNT_ID" \ --arg key "$ACCOUNT_ID" '{ predecessor_id: $predecessor_id, key: $key }' | base64 | tr -d '\n' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$SOCIAL_CONTRACT_ID" \ --arg args_base64 "$WRITE_PERMISSION_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "is_write_permission_granted", args_base64: $args_base64, finality: "final" } }')" \ | jq '{ signer_matches_target: false, permission_granted: (.result.result | implode | fromjson) }' fi ``` 4. Сведите проверку storage и разрешения в один читаемый итог. ```bash AVAILABLE_BYTES="$( jq -r ' .result.result | if length == 0 then "0" else (implode | fromjson | .available_bytes // 0 | tostring) end ' /tmp/social-account-storage.json )" if [ "$SIGNER_ACCOUNT_ID" = "$ACCOUNT_ID" ]; then PERMISSION_GRANTED=true else PERMISSION_GRANTED="$( curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$SOCIAL_CONTRACT_ID" \ --arg args_base64 "$WRITE_PERMISSION_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "is_write_permission_granted", args_base64: $args_base64, finality: "final" } }')" \ | jq -r '.result.result | implode | fromjson' )" fi jq -n \ --arg account_id "$ACCOUNT_ID" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" \ --argjson available_bytes "$AVAILABLE_BYTES" \ --argjson permission_granted "$PERMISSION_GRANTED" '{ account_id: $account_id, signer_account_id: $signer_account_id, storage_ready: ($available_bytes > 0), permission_ready: $permission_granted, ready_to_publish_now: (($available_bytes > 0) and $permission_granted) }' ``` Если в этом итоговом объекте `ready_to_publish_now: true`, RPC уже дал ответ на вопрос. Если `false`, вы точно знаете, в чём блокер: в storage, в делегированном разрешении или сразу в обоих местах. **Зачем нужен следующий шаг?** Весь вопрос остаётся на точных on-chain-чтениях. Именно `social.near` отвечает, осталось ли место у целевого аккаунта и разрешён ли уже делегированный signer. Для проверки готовности к записи в NEAR Social это надёжнее, чем гадать по одному только состоянию кошелька. ### Что прямо сейчас содержит `mob.near/widget/Profile`? Используйте этот сценарий, когда вопрос простой: «покажи живой исходник `mob.near/widget/Profile`, скажи, когда этот ключ виджета последний раз переписывали, и оставь меня на точных RPC-чтениях». Стратегия Оставайтесь на точных чтениях SocialDB и расширяйтесь в историю только тогда, когда вопрос уже стал форензикой. 01RPC call_function keys показывает каталог виджетов и блоки последней записи под mob.near/widget/*. 02RPC call_function get читает точный исходник widget/Profile. 03Если следующий вопрос становится «какая транзакция это записала?», переходите к доказательству записи виджета в /tx/examples. **Официальные ссылки** - [API SocialDB и поверхность контракта](https://github.com/NearSocial/social-db#api) **Что вы делаете** - Спрашиваете у `social.near` каталог виджетов под `mob.near`. - Сохраняете высоты блоков, чтобы понимать, когда каждый ключ виджета менялся в последний раз. - Подтверждаете, что `Profile` действительно есть в каталоге, и читаете его точный исходник через тот же контракт. - Если следующий вопрос уже звучит как «какая транзакция записала этот виджет?», переходите к сценариям-доказательствам в [Transactions Examples](https://docs.fastnear.com/ru/tx/examples). ```bash export NETWORK_ID=mainnet export RPC_URL=https://rpc.mainnet.fastnear.com export SOCIAL_CONTRACT_ID=social.near export ACCOUNT_ID=mob.near export WIDGET_NAME=Profile ``` 1. Получите каталог виджетов и сохраните высоты блоков последней записи. ```bash WIDGET_KEYS_ARGS_BASE64="$( jq -nc --arg account_id "$ACCOUNT_ID" '{ keys: [($account_id + "/widget/*")], options: {return_type: "BlockHeight"} }' | base64 | tr -d '\n' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$SOCIAL_CONTRACT_ID" \ --arg args_base64 "$WIDGET_KEYS_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "keys", args_base64: $args_base64, finality: "final" } }')" \ | tee /tmp/social-widget-keys.json >/dev/null jq --arg account_id "$ACCOUNT_ID" ' .result.result | implode | fromjson | .[$account_id].widget | to_entries | sort_by(.value * -1) | map({ widget_name: .key, last_write_block: .value }) | .[0:20] ' /tmp/social-widget-keys.json ``` 2. Подтвердите, что `Profile` действительно есть в каталоге, и распечатайте точный исходник, который хранится в SocialDB. ```bash WIDGET_GET_ARGS_BASE64="$( jq -nc \ --arg account_id "$ACCOUNT_ID" \ --arg widget_name "$WIDGET_NAME" '{ keys: [($account_id + "/widget/" + $widget_name)] }' | base64 | tr -d '\n' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$SOCIAL_CONTRACT_ID" \ --arg args_base64 "$WIDGET_GET_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "get", args_base64: $args_base64, finality: "final" } }')" \ | tee /tmp/social-widget-source.json >/dev/null jq -r \ --arg account_id "$ACCOUNT_ID" \ --arg widget_name "$WIDGET_NAME" ' .result.result | implode | fromjson | .[$account_id].widget[$widget_name] | split("\n")[0:25] | join("\n") ' /tmp/social-widget-source.json ``` 3. Заберите высоту последней записи для этого же виджета, чтобы оставить себе один полезный исторический якорь. ```bash jq -r \ --arg account_id "$ACCOUNT_ID" \ --arg widget_name "$WIDGET_NAME" ' .result.result | implode | fromjson | .[$account_id].widget[$widget_name] ' /tmp/social-widget-keys.json \ | xargs -I{} printf 'Last write block for %s/%s: %s\n' "$ACCOUNT_ID" "$WIDGET_NAME" "{}" ``` На момент написания живая высота последней записи для `mob.near/widget/Profile` была `86494825`. Сохраните этот блок, если позже понадобится доказать, какая транзакция записала именно эту версию. **Зачем нужен следующий шаг?** Иногда правильный RPC-ответ очень простой: вот виджет, вот его живой исходник, и вот высота блока, которую стоит сохранить, если позже понадобится provenance. ## Частые задачи ### Проверить точное состояние аккаунта или ключа доступа **Начните здесь** - [View Account](https://docs.fastnear.com/ru/rpc/account/view-account) для точных полей аккаунта. - [View Access Key](https://docs.fastnear.com/ru/rpc/account/view-access-key) или [View Access Key List](https://docs.fastnear.com/ru/rpc/account/view-access-key-list) для проверки ключей. **Следующая страница при необходимости** - [FastNear API full account view](https://docs.fastnear.com/ru/api/v1/account-full), если после проверки точного RPC-состояния нужна ещё и понятная сводка по активам. - [Transactions API account history](https://docs.fastnear.com/ru/tx/account), если следующий вопрос звучит как «что этот аккаунт делал недавно?» **Остановитесь, когда** - Поля RPC уже отвечают на вопрос о состоянии или правах доступа. **Переходите дальше, когда** - Пользователю нужны балансы, NFT, стейкинг или другая понятная сводка по аккаунту. - Пользователя интересует не текущее состояние, а недавняя история активности. ### Трассировать исполнение на уровне шарда через чанки **Начните здесь** - Начните с примера выше, если настоящий вопрос звучит как «какой чанк или шард вообще исполнил эту receipt?» - [Chunk by Block and Shard](https://docs.fastnear.com/ru/rpc/protocol/chunk-by-block-shard), когда координаты блока и шарда уже известны. - [Chunk by Hash](https://docs.fastnear.com/ru/rpc/protocol/chunk-by-hash), когда другой инструмент уже выдал точный хеш чанка. **Следующая страница при необходимости** - [Experimental Receipt](https://docs.fastnear.com/ru/rpc/transaction/experimental-receipt), если нужно само тело сгенерированной receipt. - [Block Shard](https://docs.fastnear.com/ru/neardata/block-shard), если chunk payload уже недостаточен и ещё нужны state changes или produced receipts. - [Transactions Examples](https://docs.fastnear.com/ru/tx/examples), если вопрос превращается в более широкое async- или callback-расследование. **Остановитесь, когда** - Уже можно назвать, какой именно чанк и какой шард несли ту работу, которая была важна. **Переходите дальше, когда** - Пользователю нужны уже не детали исполнения на уровне шарда, а читаемая история транзакции. Тогда переходите к [Transactions API](https://docs.fastnear.com/ru/tx). ### Проверить один точный блок или снимок состояния протокола **Начните здесь** - [Block by ID](https://docs.fastnear.com/ru/rpc/block/block-by-id) или [Block by Height](https://docs.fastnear.com/ru/rpc/block/block-by-height), когда вы уже знаете, какой именно блок вас интересует. - [Latest Block](https://docs.fastnear.com/ru/rpc/protocol/latest-block), когда вопрос звучит как «какая сейчас голова цепочки?» - [Status](https://docs.fastnear.com/ru/rpc/protocol/status), [Health](https://docs.fastnear.com/ru/rpc/protocol/health) или [Network Info](https://docs.fastnear.com/ru/rpc/protocol/network-info), когда настоящий вопрос относится к состоянию узла или сети, а не к истории транзакций. **Следующая страница при необходимости** - [Block Effects](https://docs.fastnear.com/ru/rpc/block/block-effects), если ответ по блоку уже говорит, какой это блок, но всё ещё не объясняет, что в нём изменилось. - [Transactions API block history](https://docs.fastnear.com/ru/tx/block) или [Transactions API block range](https://docs.fastnear.com/ru/tx/blocks), если вопрос превращается в «что вообще происходило вокруг этого блока?», а не только «что говорит payload этого блока?» **Остановитесь, когда** - Один точный ответ по блоку или протоколу уже напрямую отвечает на вопрос. **Переходите дальше, когда** - Нужно следить за появлением новых блоков, а не разбирать один точный снимок. Переходите к [NEAR Data API](https://docs.fastnear.com/ru/neardata). - Нужна читаемая история по многим транзакциям, а не только payload одного блока. Переходите к [Transactions API](https://docs.fastnear.com/ru/tx). ### Что этот контракт возвращает прямо сейчас? **Начните здесь** - Начните с примера со счётчиком выше, если настоящий выбор звучит как «мне нужен `call_function` или `view_state`?» или «можно ли прочитать storage напрямую вместо вызова метода?» - [Call Function](https://docs.fastnear.com/ru/rpc/contract/call-function), когда вы уже знаете нужный view-метод и хотите просто получить его точный результат. - [View State](https://docs.fastnear.com/ru/rpc/contract/view-state), когда настоящий вопрос относится к сырому хранилищу контракта или key prefix, а не к результату метода. - [View Code](https://docs.fastnear.com/ru/rpc/contract/view-code), когда настоящий вопрос звучит как «есть ли здесь код вообще?» или «какой code hash здесь развёрнут?» **Следующая страница при необходимости** - [FastNear API](https://docs.fastnear.com/ru/api), если сырой ответ контракта технически правильный, но пользователю на самом деле нужна читаемая сводка по активам или аккаунту. - [KV FastData API](https://docs.fastnear.com/ru/fastdata/kv), если следующий вопрос уже звучит как «как этот storage key выглядел со временем?», а не «что там лежит сейчас?» **Остановитесь, когда** - View-вызов, чтение хранилища или code hash уже дают точный ответ на вопрос по контракту. **Переходите дальше, когда** - Пользователю нужна индексированная история или более простое резюме вместо сырого ответа контракта. - Вопрос смещается от «что он возвращает сейчас?» к «что менялось со временем?» ### Отправить транзакцию и подтвердить результат **Начните здесь** - Сначала поднимитесь к готовому примеру выше, если настоящий вопрос в том, какой эндпоинт отправки выбрать и как потом отслеживать транзакцию до завершения. - [Send Transaction](https://docs.fastnear.com/ru/rpc/transaction/send-tx), когда нужна RPC-отправка с явной семантикой ожидания. - [Broadcast Transaction Async](https://docs.fastnear.com/ru/rpc/transaction/broadcast-tx-async) или [Broadcast Transaction Commit](https://docs.fastnear.com/ru/rpc/transaction/broadcast-tx-commit), когда важны именно эти режимы отправки. - [Transaction Status](https://docs.fastnear.com/ru/rpc/transaction/tx-status), чтобы подтвердить финальный результат. **Следующая страница при необходимости** - [Transactions by Hash](https://docs.fastnear.com/ru/tx/transactions), если после отправки нужна более читаемая история по транзакции. - [Receipt Lookup](https://docs.fastnear.com/ru/tx/receipt), если нужно исследовать последующее исполнение или цепочку обратных вызовов. - [Transactions Examples](https://docs.fastnear.com/ru/tx/examples), если следующий вопрос звучит так: «одно действие в пакете транзакции упало, а ранние действия откатились или нет?» **Остановитесь, когда** - У вас уже есть результат отправки и нужный финальный статус. **Переходите дальше, когда** - Следующий вопрос относится к квитанциям, затронутым аккаунтам или истории исполнения в более человеческом порядке. - Нужен уже не единичный статус, а более широкий сценарий расследования. ## Частые ошибки - Начинать с RPC, когда пользователю на самом деле нужна сводка по активам или индексированная история. - Забывать переключаться с обычного RPC на архивный RPC для старого состояния. - Воспринимать браузерную аутентификацию в интерфейсе документации как продовый паттерн для бэкенда. - Продолжать пользоваться низкоуровневыми статусами транзакций, когда вопрос уже превратился в расследование или исторический разбор. ## Полезные связанные страницы - [RPC Reference](https://docs.fastnear.com/ru/rpc) - [Auth & Access](https://docs.fastnear.com/ru/auth) - [FastNear API](https://docs.fastnear.com/ru/api) - [Transactions API](https://docs.fastnear.com/ru/tx) - [Choosing the Right Surface](https://docs.fastnear.com/ru/agents/choosing-surfaces) - [Agent Playbooks](https://docs.fastnear.com/ru/agents/playbooks) --- ## Снапшоты для валидаторов - HTML-маршрут: https://docs.fastnear.com/ru/snapshots - Markdown-маршрут: https://docs.fastnear.com/ru/snapshots.md **Источник:** [https://docs.fastnear.com/ru/snapshots](https://docs.fastnear.com/ru/snapshots) # Снапшоты блокчейна Этот раздел — для операторов узлов, которые поднимают или восстанавливают инфраструктуру NEAR. Это не поверхность для прикладных данных. Если задача — читать балансы, историю, блоки или состояние контракта, используйте документацию API и RPC, а не сценарии со снапшотами. :::warning[Бесплатные снапшоты устарели] Бесплатные снапшоты данных nearcore больше не выпускаются. Infrastructure Committee и Near One рекомендуют Epoch Sync вместе с децентрализованной синхронизацией состояния. Актуальные рекомендации и режим подъёма смотрите на [NEAR Nodes](https://near-nodes.io). ::: ## Используйте этот раздел, когда - нужно поднять узел mainnet или testnet из данных снапшота - идёт восстановление RPC- или архивного узла - уже известно, что нужен путь загрузки снапшота FastNear ## Не используйте этот раздел, когда - идёт запрос данных цепочки для приложения - нужны свежие блоки, балансы, история или состояние контракта - нужны общие рекомендации по продуктовому API, а не настройка оператором В этих случаях используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc), [FastNear API](https://docs.fastnear.com/ru/api), [Транзакции API](https://docs.fastnear.com/ru/tx) или [NEAR Data API](https://docs.fastnear.com/ru/neardata). ## Перед загрузкой - Сначала выберите сеть: mainnet или testnet. - Решите, нужны обычные данные RPC или архивные. - Убедитесь, что понимаете, где должны лежать горячие и холодные данные, прежде чем стартовать архивную загрузку. - Установите `rclone` — скрипты загрузки от него зависят. :::info[Установка `rclone`] Установите `rclone` командой: ```bash sudo -v ; curl https://rclone.org/install.sh | sudo bash ``` ::: ## Что покрывает каждый путь - **Mainnet** включает оптимизированный `fast-rpc`, обычный RPC и архивные пути загрузки для горячих и холодных данных. - **Testnet** включает RPC и архивные пути снапшотов для операторов testnet. Требования к узлам смотрите в [nearcore](https://github.com/near/nearcore?tab=readme-ov-file#about-near), а исходники скриптов загрузки, которые используются в этих руководствах, — в [fastnear/static](https://github.com/fastnear/static). ## Нужен сценарий? Используйте [примеры снапшотов](https://docs.fastnear.com/ru/snapshots/examples) для операторских сценариев: выбора между оптимизированным `fast-rpc`, стандартным восстановлением RPC и архивными путями с разделением горячих и холодных данных. ## Выберите сеть - [Снапшоты mainnet](https://docs.fastnear.com/ru/snapshots/mainnet) - [Снапшоты testnet](https://docs.fastnear.com/ru/snapshots/testnet) --- ## Примеры Snapshot - HTML-маршрут: https://docs.fastnear.com/ru/snapshots/examples - Markdown-маршрут: https://docs.fastnear.com/ru/snapshots/examples.md **Источник:** [https://docs.fastnear.com/ru/snapshots/examples](https://docs.fastnear.com/ru/snapshots/examples) ## Готовое расследование ### Выбрать и выполнить правильный сценарий восстановления mainnet Используйте это расследование, когда оператор говорит «мне нужно вернуть этот узел в онлайн» и нужно понять, правильный ли путь — optimized `fast-rpc`, обычный RPC или архивное восстановление с hot/cold-данными. Стратегия Сначала выберите класс восстановления, а затем выполните минимальную последовательность команд именно для него. 01Сначала решите, нужен ли вам optimized fast-rpc, обычный RPC или архивный режим. 02Если нужен архив, сначала зафиксируйте одну точную высоту snapshot-блока и дальше переиспользуйте только её. 03Выполняйте только команды выбранного пути и не смешивайте optimized, standard и archival шаги в одном сценарии. **Цель** - Превратить расплывчатый запрос на восстановление в правильный сценарий снапшота mainnet и минимальную последовательность команд, с которой уже можно безопасно стартовать. | Путь или команда | Как используем | Зачем используем | | --- | --- | --- | | Mainnet optimized `fast-rpc` | Выбираем его первым, когда цель — максимально быстрое восстановление высокопроизводительного RPC, а узел подходит для optimized profile | Это предпочтительный путь быстрого восстановления, если архивное хранение не требуется | | Стандартный RPC в mainnet | Используем его, когда нужен более простой сценарий восстановления RPC без optimized profile | Даёт прямой стандартный путь восстановления в обычный каталог данных nearcore | | Получение последней высоты архивного снапшота | Получаем последнюю высоту архивного снапшота перед архивным восстановлением | Даёт конкретный блок снапшота как опору для загрузки hot/cold-данных | | Команда загрузки hot-данных | Запускаем её первой и размещаем результат на NVMe | Горячие архивные данные должны лежать на быстром уровне хранения, чтобы узел работал корректно | | Команда загрузки cold-данных | Запускаем её после hot-данных и размещаем на холодном уровне хранения | Завершает архивное восстановление без необходимости держать весь архив на дорогом hot-уровне | **Что должен включать полезный ответ** - какой сценарий восстановления выбран и почему - какие ключевые env vars важны для выбранного пути - куда на диске должны попасть данные - должен ли оператор оставаться в FastNear snapshot docs или переходить к общим гайдам nearcore по bootstrap ### Shell-сценарий архивного восстановления mainnet Используйте этот сценарий, когда вы уже решили, что нужен именно архивный путь для mainnet, и теперь нужна точная последовательность команд с одной общей опорной высотой блока. **Что вы делаете** - Один раз получаете последнюю высоту архивного снапшота mainnet. - Сохраняете её в `LATEST`. - Переиспользуете ровно эту же высоту блока и для hot-data, и для cold-data. ```bash HOT_DATA_PATH=~/.near/data COLD_DATA_PATH=/mnt/hdds/cold-data LATEST="$(curl -s "https://snapshot.neardata.xyz/mainnet/archival/latest.txt")" echo "Latest archival mainnet snapshot block: $LATEST" curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone_archival.sh \ | DATA_TYPE=hot-data DATA_PATH="$HOT_DATA_PATH" CHAIN_ID=mainnet BLOCK="$LATEST" bash curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone_archival.sh \ | DATA_TYPE=cold-data DATA_PATH="$COLD_DATA_PATH" CHAIN_ID=mainnet BLOCK="$LATEST" bash ``` **Зачем нужен следующий шаг?** Архивные hot- и cold-данные должны происходить из одного и того же среза снапшота. Повторное использование одного сохранённого значения `LATEST` в обеих командах сохраняет внутреннюю согласованность архива и делает последующую настройку nearcore заметно менее неожиданной. ## Частые задачи ### Поднять optimized `fast-rpc`-узел в mainnet **Начните здесь** - [Снапшоты mainnet](https://docs.fastnear.com/ru/snapshots/mainnet), конкретно путь для optimized `fast-rpc`. **Следующая страница при необходимости** - Вернитесь к обычному сценарию mainnet RPC, если узел не подходит для optimized profile. **Остановитесь, когда** - Уже есть правильная команда `fast-rpc` и нужные переменные окружения для целевой машины. **Переходите дальше, когда** - На самом деле требуется архивное хранение, а не просто быстрый запуск. ### Восстановить обычный RPC-узел в стандартный каталог nearcore **Начните здесь** - [Снапшоты mainnet](https://docs.fastnear.com/ru/snapshots/mainnet) или [Снапшоты testnet](https://docs.fastnear.com/ru/snapshots/testnet) в зависимости от сети и выберите обычный RPC-сценарий для нужного окружения. **Следующая страница при необходимости** - Настраивайте `DATA_PATH`, `THREADS` или ограничения по пропускной способности только после того, как понятен стандартный сценарий. **Остановитесь, когда** - Уже можно запускать правильную команду восстановления RPC с ожидаемым путём данных. **Переходите дальше, когда** - Оператору на самом деле нужна архивная история или разнесение hot/cold-данных по разным хранилищам. ### Правильно поднять архивные hot- и cold-данные mainnet **Начните здесь** - [Снапшоты mainnet](https://docs.fastnear.com/ru/snapshots/mainnet), раздел архивного режима. **Следующая страница при необходимости** - Сначала получите последнюю высоту архивного снапшота, затем запускайте отдельные загрузки hot- и cold-данных с правильными путями. **Остановитесь, когда** - План по hot-data и cold-data уже ясен, и порядок шагов выбран правильно. **Переходите дальше, когда** - Оператору нужны уже общие гайды nearcore по bootstrap, а не только FastNear snapshots. ### Поднять архивные hot-данные в testnet **Начните здесь** - [Снапшоты testnet](https://docs.fastnear.com/ru/snapshots/testnet), раздел архивного режима. **Следующая страница при необходимости** - Получите последнюю высоту архивного снапшота testnet перед шагом загрузки. **Остановитесь, когда** - Уже есть правильная команда для архивных hot-данных testnet и опорная высота блока снапшота. **Переходите дальше, когда** - Пользователь на самом деле не поднимает инфраструктуру и должен быть возвращён к документации API или RPC. ## Частые ошибки - Использовать документацию по снапшотам, когда задача на самом деле про чтение данных цепочки. - Выбирать архивное восстановление, когда достаточно обычного или optimized RPC. - Забывать про разделение hot/cold-данных для архивного режима. - Переходить к командам до выбора сети и цели узла. ## Полезные связанные страницы - [Обзор снапшотов](https://docs.fastnear.com/ru/snapshots) - [Снапшоты mainnet](https://docs.fastnear.com/ru/snapshots/mainnet) - [Снапшоты testnet](https://docs.fastnear.com/ru/snapshots/testnet) - [RPC Reference](https://docs.fastnear.com/ru/rpc) - [NEAR Data API](https://docs.fastnear.com/ru/neardata) --- ## mainnet - HTML-маршрут: https://docs.fastnear.com/ru/snapshots/mainnet - Markdown-маршрут: https://docs.fastnear.com/ru/snapshots/mainnet.md **Источник:** [https://docs.fastnear.com/ru/snapshots/mainnet](https://docs.fastnear.com/ru/snapshots/mainnet) # Mainnet ## Оптимизированный снапшот mainnet Обычно это предпочтительный способ синхронизации. Архивный снапшот заметно больше и подходит для более узких задач. Узлы с достаточными ресурсами могут использовать значение `$RPC_TYPE=fast-rpc`. По умолчанию используется `rpc`. Перед запуском скрипта загрузки снапшота можно задать следующие переменные окружения: - `CHAIN_ID` — `mainnet` или `testnet` (по умолчанию: `mainnet`) - `RPC_TYPE` — `rpc` (по умолчанию) или `fast-rpc` - `THREADS` — число потоков для загрузки. Используйте `128` для 10Gbps и `16` для 1Gbps (по умолчанию: `128`) - `TPSLIMIT` — максимальное число новых HTTP-действий в секунду (по умолчанию: `4096`) - `BWLIMIT` — максимальная пропускная способность для загрузки, если её нужно ограничить (по умолчанию: `10G`) - `DATA_PATH` — путь, куда будет загружен снапшот (по умолчанию: `~/.near/data`) - `BLOCK` — высота блока нужного снапшота. Если не указать, будет загружен последний снапшот. **Выполните эту команду, чтобы скачать RPC-снапшот mainnet:** :::info Будут заданы следующие переменные окружения: - `DATA_PATH=~/.near/data` — стандартный путь nearcore - `CHAIN_ID=mainnet` — явно выбирает данные mainnet - `RPC_TYPE=fast-rpc` — включает оптимизированный режим ::: `RPC Mainnet Snapshot » ~/.near/data`: ```bash curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone.sh | DATA_PATH=~/.near/data CHAIN_ID=mainnet RPC_TYPE=fast-rpc bash ``` ## RPC-снапшот mainnet Это стандартный способ получить снапшот без оптимизированного режима из предыдущего раздела. Перед запуском скрипта загрузки снапшота можно задать следующие переменные окружения: - `CHAIN_ID` — `mainnet` или `testnet` (по умолчанию: `mainnet`) - `RPC_TYPE` — `rpc` (по умолчанию) или `fast-rpc` - `THREADS` — число потоков для загрузки. Используйте `128` для 10Gbps и `16` для 1Gbps (по умолчанию: `128`) - `TPSLIMIT` — максимальное число новых HTTP-действий в секунду (по умолчанию: `4096`) - `BWLIMIT` — максимальная пропускная способность для загрузки, если её нужно ограничить (по умолчанию: `10G`) - `DATA_PATH` — путь, куда будет загружен снапшот (по умолчанию: `~/.near/data`) - `BLOCK` — высота блока нужного снапшота. Если не указать, будет загружен последний снапшот. **Выполните эту команду, чтобы скачать RPC-снапшот mainnet:** :::info Будут заданы следующие переменные окружения: - `DATA_PATH=~/.near/data` — стандартный путь nearcore - `CHAIN_ID=mainnet` — явно выбирает данные mainnet ::: `RPC Mainnet Snapshot » ~/.near/data`: ```bash curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone.sh | DATA_PATH=~/.near/data CHAIN_ID=mainnet bash ``` ## Архивный снапшот mainnet :::warning **Требует много времени и места на диске.** Подготовьтесь к очень большому объёму загрузки и длительному времени выполнения. Размер снапшота составляет около 60 ТБ, и он содержит более 1 миллиона файлов. ::: Перед запуском скрипта загрузки можно задать следующие переменные окружения: - `CHAIN_ID` — `mainnet` или `testnet` (по умолчанию: `mainnet`) - `THREADS` — число потоков для загрузки. Используйте `128` для 10Gbps и `16` для 1Gbps (по умолчанию: `128`) - `TPSLIMIT` — максимальное число новых HTTP-действий в секунду (по умолчанию: `4096`) - `DATA_TYPE` — `hot-data` или `cold-data` (по умолчанию: `cold-data`) - `BWLIMIT` — максимальная пропускная способность для загрузки, если её нужно ограничить (по умолчанию: `10G`) - `DATA_PATH` — путь, куда будет загружен снапшот (по умолчанию: `/mnt/nvme/data/$DATA_TYPE`) - `BLOCK` — высота блока нужного снапшота. Если не указать, будет загружен последний снапшот. По умолчанию скрипт ожидает следующие пути для данных: - Hot data, которые должны лежать на NVME: `/mnt/nvme/data/hot-data` - Cold data, которые можно хранить на HDD: `/mnt/nvme/data/cold-data` **Выполните следующие команды, чтобы скачать архивный снапшот mainnet:** 1. Получите высоту блока последнего снапшота: `Latest archival mainnet snapshot block`: ```bash LATEST=$(curl -s "https://snapshot.neardata.xyz/mainnet/archival/latest.txt") echo "Latest snapshot block: $LATEST" ``` 2. Скачайте данные HOT из снапшота. Их нужно разместить на NVME. :::info Будут заданы следующие переменные окружения: - `DATA_TYPE=hot-data` — выбирает загрузку Hot data - `DATA_PATH=~/.near/data` — стандартный путь nearcore - `CHAIN_ID=mainnet` — явно выбирает данные mainnet - `BLOCK=$LATEST` — указывает блок снапшота ::: `Archival Mainnet Snapshot (hot-data) » ~/.near/data`: ```bash curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone_archival.sh | DATA_TYPE=hot-data DATA_PATH=~/.near/data CHAIN_ID=mainnet BLOCK=$LATEST bash ``` 3. Скачайте данные COLD из снапшота. Их можно разместить на HDD. :::info Будут заданы следующие переменные окружения: - `DATA_TYPE=cold-data` — выбирает загрузку Cold data - `DATA_PATH=/mnt/hdds/cold-data` — путь для размещения cold data. **Обратите внимание:** конфигурация nearcore должна указывать на тот же путь для cold data. - `CHAIN_ID=mainnet` — явно выбирает данные mainnet - `BLOCK=$LATEST` — указывает блок снапшота ::: `Archival Mainnet Snapshot (cold-data) » /mnt/hdds/cold-data`: ```bash curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone_archival.sh | DATA_TYPE=cold-data DATA_PATH=/mnt/hdds/cold-data CHAIN_ID=mainnet BLOCK=$LATEST bash ``` --- ## testnet - HTML-маршрут: https://docs.fastnear.com/ru/snapshots/testnet - Markdown-маршрут: https://docs.fastnear.com/ru/snapshots/testnet.md **Источник:** [https://docs.fastnear.com/ru/snapshots/testnet](https://docs.fastnear.com/ru/snapshots/testnet) # Testnet ## RPC-снапшот testnet Обычно это предпочтительный способ синхронизации. Архивный снапшот заметно больше и нужен для более узких задач. Перед запуском скрипта загрузки снапшота можно задать следующие переменные окружения: - `CHAIN_ID` — `mainnet` или `testnet` (по умолчанию: `mainnet`) - `THREADS` — число потоков для загрузки. Используйте `128` для 10Gbps и `16` для 1Gbps (по умолчанию: `128`) - `TPSLIMIT` — максимальное число новых HTTP-действий в секунду (по умолчанию: `4096`) - `BWLIMIT` — максимальная пропускная способность для загрузки, если её нужно ограничить (по умолчанию: `10G`) - `DATA_PATH` — путь, куда будет загружен снапшот (по умолчанию: `~/.near/data`) - `BLOCK` — высота блока нужного снапшота. Если не указать, будет загружен последний снапшот. **Выполните эту команду, чтобы скачать RPC-снапшот testnet:** :::info Будут заданы следующие переменные окружения: - `DATA_PATH=~/.near/data` — стандартный путь nearcore - `CHAIN_ID=testnet` — явно выбирает данные testnet ::: `RPC Testnet Snapshot » ~/.near/data`: ```bash curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone.sh | DATA_PATH=~/.near/data CHAIN_ID=testnet bash ``` ## Архивный снапшот testnet :::warning **Требует много времени и места на диске.** Подготовьтесь к большому объёму загрузки и длительному времени выполнения. ::: Перед запуском скрипта загрузки можно задать следующие переменные окружения: - `CHAIN_ID` — `mainnet` или `testnet` (по умолчанию: `mainnet`) - `THREADS` — число потоков для загрузки. Используйте `128` для 10Gbps и `16` для 1Gbps (по умолчанию: `128`) - `TPSLIMIT` — максимальное число новых HTTP-действий в секунду (по умолчанию: `4096`) - `DATA_TYPE` — `hot-data` или `cold-data` (по умолчанию: `cold-data`) - `BWLIMIT` — максимальная пропускная способность для загрузки, если её нужно ограничить (по умолчанию: `10G`) - `DATA_PATH` — путь, куда будет загружен снапшот (по умолчанию: `/mnt/nvme/data/$DATA_TYPE`) - `BLOCK` — высота блока нужного снапшота. Если не указать, будет загружен последний снапшот. По умолчанию скрипт ожидает следующий путь для данных: - Hot data, которые должны лежать на NVME: `/mnt/nvme/data/hot-data` **Выполните следующие команды, чтобы скачать архивный снапшот testnet:** 1. Получите высоту блока последнего снапшота: `Latest archival testnet snapshot block`: ```bash LATEST=$(curl -s "https://snapshot.neardata.xyz/testnet/archival/latest.txt") echo "Latest snapshot block: $LATEST" ``` 2. Скачайте данные HOT из снапшота. Их нужно разместить на NVME. :::info Будут заданы следующие переменные окружения: - `DATA_TYPE=hot-data` — выбирает загрузку Hot data - `DATA_PATH=~/.near/data` — стандартный путь nearcore - `CHAIN_ID=testnet` — явно выбирает сеть testnet - `BLOCK=$LATEST` — указывает блок снапшота ::: `Archival Testnet Snapshot (hot-data) » ~/.near/data`: ```bash curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/fastnear/static/refs/heads/main/down_rclone_archival.sh | DATA_TYPE=hot-data DATA_PATH=~/.near/data CHAIN_ID=testnet BLOCK=$LATEST bash ``` --- ## API переводов - HTML-маршрут: https://docs.fastnear.com/ru/transfers - Markdown-маршрут: https://docs.fastnear.com/ru/transfers.md **Источник:** [https://docs.fastnear.com/ru/transfers](https://docs.fastnear.com/ru/transfers) # API переводов API переводов — это самая узкая поверхность истории FastNear. Стартуйте здесь, когда вопрос именно о движении активов, а не о более широкой истории исполнения за этим движением. ## Базовый URL ```bash title="Transfers API Mainnet" https://transfers.main.fastnear.com ``` Эта поверхность сейчас доступна только в mainnet. `?network=testnet` не переключает бэкенд. ## Используйте этот API, когда - нужна история переводов NEAR или FT-токенов по аккаунту - строятся ленты кошелька или представления активности только по переводам - отвечаете на вопросы поддержки или комплаенса про отправку и получение ## Не стартуйте здесь, когда - нужна более широкая история транзакций или квитанций - нужны балансы, активы, NFT или представления стейкинга - нужен трафик testnet Используйте [Транзакции API](https://docs.fastnear.com/ru/tx) для более широкой истории исполнения и [FastNear API](https://docs.fastnear.com/ru/api) для ответов в стиле состояния аккаунта. ## Минимально полезные входы - `account_id` - опциональные фильтры: актив, направление, сумма или время - нужно пользователю несколько событий или более длинный обзор истории ## Рабочий цикл по умолчанию 1. Начните с [Запроса переводов](https://docs.fastnear.com/ru/transfers/query), используя самый узкий набор фильтров, который всё ещё отвечает на вопрос. 2. Читайте возвращённые события как историю только переводов. Не пересобирайте полную хронологию квитанций, пока пользователь не попросит. 3. Переиспользуйте непрозрачный `resume_token` ровно в том виде, в каком его вернул сервис, при листании дальше. 4. Остановитесь, как только можете ответить, кто, что, когда и в каком активе отправил. ## Аутентификация и доступность - Публичные чтения истории переводов часто работают и без ключа. - Если вы стандартизируете один FastNear API-ключ на всех поверхностях FastNear, используйте здесь тот же формат через заголовок или параметр запроса. - Ответы включают непрозрачный `resume_token` для пагинации. - Сервис сейчас доступен только в mainnet. ## Расширяйтесь, только если - пользователь начинает спрашивать о квитанциях или действиях кроме переводов - пользователь хочет более широкий контекст транзакции за переводом - пользователь на самом деле спрашивает о балансах или текущих активах, а не о движении Тогда расширяйтесь на [Транзакции API](https://docs.fastnear.com/ru/tx) или [FastNear API](https://docs.fastnear.com/ru/api), а не перегружайте представление переводов. ## Типовые стартовые страницы - [Запрос переводов](https://docs.fastnear.com/ru/transfers/query) — лента по аккаунту с фильтрами по направлению, активу, сумме и времени ## Нужен сценарий? Используйте [Transfers API Examples](https://docs.fastnear.com/ru/transfers/examples) для простых пошаговых сценариев: узкие поиски переводов, пагинация через `resume_token` и переход к более широкому расследованию транзакций. ## Устранение неполадок ### Нужны полные метаданные транзакции Переходите на [Транзакции API](https://docs.fastnear.com/ru/tx), если одной истории переводов недостаточно. ### `resume_token` перестал работать Считайте токен непрозрачным и переиспользуйте его только с тем же эндпоинтом и фильтрами, которые его вернули. --- ## Примеры Transfers API - HTML-маршрут: https://docs.fastnear.com/ru/transfers/examples - Markdown-маршрут: https://docs.fastnear.com/ru/transfers/examples.md **Источник:** [https://docs.fastnear.com/ru/transfers/examples](https://docs.fastnear.com/ru/transfers/examples) ## Готовый сценарий ### Найти один подозрительный перевод, а затем пройти по его receipt Используйте этот сценарий, когда история звучит так: «я вижу, что средства двигались, но хочу получить точную опорную точку исполнения для этого движения, не затягивая сразу всю историю аккаунта». Стратегия Сначала оставайтесь на узкой истории движения, а затем один раз переключайтесь в историю исполнения. 01POST /v0/transfers даёт узкое исходящее окно и конкретное движение, которое стоит догонять. 02jq поднимает один receipt_id, не затягивая остальную историю аккаунта. 03POST /v0/receipt превращает это движение в опорную точку исполнения, которую уже можно продолжать в /tx. **Что вы делаете** - Запрашиваете ограниченное окно исходящих переводов одного аккаунта в mainnet. - Выделяете один перевод, который действительно похож на нужное вам движение. - Переиспользуете его `receipt_id` в Transactions API, чтобы перейти от движения актива к истории исполнения. ```bash TRANSFERS_BASE_URL=https://transfers.main.fastnear.com TX_BASE_URL=https://tx.main.fastnear.com ACCOUNT_ID=YOUR_ACCOUNT_ID FROM_TIMESTAMP_MS=1711929600000 TO_TIMESTAMP_MS=1712016000000 RECEIPT_ID="$( curl -s "$TRANSFERS_BASE_URL/v0/transfers" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$ACCOUNT_ID" \ --argjson from_timestamp_ms "$FROM_TIMESTAMP_MS" \ --argjson to_timestamp_ms "$TO_TIMESTAMP_MS" '{ account_id: $account_id, direction: "sender", from_timestamp_ms: $from_timestamp_ms, to_timestamp_ms: $to_timestamp_ms, desc: true, limit: 10 }')" \ | tee /tmp/transfers-window.json \ | jq -r '.transfers[0].receipt_id' )" jq '{ resume_token, transfers: [ .transfers[] | { transaction_id, receipt_id, asset_id, amount, other_account_id, block_height } ] }' /tmp/transfers-window.json curl -s "$TX_BASE_URL/v0/receipt" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg receipt_id "$RECEIPT_ID" '{receipt_id: $receipt_id}')" \ | jq '{ receipt_id: .receipt.receipt_id, transaction_hash: .receipt.transaction_hash, receiver_id: .receipt.receiver_id, tx_block_height: .receipt.tx_block_height }' ``` **Зачем нужен следующий шаг?** Запрос переводов быстро отвечает на первый вопрос: отправлял ли этот аккаунт средства в этом окне и кому именно? Переход по `receipt_id` даёт точную опорную точку в исполнении, не затягивая вас сразу в полную историю аккаунта. Если после этого всё ещё нужно больше строк, продолжайте пагинацию тем же `resume_token` и теми же фильтрами. ## Частые задачи ### Найти исходящие переводы одного аккаунта в узком окне времени **Начните здесь** - [Запрос переводов](https://docs.fastnear.com/ru/transfers/query) с аккаунтом, исходящим направлением и самым узким полезным фильтром по времени. **Следующая страница при необходимости** - Сузьте запрос ещё сильнее по активу или сумме, если ответ всё ещё содержит лишние переводы. **Остановитесь, когда** - Уже можно ответить, кто что отправил, когда и в каком активе. **Переходите дальше, когда** - Пользователь спрашивает, почему перевод произошёл или какие ещё действия были вокруг него. Переходите к [Transactions API](https://docs.fastnear.com/ru/tx). ### Листать ленту переводов дальше и не потерять своё место **Начните здесь** - [Запрос переводов](https://docs.fastnear.com/ru/transfers/query) для первой страницы недавних событий, используя как можно более узкие и стабильные фильтры. **Следующая страница при необходимости** - Переиспользуйте ровно тот `resume_token`, который вернул сервис, чтобы получить следующую страницу с теми же фильтрами. - Не меняйте фильтры во время пагинации, иначе это уже будет не та же самая лента. **Остановитесь, когда** - У вас уже достаточно страниц, чтобы ответить на запрос ленты, поддержки или комплаенса. **Переходите дальше, когда** - Пользователь просит метаданные транзакции сверх самих переводов. - Нужны балансы или активы, а не только движение. Переходите к [FastNear API](https://docs.fastnear.com/ru/api). ### Перейти от истории переводов к полному расследованию транзакции **Начните здесь** - [Запрос переводов](https://docs.fastnear.com/ru/transfers/query), чтобы выделить конкретные интересующие переводы. **Следующая страница при необходимости** - [История аккаунта в Transactions API](https://docs.fastnear.com/ru/tx/account), если нужна окружающая история исполнения для того же аккаунта. - [Transactions by Hash](https://docs.fastnear.com/ru/tx/transactions), когда уже понятно, какую транзакцию смотреть дальше. **Остановитесь, когда** - Уже определено правильное событие перевода и понятно, какой API открывать следующим. **Переходите дальше, когда** - Пользователю прямо нужны receipt-детали или точное подтверждение через RPC. Сначала переходите к [Transactions API](https://docs.fastnear.com/ru/tx), затем к [RPC Reference](https://docs.fastnear.com/ru/rpc), если потребуется. ## Частые ошибки - Использовать Transfers API, когда пользователю на самом деле нужны балансы, активы или сводки аккаунта. - Считать историю переводов полной историей исполнения. - Переиспользовать `resume_token` с другими фильтрами. - Начинать здесь с вопросов про testnet, хотя этот API сегодня работает только в mainnet. ## Полезные связанные страницы - [Transfers API](https://docs.fastnear.com/ru/transfers) - [Transactions API](https://docs.fastnear.com/ru/tx) - [FastNear API](https://docs.fastnear.com/ru/api) - [Choosing the Right Surface](https://docs.fastnear.com/ru/agents/choosing-surfaces) - [Agent Playbooks](https://docs.fastnear.com/ru/agents/playbooks) --- ## Транзакции API - HTML-маршрут: https://docs.fastnear.com/ru/tx - Markdown-маршрут: https://docs.fastnear.com/ru/tx.md **Источник:** [https://docs.fastnear.com/ru/tx](https://docs.fastnear.com/ru/tx) # Транзакции API Транзакции API — это поверхность истории. Используйте её, когда нужны индексированные представления транзакций или квитанций без постоянного опроса сырых RPC-методов и ручного объединения результатов. ## Базовые URL ```bash title="Transactions API Mainnet" https://tx.main.fastnear.com ``` ```bash title="Transactions API Testnet" https://tx.test.fastnear.com ``` ## Лучше всего подходит для - лент активности аккаунта; - инструментов отладки и поддержки; - поиска транзакций и квитанций по хешу; - запросов по блокам и диапазонам блоков. ## Когда его не стоит использовать - Используйте [FastNear API](https://docs.fastnear.com/ru/api), когда нужны балансы, NFT, стейкинг или поиск по публичному ключу. - Используйте [Справочник RPC](https://docs.fastnear.com/ru/rpc), когда нужно каноническое поведение узла или отправка транзакций. ## Аутентификация и доступность - Публичные запросы по истории часто работают и без ключа. - Если ваша интеграция стандартизирует один FastNear API-ключ на всех поверхностях FastNear, используйте здесь тот же формат через заголовок или параметр запроса. - Для testnet используйте `https://tx.test.fastnear.com`; поиск квитанций там тоже доступен. - Сервис предназначен для индексированного доступа к истории, а не для отправки транзакций. ## С чего обычно начинают - [Транзакции по хешу](https://docs.fastnear.com/ru/tx/transactions) — когда вы уже знаете идентификатор транзакции. - [История аккаунта](https://docs.fastnear.com/ru/tx/account) — для лент активности и отладки аккаунта. - [Поиск квитанции](https://docs.fastnear.com/ru/tx/receipt) — для расследования цепочки исполнения. - [Диапазон блоков](https://docs.fastnear.com/ru/tx/blocks) — когда нужен ограниченный по диапазону просмотр истории. ## Нужен сценарий? Используйте [примеры API транзакций](https://docs.fastnear.com/ru/tx/examples) для простых пошаговых сценариев: поиска транзакций, расследования квитанций, истории аккаунта и анализа диапазонов блоков. ## Устранение неполадок ### Я ожидал, что здесь можно отправлять транзакции Это семейство предназначено для индексированных запросов по истории, а не для отправки подписанных транзакций. Для отправки используйте сырой RPC. ### Мне нужны пояснения по пагинации `/v0/account` использует непрозрачный `resume_token`, а `/v0/blocks` опирается на диапазон и лимит. Повторно используйте непрозрачные токены ровно в том виде, в каком их вернул сервис. ### Мне нужен только один канонический результат статуса транзакции из RPC Используйте сырой RPC вместо индексированного семейства истории. --- ## Примеры Transactions API - HTML-маршрут: https://docs.fastnear.com/ru/tx/examples - Markdown-маршрут: https://docs.fastnear.com/ru/tx/examples.md **Источник:** [https://docs.fastnear.com/ru/tx/examples](https://docs.fastnear.com/ru/tx/examples) Если нужен более развёрнутый разбор на той же поверхности, переходите к [Berry Club](https://docs.fastnear.com/ru/tx/examples/berry-club) для исторического восстановления доски или к [OutLayer](https://docs.fastnear.com/ru/tx/examples/outlayer) для трассировки воркера и callback-цепочки. ## С чего начать Здесь собраны самые маленькие полезные якоря на странице: сначала один tx hash, потом один receipt ID, и только затем более глубокая форензика. ### У меня есть один хеш транзакции. Что вообще произошло? Используйте это расследование, когда история максимально простая: «мне прислали один хеш транзакции. Я просто хочу понять, сработала ли она, что именно сделала и в какой блок попала». Это и есть входной пример beginner-to-intermediate для этой страницы. До receipt, promise-цепочек и форензики есть один более базовый навык, который нужен любому NEAR-инженеру: превратить голый tx hash в одну короткую человеческую историю. Стратегия Начните с читаемой записи о транзакции и переходите в RPC или receipts только если первого ответа оказалось недостаточно. 01POST /v0/transactions даёт signer, receiver, типы действий, высоту блока и первую receipt-точку передачи. 02RPC EXPERIMENTAL_tx_status нужен только для точной протокольной семантики успеха. 03POST /v0/receipt имеет смысл только тогда, когда именно первая receipt становится новой опорной точкой. **Цель** - Начать с одного хеша транзакции и получить самый короткий полезный ответ: signer, receiver, тип действия, включающий блок и факт, что транзакция действительно ушла в успешный путь исполнения. Для этого зафиксированного примера: - хеш транзакции: `AdgNifPYpoDNS5ckfBZm36Ai6LuL5bTstuKsVdGjKwGp` - signer: `mike.near` - receiver: `global-counter.mike.near` - высота включающего блока: `194263342` - ID первой receipt: `5GhZcpfKWhrpaZo5Am74QfEUFQnZBz48G7hfoLPVDXcq` Простой человеческий ответ для этого случая такой: `mike.near` отправил одну транзакцию с действием `Transfer` в адрес `global-counter.mike.near`, эта транзакция попала в блок `194263342`, и сеть передала её в одну успешную receipt. ```mermaid flowchart LR H["Один tx hash
AdgNifPY..."] --> T["Получаем транзакцию"] T --> A["Читаем signer, receiver, actions, block"] A --> S["Короткая человеческая история"] T -. "если потом понадобится" .-> R["Первая receipt
5GhZcpfK..."] ``` | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Читаемая история транзакции | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Стартуем с хеша транзакции и печатаем signer, receiver, включающий блок, список действий и handoff в первую receipt | Даёт самый быстрый читаемый ответ на вопрос «что вообще сделала эта транзакция?» | | Каноническое продолжение по статусу | RPC [`EXPERIMENTAL_tx_status`](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) | Переиспользуем тот же хеш транзакции и signer только если нужны точные протокольные семантики статуса | Полезно, когда следующий вопрос уже звучит как «а по RPC это точно успех?» | | Переход к receipt | Transactions API [`POST /v0/receipt`](https://docs.fastnear.com/ru/tx/receipt) | Переиспользуем ID первой receipt, если вопрос превращается в историю на уровне receipt | Даёт естественный мост к следующему расследованию, когда лучшим якорем становится уже не транзакция, а receipt | **Что должен включать полезный ответ** - кто подписал транзакцию - какой аккаунт её получил - какой тип действия она несла - в какой блок попала - одно простое предложение, которое объясняет транзакцию без receipt-жаргона #### Shell-сценарий: от хеша транзакции к человеческой истории Используйте этот сценарий, когда нужен самый короткий путь от одного tx hash к одному читаемому ответу. **Что вы делаете** - Получаете транзакцию по хешу и печатаете её основные поля. - Подтверждаете финальный статус только если нужны точные RPC-семантики. - Сохраняете первую receipt только как необязательный следующий шаг. ```bash TX_BASE_URL=https://tx.main.fastnear.com RPC_URL=https://rpc.mainnet.fastnear.com TX_HASH=AdgNifPYpoDNS5ckfBZm36Ai6LuL5bTstuKsVdGjKwGp SIGNER_ACCOUNT_ID=mike.near ``` 1. Получите транзакцию и распечатайте базовую историю. ```bash FIRST_RECEIPT_ID="$( curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/basic-tx-story.json \ | jq -r '.transactions[0].transaction_outcome.outcome.status.SuccessReceiptId' )" jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, included_block_height: .transactions[0].execution_outcome.block_height }, actions: ( .transactions[0].transaction.actions | map(if type == "string" then . else keys[0] end) ), first_receipt_id: .transactions[0].transaction_outcome.outcome.status.SuccessReceiptId, receipt_count: (.transactions[0].receipts | length) }' /tmp/basic-tx-story.json # Ожидаемый список действий: ["Transfer"] # Ожидаемая первая receipt: 5GhZcpfKWhrpaZo5Am74QfEUFQnZBz48G7hfoLPVDXcq ``` 2. Если нужны точные RPC-семантики статуса, подтвердите их через `EXPERIMENTAL_tx_status`. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$TX_HASH" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "EXPERIMENTAL_tx_status", params: { tx_hash: $tx_hash, sender_account_id: $signer_account_id, wait_until: "FINAL" } }')" \ | jq '{ final_execution_status: .result.final_execution_status, status: .result.status, transaction_handoff: .result.transaction_outcome.outcome.status }' ``` 3. Если следующий вопрос уже звучит как «что это была за первая receipt?», один раз перейдите по ней и остановитесь. ```bash curl -s "$TX_BASE_URL/v0/receipt" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg receipt_id "$FIRST_RECEIPT_ID" '{receipt_id: $receipt_id}')" \ | jq '{ receipt_id: .receipt.receipt_id, receiver_id: .receipt.receiver_id, is_success: .receipt.is_success, receipt_block_height: .receipt.block_height, transaction_hash: .receipt.transaction_hash }' ``` Последний шаг специально сделан необязательным. Если вам нужна была только история транзакции, уже первого шага достаточно. Двигайтесь дальше только когда сама receipt становится новым якорем. **Зачем нужен следующий шаг?** `POST /v0/transactions` — это самый чистый старт, когда у вас на руках только tx hash и нужен один читаемый ответ. RPC нужен как продолжение для точных семантик статуса. `POST /v0/receipt` — это handoff на случай, когда следующий вопрос уже относится не ко всей транзакции, а к одной receipt внутри неё. ### Превратить один страшный receipt ID из логов в понятную человеческую историю Используйте это расследование, когда у вас на руках только один страшный `receipt_id` из логов, трассы или отчёта об ошибке, а нужно превратить его в простой ответ, который поймёт коллега без расшифровки receipt-полей. Если у вас уже есть хеш транзакции, а не receipt ID, начните с более простого расследования прямо выше и опускайтесь сюда только тогда, когда сама receipt становится лучшим якорем. Стратегия Сначала разрешите сам receipt, затем восстановите родительскую транзакцию и остановитесь, как только история стала читаемой. 01POST /v0/receipt показывает, к какой транзакции и к какому блоку исполнения относится receipt. 02POST /v0/transactions превращает этот сырой receipt в контекст signer, receiver и действий. 03RPC tx status — это уже необязательный следующий шаг, когда «человеческая история» превращается в «нужна точная семантика протокола». **Цель** - Начать с одного receipt ID и восстановить самую короткую полезную историю: кто его создал, где он исполнился, какая транзакция его породила и что эта транзакция вообще пыталась сделать. Для этого зафиксированного примера «страшный receipt ID из логов» такой: - receipt ID: `5GhZcpfKWhrpaZo5Am74QfEUFQnZBz48G7hfoLPVDXcq` - хеш исходной транзакции: `AdgNifPYpoDNS5ckfBZm36Ai6LuL5bTstuKsVdGjKwGp` - signer: `mike.near` - receiver: `global-counter.mike.near` - высота блока транзакции: `194263342` - высота блока исполнения receipt: `194263343` Человеческая история за этим receipt простая: `mike.near` подписал обычную транзакцию `Transfer` в адрес `global-counter.mike.near`, сеть превратила её в одну квитанцию с действием, а эта квитанция успешно исполнилась в следующем блоке. ```mermaid flowchart LR L["Один страшный receipt ID
5GhZcpfK..."] --> R["Ищем receipt"] R --> T["Восстанавливаем tx hash
AdgNifPY..."] T --> S["Читаем действия транзакции"] S --> H["Человеческая история:
mike.near отправил 5 NEAR в global-counter.mike.near"] ``` | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Якорь по квитанции | Transactions API [`POST /v0/receipt`](https://docs.fastnear.com/ru/tx/receipt) | Сначала ищем ID квитанции и печатаем аккаунты, блок исполнения, флаг успеха и связанный хеш транзакции | Даёт самый короткий путь от сырого receipt ID к пониманию, что вообще за объект перед вами | | История транзакции | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Переиспользуем полученный хеш транзакции и печатаем signer, receiver, упорядоченные действия и включающий блок | Превращает сырую квитанцию в читаемую историю того, что signer на самом деле отправил | | Каноническое продолжение | RPC [`tx`](https://docs.fastnear.com/ru/rpc/transaction/tx-status) или [`EXPERIMENTAL_tx_status`](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) | Подтверждаем протокольные семантики только если индексированного ответа всё ещё недостаточно | Полезно, когда вопрос меняется с «расскажи мне историю» на «покажи точную RPC-семантику статуса» | **Что должен включать полезный ответ** - какие аккаунты создали и исполнили квитанцию - к какой транзакции относится эта квитанция - что транзакция на самом деле сделала - была ли квитанция главным событием или только шагом в большом каскаде - одно предложение простым языком, которое можно без правок вставить коллеге в чат #### Shell-сценарий: от страшного receipt ID к человеческой истории ## Ошибки и async Здесь страница перестаёт быть просто поиском по объектам и начинает объяснять семантику исполнения в NEAR: атомарность пакета действий, более поздние async-сбои и порядок callback-ов. Используйте этот сценарий, когда у вас уже есть один сырой `receipt_id` из логов и нужно быстро превратить его в читаемое объяснение. **Что вы делаете** - Сначала разрешаете receipt. - Извлекаете `receipt.transaction_hash` через `jq`. - Переиспользуете этот хеш транзакции в `POST /v0/transactions`. - Завершаете одним человеческим резюме, которое можно вставить в чат или тикет. ```bash TX_BASE_URL=https://tx.main.fastnear.com RECEIPT_ID='5GhZcpfKWhrpaZo5Am74QfEUFQnZBz48G7hfoLPVDXcq' ``` 1. Разрешите receipt и поймите, что за объект вы смотрите. ```bash TX_HASH="$( curl -s "$TX_BASE_URL/v0/receipt" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg receipt_id "$RECEIPT_ID" '{receipt_id: $receipt_id}')" \ | tee /tmp/receipt-lookup.json \ | jq -r '.receipt.transaction_hash' )" jq '{ receipt: { receipt_id: .receipt.receipt_id, predecessor_id: .receipt.predecessor_id, receiver_id: .receipt.receiver_id, receipt_type: .receipt.receipt_type, is_success: .receipt.is_success, receipt_block_height: .receipt.block_height, transaction_hash: .receipt.transaction_hash, tx_block_height: .receipt.tx_block_height } }' /tmp/receipt-lookup.json ``` 2. Переиспользуйте хеш транзакции и превратите квитанцию в читаемую историю транзакции. ```bash curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/receipt-parent-transaction.json >/dev/null jq '{ transaction: { transaction_hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, tx_block_height: .transactions[0].execution_outcome.block_height, action_types: ( .transactions[0].transaction.actions | map(if type == "string" then . else keys[0] end) ), transfer_deposit_yocto: ( .transactions[0].transaction.actions[0].Transfer.deposit // null ) }, receipt_count: (.transactions[0].receipts | length) }' /tmp/receipt-parent-transaction.json ``` 3. Сведите это к одному человеческому предложению. ```bash jq -r ' .transactions[0] as $tx | "Receipt \($tx.execution_outcome.outcome.receipt_ids[0]) относится к tx \($tx.transaction.hash): \($tx.transaction.signer_id) отправил 5 NEAR в \($tx.transaction.receiver_id). Транзакция попала в блок \($tx.execution_outcome.block_height), а receipt успешно исполнился в блоке \($tx.receipts[0].execution_outcome.block_height)." ' /tmp/receipt-parent-transaction.json ``` Для другого receipt держитесь того же шаблона, но поменяйте финальное предложение так, чтобы оно соответствовало типам действий, которые вы только что напечатали. В этом и состоит ключевой приём: не нужно объяснять каждое поле квитанции. Нужно восстановить ровно столько контекста, чтобы сказать, что сделал signer, где исполнился receipt и был ли этот receipt главным событием или только шагом в более крупном каскаде. **Зачем нужен следующий шаг?** `POST /v0/receipt` показывает, к чему привязан сырой receipt. `POST /v0/transactions` показывает, что signer на самом деле пытался сделать. Как только эти две части собраны вместе, чаще всего уже можно объяснить receipt одним предложением и только потом решать, нужны ли вообще контекст блока, история аккаунта или канонический RPC-статус. ### Доказать, что одно неудачное действие сорвало весь пакет Используйте это расследование, когда одна транзакция с несколькими действиями пыталась создать и пополнить новый аккаунт, добавить на него ключ, а затем вызвать метод на этом же новом аккаунте. Финальное действие упало, потому что у свежего аккаунта не было кода контракта. Настоящий вопрос здесь простой: закрепились ли ранние действия или весь пакет не сработал целиком? В NEAR действия внутри одного пакета транзакции исполняются по порядку внутри первой квитанции с действиями. Если одно действие в этой квитанции падает, ранние действия из того же пакета тоже не закрепляются. Это отличается от более поздних асинхронных квитанций или promise-цепочек, где первая квитанция может пройти успешно, а уже следующая упасть отдельно. Стратегия Докажите, что пакет пытался сделать, какое действие упало и закрепилось ли что-нибудь из ранних шагов. 01POST /v0/transactions показывает упорядоченный пакет ровно в том виде, в каком его подписал signer. 02RPC EXPERIMENTAL_tx_status показывает падающий FunctionCall и точную причину отказа на уровне протокола. 03RPC view_account по предполагаемому новому аккаунту доказывает, закрепились ли вообще ранние create, fund и add-key действия. **Цель** - На примере одной зафиксированной транзакции из testnet доказать, что финальный `FunctionCall` упал, а ранние действия `CreateAccount`, `Transfer` и `AddKey` не закрепились. **Официальные ссылки** - [Основы транзакций](https://docs.fastnear.com/ru/transaction-flow/foundations) - [Исполнение в рантайме](https://docs.fastnear.com/ru/transaction-flow/runtime-execution) Этот зафиксированный сбой был получен в **testnet 18 апреля 2026 года**: - хеш транзакции: `CrhH3xLzbNwNMGgZkgptXorwh8YmqxRGuA6Mc11MkU6M` - аккаунт signer: `temp.mike.testnet` - целевой новый аккаунт: `rollback-mo4vmkig.temp.mike.testnet` - высота включающего блока: `246365118` - хеш включающего блока: `6f5zTKDqQRwrxMywzvxeRvYcCERJmAnatJaqUEtQYUNM` - порядок действий: `CreateAccount -> Transfer -> AddKey -> FunctionCall` - упавший метод: `definitely_missing_method` - RPC-ошибка: `CodeDoesNotExist` на `rollback-mo4vmkig.temp.mike.testnet` ```mermaid flowchart LR T["Одна подписанная транзакция"] --> A["CreateAccount"] A --> B["Transfer 0.01 NEAR"] B --> C["AddKey"] C --> D["FunctionCall definitely_missing_method()"] D --> E["Сбой: CodeDoesNotExist"] E --> R["Весь пакет не закрепился"] R --> N["Новый аккаунт не появился"] R --> K["Новый ключ не закрепился"] R --> F["У получателя нет профинансированного состояния"] ``` | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Задуманный пакет | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Загружаем зафиксированный хеш транзакции и печатаем упорядоченный список действий, получателя и метаданные включающего блока | Показывает, что именно signer пытался сделать, ещё до разговора о том, что закрепилось | | Точное место сбоя | RPC [`EXPERIMENTAL_tx_status`](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) | Запрашиваем ту же транзакцию с `wait_until: "FINAL"` и смотрим `status.Failure` | Показывает, какое действие упало и почему весь пакет не закрепился на уровне протокола | | Доказательство по состоянию после исполнения | RPC [`query(view_account)`](https://docs.fastnear.com/ru/rpc/account/view-account) | Запрашиваем предполагаемый новый аккаунт после finality | Если созданный аккаунт до сих пор не существует, значит ранние `CreateAccount`, `Transfer` и `AddKey` из того же пакета действий тоже не закрепились | Перед shell-сценарием важно отметить одну деталь: индексированная запись транзакции всё ещё показывает `transaction_outcome.outcome.status = SuccessReceiptId`, потому что подписанная транзакция успешно превратилась в свою первую квитанцию с действиями. Но доказательство того, что весь пакет не закрепился, приходит из верхнеуровневого RPC `status.Failure` для этой первой квитанции и из проверки состояния после исполнения, что целевой новый аккаунт так и не появился. **Что должен включать полезный ответ** - точный порядок действий, который отправил signer - какой индекс действия упал и почему - высоту и хеш включающего блока для этого батча - доказательство, что предполагаемый новый аккаунт всё ещё не существует после finality - короткий вывод, что ранние `CreateAccount`, `Transfer` и `AddKey` не закрепились после падения финального `FunctionCall` #### Shell-сценарий неудачной транзакции с пакетом действий Используйте этот сценарий, когда нужен один конкретный неудачный пакет действий, который можно разобрать по шагам через публичные FastNear testnet-эндпоинты. **Что вы делаете** - Читаете индексированную запись транзакции, чтобы восстановить задуманный пакет действий. - Через RPC transaction status доказываете, что финальный `FunctionCall` действительно упал и сорвал весь пакет. - Через один RPC-запрос к состоянию после исполнения доказываете, что новый аккаунт так и не появился после finality. ```bash TX_BASE_URL=https://tx.test.fastnear.com RPC_URL=https://rpc.testnet.fastnear.com TX_HASH=CrhH3xLzbNwNMGgZkgptXorwh8YmqxRGuA6Mc11MkU6M SIGNER_ACCOUNT_ID=temp.mike.testnet NEW_ACCOUNT_ID=rollback-mo4vmkig.temp.mike.testnet ``` 1. Получите транзакцию и распечатайте задуманный пакет действий. ```bash curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/failed-batch-transaction.json >/dev/null jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, included_block_height: .transactions[0].execution_outcome.block_height, included_block_hash: .transactions[0].execution_outcome.block_hash }, batch: { action_count: (.transactions[0].transaction.actions | length), action_types: ( .transactions[0].transaction.actions | map(if type == "string" then . else keys[0] end) ), final_function_call_method_name: ( .transactions[0].transaction.actions[3].FunctionCall.method_name ) }, first_receipt_handoff: .transactions[0].transaction_outcome.outcome.status }' /tmp/failed-batch-transaction.json # Ожидаемый порядок действий: # 1. CreateAccount # 2. Transfer # 3. AddKey # 4. FunctionCall ``` 2. Запросите RPC transaction status и посмотрите точную верхнеуровневую ошибку. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$TX_HASH" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "EXPERIMENTAL_tx_status", params: { tx_hash: $tx_hash, sender_account_id: $signer_account_id, wait_until: "FINAL" } }')" \ | tee /tmp/failed-batch-rpc-status.json >/dev/null jq '{ final_execution_status: .result.final_execution_status, failed_action_index: .result.status.Failure.ActionError.index, failure: .result.status.Failure.ActionError.kind.FunctionCallError.CompilationError.CodeDoesNotExist }' /tmp/failed-batch-rpc-status.json # Ожидаемый failed_action_index: 3 # Ожидаемый failure account_id: rollback-mo4vmkig.temp.mike.testnet ``` 3. Запросите предполагаемый новый аккаунт после finality и докажите, что его всё ещё нет. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$NEW_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "view_account", account_id: $account_id, finality: "final" } }')" \ | tee /tmp/failed-batch-view-account.json >/dev/null jq '{ error: .error.cause.name, message: .error.data, requested_account_id: .error.cause.info.requested_account_id, proof_block_height: .error.cause.info.block_height }' /tmp/failed-batch-view-account.json # Ожидаемая ошибка: "UNKNOWN_ACCOUNT" ``` Этой одной проверки состояния после исполнения здесь достаточно. Если бы `CreateAccount` закрепился, `view_account` вернул бы аккаунт. Раз аккаунт до сих пор не существует, значит ранние `Transfer` и `AddKey` из той же квитанции с действиями тоже не закрепились. **Зачем нужен следующий шаг?** Для любой другой неудачной транзакции с несколькими действиями держитесь того же шаблона: сначала прочитайте, что транзакция пыталась сделать, через [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions), затем подтвердите точную верхнеуровневую ошибку через RPC transaction status, а потом проверьте состояние после исполнения у аккаунта, ключа, контракта или другого объекта, который должен был измениться, если бы ранние действия закрепились. ### Почему вызов контракта выглядел успешным, а потом упал более поздний receipt? Используйте это расследование, когда один вызов контракта залогировал успех, изменил своё локальное состояние, и даже верхнеуровневый RPC `status` выглядит успешным, но приложение всё равно сломалось, потому что позже упал отдельный cross-contract receipt. Это противоположность примеру с неудачным пакетом действий выше. Там одно действие упало внутри первой action-receipt, поэтому не закрепилось ничего из этого пакета. Здесь первая receipt контракта действительно прошла успешно, и её изменение состояния действительно закрепилось. Сбой случился позже, в отдельной receipt. Стратегия Сначала получаем человеческий таймлайн, а уже потом доказываем, где именно async-история разошлась. 01POST /v0/transactions даёт самый удобный первый проход: какая receipt успела пройти первой и какая упала позже. 02RPC EXPERIMENTAL_tx_status доказывает важную NEAR-деталь: верхнеуровневый успех и более поздний сбой потомка могут одновременно быть правдой. 03RPC call_function на роутере показывает, закрепилось ли собственное локальное изменение состояния из первой receipt. **Цель** - Доказать по одной зафиксированной testnet-транзакции, что `seq-dr.mike.testnet.kickoff_append(...)` успешно отработал на своей собственной receipt, а потом отдельный detached-вызов `append(...)` упал через один блок с `CodeDoesNotExist`. **Официальные ссылки** - [Основы транзакций](https://docs.fastnear.com/ru/transaction-flow/foundations) - [Исполнение в рантайме](https://docs.fastnear.com/ru/transaction-flow/runtime-execution) Этот зафиксированный асинхронный сбой был получен в **testnet 18 апреля 2026 года**: - хеш транзакции: `AUciGAq54XZtEuVXA9bSq4k6h13LmspoKtLegcWGRmQz` - аккаунт signer: `temp.mike.testnet` - первый контракт-получатель: `seq-dr.mike.testnet` - аккаунт detached-цели: `asyncfail-in2hwikn.temp.mike.testnet` - блок включения транзакции: `246368568` - успешная первая receipt: `6XgWxB9QVkgGKJaLcjDphGHYTK5d1suNe2cH1WHRWnoS` в блоке `246368569` - более поздняя упавшая receipt: `2A5JG8N1BxyR57WbrjqntTSf1UwR4RXR79MD2Zg3K2es` в блоке `246368570` - первый метод: `kickoff_append` - более поздний упавший метод: `append` - верхнеуровневый RPC `status`: `SuccessValue` ```mermaid flowchart LR T["Подписанная tx
kickoff_append(...)"] --> R["Первая receipt на seq-dr.mike.testnet
SuccessValue + kickoff log"] R --> S["Роутер сохраняет локальное состояние
kicked += late-failure"] R --> D["Detached cross-contract receipt
append(...)"] D --> F["Более поздний сбой
CodeDoesNotExist"] S -. "состояние из первой receipt всё равно закрепилось" .-> K["kicked() всё ещё содержит late-failure"] ``` | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Каркас транзакции | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Загружаем зафиксированную транзакцию и печатаем включающий блок плюс таймлайн receipt | Даёт самый короткий читаемый обзор: какая receipt отработала первой и какая упала позже | | Точные семантики статуса | RPC [`EXPERIMENTAL_tx_status`](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) | Смотрим верхнеуровневый `status`, outcome первой receipt контракта и outcome более поздней упавшей receipt | Доказывает, что верхнеуровневый успех и более поздний сбой потомка могут сосуществовать в одной async-истории | | Текущее состояние контракта | RPC [`query(call_function)`](https://docs.fastnear.com/ru/rpc/contract/call-function) | Вызываем `seq-dr.mike.testnet.kicked()` | Показывает, что локальное изменение состояния из первой receipt закрепилось, хотя более поздняя detached-receipt упала | Здесь важна одна NEAR-деталь: успех receipt не является транзитивным. `seq-dr.mike.testnet` вернул успех на своей собственной receipt, потому что `kickoff_append(...)` только залогировал событие и detached-нул следующий hop. Detached-receipt `append(...)` была уже отдельной частью async-работы, поэтому её более поздний сбой не откатил более раннее изменение состояния роутера. **Что должен включать полезный ответ** - что подписанная транзакция успешно передала управление в первую router-receipt - что сама router-receipt завершилась успешно и выдала лог `dishonest_router:kickoff:late-failure` - что более поздняя detached-receipt в `asyncfail-in2hwikn.temp.mike.testnet` упала с `CodeDoesNotExist` - что собственное состояние роутера всё ещё содержит `late-failure`, то есть локальный побочный эффект первой receipt закрепился - одно предложение, которое объясняет, почему это отличается от неудачной батч-транзакции #### Shell-сценарий более позднего сбоя receipt Используйте этот сценарий, когда история звучит так: «вызов контракта выглядел нормальным, но потом что-то упало, и мне надо точно доказать, где история разошлась». **Что вы делаете** - Читаете транзакцию и её таймлайн receipt из индексированного представления. - Через RPC transaction status показываете, что верхнеуровневая история всё равно закончилась `SuccessValue`, хотя более поздняя receipt упала. - Читаете текущее состояние роутера, чтобы показать: локальный побочный эффект первой receipt закрепился. ```bash TX_BASE_URL=https://tx.test.fastnear.com RPC_URL=https://rpc.testnet.fastnear.com TX_HASH=AUciGAq54XZtEuVXA9bSq4k6h13LmspoKtLegcWGRmQz SIGNER_ACCOUNT_ID=temp.mike.testnet ROUTER_ACCOUNT_ID=seq-dr.mike.testnet FIRST_RECEIPT_ID=6XgWxB9QVkgGKJaLcjDphGHYTK5d1suNe2cH1WHRWnoS FAILED_RECEIPT_ID=2A5JG8N1BxyR57WbrjqntTSf1UwR4RXR79MD2Zg3K2es ``` 1. Получите транзакцию и распечатайте таймлайн receipt по порядку блоков. ```bash curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/later-receipt-failure-transaction.json >/dev/null jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, tx_block_height: .transactions[0].execution_outcome.block_height, tx_handoff: .transactions[0].transaction_outcome.outcome.status }, receipts: [ .transactions[0].receipts[] | { receipt_id: .receipt.receipt_id, receiver_id: .receipt.receiver_id, block_height: .execution_outcome.block_height, method_name: (.receipt.receipt.Action.actions[0].FunctionCall.method_name // "system_transfer"), status: .execution_outcome.outcome.status } ] }' /tmp/later-receipt-failure-transaction.json # На что смотреть: # - первая receipt контракта на seq-dr.mike.testnet успешно прошла в блоке 246368569 # - более поздняя receipt append(...) упала в блоке 246368570 ``` 2. Запросите RPC transaction status и сравните верхнеуровневую историю с более поздней упавшей receipt. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$TX_HASH" \ --arg signer_account_id "$SIGNER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "EXPERIMENTAL_tx_status", params: { tx_hash: $tx_hash, sender_account_id: $signer_account_id, wait_until: "FINAL" } }')" \ | tee /tmp/later-receipt-failure-rpc.json >/dev/null jq \ --arg first_receipt_id "$FIRST_RECEIPT_ID" \ --arg failed_receipt_id "$FAILED_RECEIPT_ID" '{ top_level_status: .result.status, transaction_handoff: .result.transaction_outcome.outcome.status, first_contract_receipt: ( .result.receipts_outcome[] | select(.id == $first_receipt_id) | { receipt_id: .id, executor_id: .outcome.executor_id, logs: .outcome.logs, status: .outcome.status } ), later_failed_receipt: ( .result.receipts_outcome[] | select(.id == $failed_receipt_id) | { receipt_id: .id, executor_id: .outcome.executor_id, status: .outcome.status } ) }' /tmp/later-receipt-failure-rpc.json # На что смотреть: # - top_level_status всё ещё равен SuccessValue # - первая receipt контракта залогировала dishonest_router:kickoff:late-failure # - более поздняя receipt append(...) упала с CodeDoesNotExist ``` 3. Прочитайте текущее состояние роутера и подтвердите, что локальный побочный эффект первой receipt закрепился. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg account_id "$ROUTER_ACCOUNT_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: $account_id, method_name: "kicked", args_base64: "e30=", finality: "final" } }')" \ | tee /tmp/later-receipt-failure-kicked.json >/dev/null jq '{ kicked: (.result.result | implode | fromjson), contains_late_failure: ((.result.result | implode | fromjson) | index("late-failure") != null) }' /tmp/later-receipt-failure-kicked.json ``` Этот последний read и есть практическое доказательство того, что локальное изменение из первой receipt закрепилось. Более поздняя упавшая receipt не откатила более ранний `kicked.push(...)` внутри роутера. **Зачем нужен следующий шаг?** Когда NEAR-приложение «как будто прошло успешно», а потом всё равно сломалось, надо спрашивать не только «какой был статус транзакции?», но и «какая receipt завершилась успешно, а какая позже упала?» Этот пример как раз даёт такой разрез: индексированный таймлайн receipt для общей формы, RPC status для точных семантик и один read состояния контракта, чтобы доказать, что ранний побочный эффект закрепился. ### Проследить асинхронную promise-цепочку и доказать порядок callback-ов Используйте это расследование, когда одна транзакция создаёт promise-работу на потом, вторая позже её resume-ит, и настоящий вопрос звучит не как «обе ли транзакции успешно прошли?», а как «выполнились ли cross-contract callback-и именно в том порядке, который я задумал?» Стратегия Смотрите на два хеша как на одну async-историю: докажите, что работа была жива, восстановите запрошенный порядок и сравните его с видимым downstream-state. 01RPC call_function на view отложенной работы доказывает, что promise-работа действительно уже была жива до resume-шага. 02POST /v0/transactions даёт оба block-anchor и точный порядок, который запросила resume-транзакция. 03RPC EXPERIMENTAL_tx_status вместе с downstream-view доказывают, где callback-и реально выполнились и в каком видимом порядке. **Цель** - Превратить два хеша транзакций в одну читаемую историю доказательства: какая promise-работа была создана, какой порядок запросил resume-вызов и какой порядок позже стал виден в downstream-состоянии контракта. Если в кодовой базе или во вспомогательных скриптах это называется staged/release- или yield/resume-сценарием, это нормально. Но для документации полезнее более простая модель: - **создать promise-работу**: одна транзакция готовит отложенную асинхронную работу на потом - **resume promise-работы**: более поздняя транзакция просит контракт продолжить эту работу в запрошенном порядке - **проследить async-путь**: деревья receipt показывают, где реально выполнились cross-contract callback-и - **посмотреть состояние**: downstream-состояние контракта показывает, какой порядок стал виден пользователю или интегратору ```mermaid flowchart LR Y["Tx 1
создаёт promise-работу"] --> H["Yielded promises становятся доступны
staged_calls_for(...)"] H --> R["Tx 2
resume-ит promises в порядке beta -> alpha -> gamma"] R --> C["Async cross-contract callback-и"] C --> B["Recorder state
beta"] B --> A["Recorder state
alpha"] A --> G["Recorder state
gamma"] Y -. "здесь живёт главное receipt-tree-доказательство" .-> D["Original promise DAG"] R -. "запрошенный порядок живёт здесь" .-> P["Resume payload"] G -. "наблюдаемый порядок заканчивается здесь" .-> O["Наблюдаемый downstream-порядок"] ``` Это различие важно, потому что одного факта успешности resume-транзакции всё равно недостаточно, чтобы доказать наблюдаемый порядок. Нужны ещё доказательства, что promise-работа действительно стала доступна до resume, и доказательства, что downstream-состояние изменилось в том же порядке, который запросил resume-вызов. Для NEAR-инженера здесь важна такая модель: resume-транзакция несёт **запрошенный порядок**, но главной опорной транзакцией расследования обычно всё равно остаётся исходная promise-транзакция, потому что возобновлённые callback-и продолжают жить на её исходном async receipt-tree. Именно downstream-состояние и позволяет затем сравнить запрошенный порядок с наблюдаемым. | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Трассировка promise-цепочки | RPC [`EXPERIMENTAL_tx_status`](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) | Запрашиваем хеш исходной promise-транзакции и хеш более поздней resume-транзакции с `wait_until: "FINAL"`, обычно сначала через основной RPC, а при `UNKNOWN_TRANSACTION` — через архивный RPC | Граф квитанций — это основная поверхность доказательства порядка callback-ов и лучший способ понять, какие квитанции принадлежат какому async-дереву транзакции | | Проверка готовности promise-работы | RPC [`query(call_function)`](https://docs.fastnear.com/ru/rpc/contract/call-function) | Опрашиваем view-метод контракта, который показывает отложенную promise-работу, например `staged_calls_for({ caller_id })`, с `finality: "final"` до появления yield-нутых promises | Подтверждает, что promise-работа действительно стала доступна до того, как resume-транзакция попыталась её продолжить | | Якорь запрошенного порядка | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Забираем обе транзакции по хешам, чтобы получить `block_height`, `block_hash`, `receiver_id`, индексированный статус исполнения и payload resume-шага | Даёт каждой транзакции устойчивую привязку к блоку и сохраняет точный порядок, который запросил шаг resume | | Снимки downstream-состояния | RPC [`query(call_function)`](https://docs.fastnear.com/ru/rpc/contract/call-function) | Читаем состояние контракта recorder до resume, а затем опрашиваем его после resume до появления ожидаемых записей | Доказывает реальный порядок callback-ов в состоянии контракта, а не только в метаданных дерева квитанций | | Переход по квитанции обратно к транзакции | Transactions API [`POST /v0/receipt`](https://docs.fastnear.com/ru/tx/receipt) | Используем любой интересный ID отложенной или последующей квитанции, чтобы снова привязать его к исходной транзакции | Позволяет быстро перейти от одной квитанции в графе обратно к более широкому рассказу о транзакции | | Реконструкция по блокам | Transactions API [`POST /v0/block`](https://docs.fastnear.com/ru/tx/block) | Загружаем включающий блок и каскадные блоки с включёнными квитанциями | Восстанавливает временную шкалу исполнения по блокам, когда уже понятно, какие высоты важны | | Контекст активности аккаунтов | Transactions API [`POST /v0/account`](https://docs.fastnear.com/ru/tx/account) | Запрашиваем историю вызовов функций для контрактов, участвовавших в каскаде, в том же окне | Даёт более удобное для человека представление истории аккаунтов, которое можно сопоставить с трассой | | Повторное чтение состояния с привязкой к блоку | RPC [`query(call_function)`](https://docs.fastnear.com/ru/rpc/contract/call-function) | Повторно запускаем нужный view-метод recorder с `block_id`, закреплённым на интересных высотах | Превращает итоговое состояние во временной ряд, чтобы можно было сказать не только что изменилось, но и когда именно | **Что должен включать полезный ответ** - одно итоговое предложение на простом языке, например: «первая транзакция создала три отложенных promises, вторая транзакция resume-нула их в порядке `beta -> alpha -> gamma`, а состояние recorder-контракта позже подтвердило тот же порядок callback-ов» - почему именно исходная promise-транзакция, а не только resume-транзакция, обычно является главной опорной транзакцией расследования - какой порядок callback-ов был запрошен и какой порядок downstream-эффектов в итоге наблюдался - в каких блоках стали видны изменения состояния - какие receipt-ы или account-pivot-ы стоит сохранить для следующего расследования ## Доказательства по SocialDB Эти примеры стартуют с читаемого состояния в NEAR Social и откатываются назад к точной записи, которая это состояние создала. ### Доказать, что `mike.near` установил `profile.name` в `Mike Purvis`, а затем восстановить транзакцию записи профиля в SocialDB Используйте это расследование, когда история звучит так: «я вижу `Mike Purvis` в профиле NEAR Social аккаунта `mike.near`, но хочу точно доказать, когда это поле было записано и какая транзакция его записала». Стратегия Начните с читаемого значения поля, а затем превратите его field-level block в один receipt и одну транзакцию записи. 01NEAR Social POST /get даёт текущее значение profile.name и field-level :block. 02POST /v0/block превращает этот блок в конкретный receipt и хеш транзакции mike.near -> social.near. 03POST /v0/transactions доказывает payload записи, а RPC call_function get подтверждает, что поле и сейчас разрешается так же. **Цель** - Начать с одного читаемого поля профиля в SocialDB, а затем восстановить точный receipt и исходную транзакцию, которые его записали. **Официальные ссылки** - [API и поверхность контракта SocialDB](https://github.com/NearSocial/social-db#api) - [Живая поверхность чтения NEAR Social](https://api.near.social) Этот сценарий следует тому же рецепту доказательства, что и расследование по подписке, но добавляет ещё один важный нюанс SocialDB: для исторического доказательства `:block` на уровне конкретного поля обычно точнее, чем `:block` у родительского объекта. В этом живом примере `mike.near/profile/name` был записан на блоке `78675795`, тогда как более широкий объект `mike.near/profile` позже сдвинулся на другой блок из-за изменений в соседних полях. Роль FastNear в этом сценарии — превратить этот блок уровня поля в receipt, затем в транзакцию и потом в читаемый payload записи. Для этого живого примера текущее значение `profile.name` равно `Mike Purvis`, блок записи SocialDB на уровне поля равен `78675795`, ID receipt — `2gbAmEEdcCNARuCorquXStftqvWFmPG2GSaMJXFw5qiN`, хеш исходной транзакции — `6zMb9L6rLNufZGUgCmeHTh5LvFsn3R92dPxuubH6MRsZ`, а внешний блок транзакции — `78675794`. | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Семантическое чтение поля | NEAR Social `POST /get` | Читаем `mike.near/profile/name` с включёнными метаданными блока | Даёт читаемое значение поля и опорный `:block` SocialDB на уровне поля, где это значение было записано | | Мост к receipt | Transactions API [`POST /v0/block`](https://docs.fastnear.com/ru/tx/block) | Используем блок уровня поля из SocialDB с `with_receipts: true`, а затем фильтруем receipt обратно до `mike.near -> social.near` | Превращает блок записи уровня поля в конкретный receipt и хеш исходной транзакции | | История транзакции | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Загружаем исходную транзакцию по хешу и декодируем payload первого `FunctionCall.args` | Доказывает, что базовая запись была вызовом `social.near set`, который нёс `profile.name` и окружающие поля профиля в одном payload | | Каноническое подтверждение текущего состояния | RPC [`query(call_function)`](https://docs.fastnear.com/ru/rpc/contract/call-function) | Напрямую вызываем `social.near get` с `final` | Подтверждает, что поле и сейчас имеет это значение, хотя предыдущие шаги уже доказали конкретную историческую запись | **Что должен включать полезный ответ** - разрешается ли `mike.near/profile/name` сейчас в `Mike Purvis` - высоту блока записи SocialDB на уровне поля (`78675795`) и объяснение, почему для этого вопроса этот якорь лучше, чем блок родительского профиля - конкретный ID receipt и хеш исходной транзакции за этой записью - доказательство того, что запись была вызовом `set`, который нёс `profile.name` и другие поля профиля в том же payload - различие между блоком исполнения receipt (`78675795`) и блоком включения внешней транзакции (`78675794`) #### Shell-сценарий доказательства поля профиля в NEAR Social Используйте этот сценарий, когда нужен конкретный и воспроизводимый путь доказательства: от читаемого поля профиля в NEAR Social до точной транзакции записи в SocialDB. **Что вы делаете** - Читаете текущее поле `profile.name` из NEAR Social и сохраняете блок записи SocialDB на уровне поля. - Переиспользуете эту высоту блока в FastNear block receipts, чтобы получить ID receipt и хеш транзакции. - Переиспользуете хеш транзакции в `POST /v0/transactions`, чтобы доказать, что payload был записью `social.near set`, несущей `profile.name`. - Завершаете каноническим RPC-подтверждением того, что поле всё ещё разрешается в то же значение на `final`. ```bash SOCIAL_API_BASE_URL=https://api.near.social TX_BASE_URL=https://tx.main.fastnear.com RPC_URL=https://rpc.mainnet.fastnear.com ACCOUNT_ID=mike.near PROFILE_FIELD=profile/name ``` 1. Прочитайте поле профиля из NEAR Social и сохраните блок записи SocialDB на уровне поля. ```bash PROFILE_BLOCK_HEIGHT="$( curl -s "$SOCIAL_API_BASE_URL/get" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$ACCOUNT_ID" \ --arg profile_field "$PROFILE_FIELD" '{ keys: [($account_id + "/" + $profile_field)], options: {with_block_height: true} }')" \ | tee /tmp/mike-profile-name.json \ | jq -r --arg account_id "$ACCOUNT_ID" \ '.[ $account_id ].profile.name[":block"]' )" jq --arg account_id "$ACCOUNT_ID" '{ current_name: .[$account_id].profile.name[""], field_block_height: .[$account_id].profile.name[":block"], parent_profile_block_height: .[$account_id].profile[":block"] }' /tmp/mike-profile-name.json # Ожидаемое current_name: "Mike Purvis" # Ожидаемая высота блока уровня поля: 78675795 ``` 2. Переиспользуйте эту высоту блока в FastNear block receipts и восстановите мост к receipt и транзакции. ```bash PROFILE_TX_HASH="$( curl -s "$TX_BASE_URL/v0/block" \ -H 'content-type: application/json' \ --data "$(jq -nc --argjson block_id "$PROFILE_BLOCK_HEIGHT" '{ block_id: $block_id, with_transactions: false, with_receipts: true }')" \ | tee /tmp/mike-profile-block.json \ | jq -r --arg account_id "$ACCOUNT_ID" ' first( .block_receipts[] | select(.predecessor_id == $account_id and .receiver_id == "social.near") | .transaction_hash )' )" jq --arg account_id "$ACCOUNT_ID" '{ profile_receipt: ( first( .block_receipts[] | select(.predecessor_id == $account_id and .receiver_id == "social.near") | { receipt_id, transaction_hash, block_height, tx_block_height } ) ) }' /tmp/mike-profile-block.json # Ожидаемый receipt ID: 2gbAmEEdcCNARuCorquXStftqvWFmPG2GSaMJXFw5qiN # Ожидаемый хеш транзакции: 6zMb9L6rLNufZGUgCmeHTh5LvFsn3R92dPxuubH6MRsZ ``` 3. Переиспользуйте полученный хеш транзакции в `POST /v0/transactions` и декодируйте payload записи SocialDB. ```bash curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$PROFILE_TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/mike-profile-transaction.json >/dev/null jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, included_block_height: .transactions[0].execution_outcome.block_height }, write_proof: ( .transactions[0].receipts[0].receipt.receipt.Action.actions[0].FunctionCall | { method_name, profile_name: (.args | @base64d | fromjson | .data["mike.near"].profile.name), description: (.args | @base64d | fromjson | .data["mike.near"].profile.description), tags: ( .args | @base64d | fromjson | .data["mike.near"].profile.tags | keys ) } ) }' /tmp/mike-profile-transaction.json ``` 4. Завершите каноническим подтверждением текущего состояния через raw RPC. ```bash SOCIAL_GET_ARGS_BASE64="$( jq -nr --arg account_id "$ACCOUNT_ID" --arg profile_field "$PROFILE_FIELD" '{ keys: [($account_id + "/" + $profile_field)] } | @base64' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg args_base64 "$SOCIAL_GET_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: "social.near", method_name: "get", args_base64: $args_base64, finality: "final" } }')" \ | tee /tmp/mike-profile-rpc.json >/dev/null jq --arg account_id "$ACCOUNT_ID" '{ finality: "final", current_name: ( .result.result | implode | fromjson | .[$account_id].profile.name ) }' /tmp/mike-profile-rpc.json ``` Этот последний шаг подтверждает, что поле и сейчас разрешается в `Mike Purvis`. Предыдущие шаги через NEAR Social и FastNear доказали, какая именно историческая запись установила это поле и какая транзакция несла эту запись. **Зачем нужен следующий шаг?** NEAR Social даёт семантическое значение поля. FastNear block receipts дают мост к конкретной записи. FastNear lookup транзакции превращает эту запись в читаемый payload профиля. RPC даёт каноническое подтверждение текущего состояния. ### Доказать, что `mike.near` подписался на `mob.near`, а затем восстановить транзакцию записи в SocialDB Используйте это расследование, когда история звучит так: «я вижу, что `mike.near` подписан на `mob.near`, но хочу точно доказать, когда именно была записана эта связь и какая транзакция её записала». Стратегия Начните с семантической связи подписки, а затем используйте блок записи как мост назад к одному receipt и одной транзакции. 01NEAR Social POST /get даёт читаемую связь подписки и SocialDB :block, где она была записана. 02POST /v0/block превращает этот блок записи в конкретный receipt и хеш транзакции за этой связью. 03POST /v0/transactions доказывает payload с graph.follow и index.graph, а RPC call_function get подтверждает, что связь и сейчас существует. **Цель** - Начать с читаемой связи подписки из NEAR Social, а затем восстановить точный receipt и исходную транзакцию, которые записали её в SocialDB. **Официальные ссылки** - [API и поверхность контракта SocialDB](https://github.com/NearSocial/social-db#api) - [Живая поверхность чтения NEAR Social](https://api.near.social) Читаемая связь подписки приходит из данных NEAR Social, а не из FastNear. Ключевой мост здесь — метаданные SocialDB `:block`: они указывают на блок, в котором исполнился receipt, записавший это значение. Этот блок не совпадает с блоком, в который была включена внешняя транзакция. Роль FastNear в этом сценарии — превратить эту высоту блока в receipt, затем в транзакцию и, наконец, в читаемую историю исполнения. Для этого живого примера текущая связь выглядит как `mike.near -> mob.near`, блок записи SocialDB равен `79574924`, ID receipt — `UiyiQaqHbkkMxkrB6rDkYr7X5EQLt8QG9MDATrES7Th`, хеш исходной транзакции — `FLLmTvFx9vCof79scy2uUviF5WwYmevkz9TZ8azPGVQb`, а внешний блок транзакции — `79574923`. | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Семантическое чтение связи | NEAR Social `POST /get` | Читаем `mike.near/graph/follow/mob.near` с включёнными метаданными блока | Даёт читаемую связь подписки и опорный `:block` из SocialDB, где это значение было записано | | Мост к receipt | Transactions API [`POST /v0/block`](https://docs.fastnear.com/ru/tx/block) | Используем высоту блока из SocialDB с `with_receipts: true`, а затем фильтруем receipt обратно до `mike.near -> social.near` | Превращает блок записи SocialDB в конкретный receipt и хеш исходной транзакции | | История транзакции | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Загружаем исходную транзакцию по хешу и декодируем payload первого `FunctionCall.args` | Доказывает, что базовая запись была вызовом `social.near set`, который записал и `graph.follow`, и записи `index.graph` | | Каноническое подтверждение текущего состояния | RPC [`query(call_function)`](https://docs.fastnear.com/ru/rpc/contract/call-function) | Напрямую вызываем `social.near get` с `final` | Подтверждает, что связь подписки существует и сейчас, хотя предыдущие шаги уже доказали конкретную историческую запись | **Что должен включать полезный ответ** - существует ли сейчас связь подписки `mike.near -> mob.near` - высоту блока записи SocialDB (`79574924`) и объяснение, почему это блок исполнения receipt - конкретный ID receipt и хеш исходной транзакции за этой записью - доказательство того, что запись была вызовом `set`, который нёс и `graph.follow.mob.near`, и соответствующую запись `index.graph` - различие между блоком исполнения receipt (`79574924`) и блоком включения внешней транзакции (`79574923`) #### Shell-сценарий доказательства подписки в NEAR Social Используйте этот сценарий, когда нужен конкретный и воспроизводимый путь доказательства: от читаемой связи подписки в NEAR Social до точной транзакции записи в SocialDB. **Что вы делаете** - Читаете текущую связь подписки из NEAR Social и сохраняете блок записи SocialDB. - Переиспользуете эту высоту блока в FastNear block receipts, чтобы получить ID receipt и хеш транзакции. - Переиспользуете хеш транзакции в `POST /v0/transactions`, чтобы доказать, что payload был записью `social.near set`. - Завершаете каноническим RPC-подтверждением того, что связь всё ещё существует на `final`. ```bash SOCIAL_API_BASE_URL=https://api.near.social TX_BASE_URL=https://tx.main.fastnear.com RPC_URL=https://rpc.mainnet.fastnear.com ACCOUNT_ID=mike.near TARGET_ACCOUNT_ID=mob.near ``` 1. Прочитайте связь подписки из NEAR Social и сохраните блок записи SocialDB. ```bash FOLLOW_BLOCK_HEIGHT="$( curl -s "$SOCIAL_API_BASE_URL/get" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg account_id "$ACCOUNT_ID" \ --arg target_account_id "$TARGET_ACCOUNT_ID" '{ keys: [($account_id + "/graph/follow/" + $target_account_id)], options: {with_block_height: true} }')" \ | tee /tmp/mike-follow-edge.json \ | jq -r --arg account_id "$ACCOUNT_ID" --arg target_account_id "$TARGET_ACCOUNT_ID" \ '.[ $account_id ].graph.follow[ $target_account_id ][":block"]' )" jq --arg account_id "$ACCOUNT_ID" --arg target_account_id "$TARGET_ACCOUNT_ID" '{ follow_edge: .[$account_id].graph.follow[$target_account_id][""], follow_block_height: .[$account_id].graph.follow[$target_account_id][":block"] }' /tmp/mike-follow-edge.json # Ожидаемая высота блока записи: 79574924 ``` 2. Переиспользуйте эту высоту блока в FastNear block receipts и восстановите мост к receipt и транзакции. ```bash FOLLOW_TX_HASH="$( curl -s "$TX_BASE_URL/v0/block" \ -H 'content-type: application/json' \ --data "$(jq -nc --argjson block_id "$FOLLOW_BLOCK_HEIGHT" '{ block_id: $block_id, with_transactions: false, with_receipts: true }')" \ | tee /tmp/mike-follow-block.json \ | jq -r --arg account_id "$ACCOUNT_ID" ' first( .block_receipts[] | select(.predecessor_id == $account_id and .receiver_id == "social.near") | .transaction_hash )' )" jq --arg account_id "$ACCOUNT_ID" '{ follow_receipt: ( first( .block_receipts[] | select(.predecessor_id == $account_id and .receiver_id == "social.near") | { receipt_id, transaction_hash, block_height, tx_block_height } ) ) }' /tmp/mike-follow-block.json # Ожидаемый receipt ID: UiyiQaqHbkkMxkrB6rDkYr7X5EQLt8QG9MDATrES7Th # Ожидаемый хеш транзакции: FLLmTvFx9vCof79scy2uUviF5WwYmevkz9TZ8azPGVQb ``` 3. Переиспользуйте полученный хеш транзакции в `POST /v0/transactions` и декодируйте payload записи SocialDB. ```bash curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$FOLLOW_TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/mike-follow-transaction.json >/dev/null jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, included_block_height: .transactions[0].execution_outcome.block_height }, write_proof: ( .transactions[0].receipts[0].receipt.receipt.Action.actions[0].FunctionCall | { method_name, follow_edge: (.args | @base64d | fromjson | .data["mike.near"].graph.follow["mob.near"]), index_graph: ( .args | @base64d | fromjson | .data["mike.near"].index.graph | fromjson | map(select(.value.accountId == "mob.near")) ) } ) }' /tmp/mike-follow-transaction.json ``` 4. Завершите каноническим подтверждением текущего состояния через raw RPC. ```bash SOCIAL_GET_ARGS_BASE64="$( jq -nr --arg account_id "$ACCOUNT_ID" --arg target_account_id "$TARGET_ACCOUNT_ID" '{ keys: [($account_id + "/graph/follow/" + $target_account_id)] } | @base64' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg args_base64 "$SOCIAL_GET_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: "social.near", method_name: "get", args_base64: $args_base64, finality: "final" } }')" \ | tee /tmp/mike-follow-rpc.json >/dev/null jq --arg account_id "$ACCOUNT_ID" --arg target_account_id "$TARGET_ACCOUNT_ID" '{ finality: "final", current_follow_edge: ( .result.result | implode | fromjson | .[$account_id].graph.follow[$target_account_id] ) }' /tmp/mike-follow-rpc.json ``` Этот последний шаг подтверждает, что связь подписки существует и сейчас. Предыдущие шаги через NEAR Social и FastNear доказали, какая именно историческая запись создала эту связь и какая транзакция несла эту запись. **Зачем нужен следующий шаг?** NEAR Social даёт семантическую связь. FastNear block receipts дают мост к конкретной записи. FastNear lookup транзакции превращает эту запись в читаемую историю. RPC даёт каноническое подтверждение текущего состояния. ### Какая транзакция записала `mob.near/widget/Profile`? Используйте это расследование, когда вопрос звучит так: «я уже знаю, что `mob.near/widget/Profile` существует прямо сейчас. Какая именно транзакция записала ту версию виджета, на которую я смотрю?» Это естественное tx-продолжение к более лёгкому RPC-сценарию про виджет и к provenance-NFT-сценарию. Задача здесь прямолинейная: - стартуем с собственного SocialDB-блока виджета - превращаем этот блок в один `mob.near -> social.near` receipt - восстанавливаем исходную транзакцию - декодируем payload `set` и доказываем, что он действительно нёс исходник виджета Стратегия Смотрите на write-block виджета как на весь мост сразу: блок в receipt, receipt в транзакцию, транзакцию в исходник. 01POST /v0/block начинает с блока виджета и сужает его до одного receipt mob.near -> social.near. 02POST /v0/transactions превращает этот receipt в один читаемый payload set с исходником виджета. 03RPC call_function get — это финальное подтверждение текущего состояния, что виджет и сейчас существует. **Цель** - Превратить один SocialDB-блок уровня виджета в один читаемый ответ: какая транзакция записала `mob.near/widget/Profile`, какой receipt исполнил запись и какой именно исходник виджета лежал в payload. **Официальные ссылки** - [API SocialDB и поверхность контракта](https://github.com/NearSocial/social-db#api) Для этого живого якоря: - аккаунт: `mob.near` - виджет: `Profile` - блок записи в SocialDB: `86494825` - receipt ID: `CZyjiBjphzE95tFEqi1YH6eLCLhqknaW4SQ5R4L6pkC6` - хеш исходной транзакции: `9QDupdK2ewMxfSvMmdGEkdBcVnoL4TexmXY2FnMRxfia` - внешний блок транзакции: `86494824` | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Мост от блока к receipt | Transactions API [`POST /v0/block`](https://docs.fastnear.com/ru/tx/block) | Берём блок `86494825` с `with_receipts: true`, а затем фильтруем его обратно до `mob.near -> social.near` | Превращает блок записи виджета в один конкретный receipt и один конкретный хеш транзакции | | История транзакции | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Загружаем исходную транзакцию и декодируем payload `FunctionCall.args` | Доказывает, что запись была вызовом `social.near set`, который нёс исходник `mob.near/widget/Profile` | | Каноническое подтверждение текущего состояния | RPC [`query(call_function)`](https://docs.fastnear.com/ru/rpc/contract/call-function) | Вызываем `social.near get` напрямую на `final` для того же пути виджета | Подтверждает, что виджет всё ещё существует сейчас, хотя предыдущие шаги уже доказали, какая историческая транзакция его записала | **Что должен включать полезный ответ** - высоту блока записи и объяснение, что это блок исполнения receipt, а не внешний блок транзакции - конкретный receipt ID и хеш исходной транзакции за этой записью виджета - доказательство, что payload записи был `set` с `mob.near/widget/Profile` - одно простое предложение вроде «`mob.near` записал `widget/Profile` в транзакции `9QDup...`, и в payload действительно лежал текущий исходник profile-виджета» #### Shell-сценарий доказательства записи виджета в NEAR Social ## Трассировка расчёта Это самое насыщенное расследование на странице: один живой расчёт NEAR Intents от верхнеуровневой транзакции до receipts и событий, которые его объясняют. Используйте этот сценарий, когда хотите превратить один блоковый якорь виджета в точную транзакцию, которая его записала. **Что вы делаете** - Стартуете с блока последней записи виджета. - Переиспользуете эту высоту в FastNear block receipts, чтобы получить receipt и мост к транзакции. - Переиспользуете хеш транзакции в `POST /v0/transactions`, чтобы декодировать записанный исходник виджета. - Завершаете сырым RPC-подтверждением, что виджет всё ещё существует сейчас. ```bash TX_BASE_URL=https://tx.main.fastnear.com RPC_URL=https://rpc.mainnet.fastnear.com ACCOUNT_ID=mob.near WIDGET_NAME=Profile WIDGET_BLOCK_HEIGHT=86494825 ``` 1. Начните с блока последней записи виджета и восстановите SocialDB-receipt вместе с хешем транзакции. ```bash WIDGET_TX_HASH="$( curl -s "$TX_BASE_URL/v0/block" \ -H 'content-type: application/json' \ --data "$(jq -nc --argjson block_id "$WIDGET_BLOCK_HEIGHT" '{ block_id: $block_id, with_transactions: false, with_receipts: true }')" \ | tee /tmp/mob-widget-block.json \ | jq -r --arg account_id "$ACCOUNT_ID" ' first( .block_receipts[] | select(.predecessor_id == $account_id and .receiver_id == "social.near") | .transaction_hash )' )" jq --arg account_id "$ACCOUNT_ID" '{ widget_write_receipt: ( first( .block_receipts[] | select(.predecessor_id == $account_id and .receiver_id == "social.near") | { receipt_id, transaction_hash, block_height, tx_block_height } ) ) }' /tmp/mob-widget-block.json # Ожидаемый receipt ID: CZyjiBjphzE95tFEqi1YH6eLCLhqknaW4SQ5R4L6pkC6 # Ожидаемый хеш транзакции: 9QDupdK2ewMxfSvMmdGEkdBcVnoL4TexmXY2FnMRxfia ``` 2. Переиспользуйте хеш транзакции и декодируйте payload `set` из SocialDB. ```bash curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$WIDGET_TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/mob-widget-transaction.json >/dev/null jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, included_block_height: .transactions[0].execution_outcome.block_height }, write_proof: ( .transactions[0].transaction.actions[0].FunctionCall | { method_name, widget_source_head: ( .args | @base64d | fromjson | .data["mob.near"].widget.Profile[""] | split("\n")[0:12] ) } ) }' /tmp/mob-widget-transaction.json ``` Во втором шаге и происходит главный payoff. Тут вы уже не просто говорите «в том блоке что-то обновило SocialDB». Тут вы доказываете, что транзакция `9QDup...` вызвала `social.near set` и пронесла в `args` настоящий исходник `mob.near/widget/Profile`. 3. Завершите каноническим подтверждением текущего состояния через сырой RPC. ```bash SOCIAL_GET_ARGS_BASE64="$( jq -nr --arg account_id "$ACCOUNT_ID" --arg widget_name "$WIDGET_NAME" '{ keys: [($account_id + "/widget/" + $widget_name)] } | @base64' )" curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg args_base64 "$SOCIAL_GET_ARGS_BASE64" '{ jsonrpc: "2.0", id: "fastnear", method: "query", params: { request_type: "call_function", account_id: "social.near", method_name: "get", args_base64: $args_base64, finality: "final" } }')" \ | tee /tmp/mob-widget-rpc.json >/dev/null jq --arg account_id "$ACCOUNT_ID" --arg widget_name "$WIDGET_NAME" '{ finality: "final", current_widget_head: ( .result.result | implode | fromjson | .[$account_id].widget[$widget_name] | split("\n")[0:5] ) }' /tmp/mob-widget-rpc.json ``` Этот последний шаг подтверждает, что виджет всё ещё существует сейчас. А предыдущие шаги по блоку и транзакции доказывают, какая именно историческая запись его создала. **Зачем нужен следующий шаг?** Блок записи виджета даёт вам мост. FastNear block receipts превращают этот мост в один receipt и один хеш транзакции. FastNear transaction lookup превращает хеш в читаемое доказательство записи. RPC после этого подтверждает, что виджет всё ещё существует сейчас. ### Проследить один расчёт NEAR Intents и показать, что именно произошло Используйте это расследование, когда история звучит так: «у меня есть одна транзакция `intents.near`. Покажи, что реально произошло в сети, какие контракты участвовали и какие события это подтверждают». Стратегия Смотрите на один расчёт как на читаемую трассу, а не как на теорию протокола с первой строки. 01POST /v0/transactions даёт каркас расчёта: входную точку, первые downstream-контракты и ранние логи. 02POST /v0/block переиспользует тот же якорь, когда нужен контекст включающего блока вокруг этого расчёта. 03RPC EXPERIMENTAL_tx_status нужен там, где уже требуется канонический DAG по receipt и имена событий, которые доказывают реальное движение активов. **Цель** - Начать с одной фиксированной транзакции `intents.near` и превратить её в читаемую историю расчёта: какой метод запустил расчёт, какие downstream-контракты появились дальше и какие семейства событий объясняют движение активов. **Официальные ссылки** - [Обзор NEAR Intents](https://docs.near.org/chain-abstraction/intents/overview) - [Типы intent и исполнение](https://docs.near-intents.org/integration/verifier-contract/intent-types-and-execution) - [Абстракция аккаунтов](https://docs.near-intents.org/integration/verifier-contract/account-abstraction) Для живой трассировки ниже используйте этот фиксированный якорь расчёта из mainnet, зафиксированный **18 апреля 2026 года**: - хеш транзакции: `4cfei8p4HBeNxJnCLjfShhDYGmXZwFVwFgY1sYpyygE7` - аккаунт `signer` и `receiver`: `intents.near` - высота включающего блока: `194573310` Быстрая полезная модель здесь простая: - `intents.near` выполняет входную точку расчёта - последующие receipt расходятся по контрактам, которые реально переводят или выводят активы - журналы событий показывают, какие действия расчёта случились, через имена вроде `token_diff`, `intents_executed`, `mt_transfer` и `mt_withdraw` Для этого конкретного расчёта короткий человеческий ответ уже неплохой: - `intents.near` вызвал `execute_intents` - downstream receipt ушли в `v2_1.omni.hot.tg` и `bridge-refuel.hot.tg` - трасса выдала события `token_diff`, `intents_executed`, `mt_transfer`, `mt_withdraw` и `mt_burn` Если нужен протокольный фон, базовая форма сопоставления здесь — это двухсторонний `token_diff` intent: одна сторона подписывает желаемую разницу по активам, вторая сторона подписывает противоположную разницу, а затем совпавшая пара отправляется на расчёт. Но для рабочего расследования обычно понятнее начать с одной реальной транзакции расчёта и читать доказательства прямо с цепочки. ```mermaid flowchart LR T["Одна mainnet-транзакция
4cfei8p4..."] --> I["intents.near
execute_intents"] I --> R["Последующие receipt"] R --> C["Подключаются другие контракты"] R --> E["Появляются журналы событий"] E --> TD["token_diff"] E --> IE["intents_executed"] E --> MT["mt_transfer / mt_withdraw"] ``` Публичных FastNear-поверхностей уже достаточно, чтобы ответить на практический вопрос: | Поверхность | Эндпоинт | Как используем | Зачем используем | | --- | --- | --- | --- | | Каркас расчёта | Transactions API [`POST /v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | Начинаем с фиксированного хеша транзакции и печатаем основную транзакцию плюс первые последующие receipt | Даёт самый быстрый читаемый ответ на вопрос «во что этот расчёт пошёл дальше?» | | Контекст блока | Transactions API [`POST /v0/block`](https://docs.fastnear.com/ru/tx/block) | Загружаем включающий блок с receipt и затем фильтруем его обратно по тому же хешу транзакции | Показывает, в какой блок попал расчёт и какие receipt этой транзакции видны в блоке | | Каноническое доказательство по receipt и событиям | RPC [`EXPERIMENTAL_tx_status`](https://docs.fastnear.com/ru/rpc/transaction/experimental-tx-status) | Запрашиваем ту же транзакцию с `wait_until: "FINAL"` и смотрим `receipts_outcome` плюс логи `EVENT_JSON` | Даёт протокольно-канонический DAG, `executor_id` и имена событий, которые объясняют, что реально сделал расчёт | **Что должен включать полезный ответ** - какую входную точку расчёта вы увидели на `intents.near` - какие downstream-контракты и методы появились сразу после неё - какие семейства событий выпустила трассировка - одно итоговое предложение простым языком о том, что произошло Этот пример намеренно остаётся на публичных FastNear-поверхностях. NEAR Intents Explorer и 1Click Explorer тоже полезны, но их Explorer API защищён JWT и не подходит как дефолтный публичный сценарий в документации. #### Shell-сценарий расчёта NEAR Intents Используйте этот сценарий, когда нужен один конкретный расчёт через `intents.near`, который можно сразу разобрать через публичные FastNear-эндпоинты. **Что вы делаете** - Получаете читаемую историю расчёта через Transactions API. - Переиспользуете хеш включающего блока в `POST /v0/block`, чтобы исследовать сам блок. - Подтверждаете канонический DAG по receipt и семейства событий через `EXPERIMENTAL_tx_status`. ```bash TX_BASE_URL=https://tx.main.fastnear.com RPC_URL=https://rpc.mainnet.fastnear.com INTENTS_TX_HASH=4cfei8p4HBeNxJnCLjfShhDYGmXZwFVwFgY1sYpyygE7 INTENTS_SIGNER_ID=intents.near ``` 1. Начните с самой транзакции расчёта и восстановите первый читаемый поток последующих receipt. ```bash INTENTS_BLOCK_HASH="$( curl -s "$TX_BASE_URL/v0/transactions" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg tx_hash "$INTENTS_TX_HASH" '{tx_hashes: [$tx_hash]}')" \ | tee /tmp/intents-transaction.json \ | jq -r '.transactions[0].execution_outcome.block_hash' )" jq '{ transaction: { hash: .transactions[0].transaction.hash, signer_id: .transactions[0].transaction.signer_id, receiver_id: .transactions[0].transaction.receiver_id, included_block_height: .transactions[0].execution_outcome.block_height }, receipt_flow: [ .transactions[0].receipts[:6][] | { receipt_id: .receipt.receipt_id, receiver_id: .receipt.receiver_id, block_height: .execution_outcome.block_height, methods: ( [.receipt.receipt.Action.actions[]?.FunctionCall.method_name] | map(select(. != null)) ), first_log: (.execution_outcome.outcome.logs[0] // null) } ] }' /tmp/intents-transaction.json ``` Этот первый шаг уже даёт сильный операторский ответ: `intents.near` выполнил транзакцию расчёта, а ранние последующие receipt показывают, какие контракты вошли в каскад сразу после этого. 2. Переиспользуйте хеш блока, чтобы исследовать включающий блок с включёнными receipt. ```bash curl -s "$TX_BASE_URL/v0/block" \ -H 'content-type: application/json' \ --data "$(jq -nc --arg block_id "$INTENTS_BLOCK_HASH" '{ block_id: $block_id, with_receipts: true, with_transactions: false }')" \ | tee /tmp/intents-block.json >/dev/null jq --arg tx_hash "$INTENTS_TX_HASH" '{ block_height: .block.block_height, block_hash: .block.block_hash, tx_receipts: [ .block_receipts[] | select(.transaction_hash == $tx_hash) | { receipt_id, predecessor_id, receiver_id, block_height } ] }' /tmp/intents-block.json ``` 3. Подтвердите канонический DAG по receipt и извлеките семейства событий через RPC. ```bash curl -s "$RPC_URL" \ -H 'content-type: application/json' \ --data "$(jq -nc \ --arg tx_hash "$INTENTS_TX_HASH" \ --arg sender_account_id "$INTENTS_SIGNER_ID" '{ jsonrpc: "2.0", id: "fastnear", method: "EXPERIMENTAL_tx_status", params: { tx_hash: $tx_hash, sender_account_id: $sender_account_id, wait_until: "FINAL" } }')" \ | tee /tmp/intents-rpc.json >/dev/null jq '{ final_execution_status: .result.final_execution_status, receipts_outcome: [ .result.receipts_outcome[:6][] | { receipt_id: .id, executor_id: .outcome.executor_id, first_log: (.outcome.logs[0] // null) } ] }' /tmp/intents-rpc.json jq -r ' .result.receipts_outcome[] | .outcome.logs[] | select(startswith("EVENT_JSON:")) | capture("event\":\"(?[^\"]+)\"").event ' /tmp/intents-rpc.json | sort -u ``` **Зачем нужен следующий шаг?** `POST /v0/transactions` показывает, во что расчёт пошёл дальше. `POST /v0/block` показывает, где этот расчёт оказался в контексте блока. `EXPERIMENTAL_tx_status` — это каноническое продолжение, когда нужны `executor_id`, структура DAG по receipt и имена событий, чтобы объяснить, что реально произошло. ## Частые задачи ### Найти одну транзакцию **Начните здесь** - [Transactions by Hash](https://docs.fastnear.com/ru/tx/transactions), когда идентификатор транзакции уже известен. **Следующая страница при необходимости** - [Receipt Lookup](https://docs.fastnear.com/ru/tx/receipt), если важной стала последующая квитанция. - [Block](https://docs.fastnear.com/ru/tx/block), если нужен контекст блока. - [Transaction Status](https://docs.fastnear.com/ru/rpc/transaction/tx-status), если требуется каноническое подтверждение через RPC. **Остановитесь, когда** - Уже можно объяснить результат, затронутые аккаунты и главный вывод по исполнению. **Переходите дальше, когда** - Пользователь спрашивает о точной RPC-семантике статуса или поведения отправки. - Одного поиска по транзакции недостаточно, чтобы объяснить последующее исполнение. ### Исследовать квитанцию **Начните здесь** - [Receipt Lookup](https://docs.fastnear.com/ru/tx/receipt), когда ID квитанции — лучший якорь для расследования. **Следующая страница при необходимости** - [Transactions by Hash](https://docs.fastnear.com/ru/tx/transactions), чтобы связать квитанцию с исходной транзакцией. - [Account History](https://docs.fastnear.com/ru/tx/account), если нужно увидеть активность вокруг одного из затронутых аккаунтов. **Остановитесь, когда** - Уже можно объяснить, где квитанция находится в цепочке исполнения и почему она важна. **Переходите дальше, когда** - Нужна точная каноническая проверка сверх индексированного вида квитанции. Переходите к [RPC Reference](https://docs.fastnear.com/ru/rpc). - Вопрос расширяется от одной квитанции к более широкому историческому расследованию. ### Посмотреть недавнюю активность аккаунта **Начните здесь** - [Account History](https://docs.fastnear.com/ru/tx/account) для ленты активности по аккаунту. **Следующая страница при необходимости** - [Transactions by Hash](https://docs.fastnear.com/ru/tx/transactions) для конкретной транзакции из ленты. - [Receipt Lookup](https://docs.fastnear.com/ru/tx/receipt), если фокус смещается на одну квитанцию. **Остановитесь, когда** - История аккаунта уже отвечает на вопрос о том, что этот аккаунт делал. **Переходите дальше, когда** - Пользователя интересуют только переводы, а не более широкий контекст исполнения. Переходите к [Transfers API](https://docs.fastnear.com/ru/transfers). - Пользователю нужно точное текущее состояние или активы, а не история. Переходите к [RPC Reference](https://docs.fastnear.com/ru/rpc) или [FastNear API](https://docs.fastnear.com/ru/api). ### Восстановить ограниченное окно по блокам **Начните здесь** - [Blocks](https://docs.fastnear.com/ru/tx/blocks) для ограниченного просмотра диапазона блоков. - [Block](https://docs.fastnear.com/ru/tx/block), когда известен точный блок, который нужно исследовать. **Следующая страница при необходимости** - [Transactions by Hash](https://docs.fastnear.com/ru/tx/transactions), чтобы провалиться в конкретный элемент из окна блоков. - [Receipt Lookup](https://docs.fastnear.com/ru/tx/receipt), если одной квитанции достаточно для следующего шага расследования. **Остановитесь, когда** - Ограниченное историческое окно уже отвечает на вопрос без перехода к более низкоуровневым протокольным деталям. **Переходите дальше, когда** - Пользователю нужны точные канонические поля блока или финальность транзакции. Переходите к [RPC Reference](https://docs.fastnear.com/ru/rpc). - На самом деле нужен polling по самым свежим блокам, а не индексированная история. Переходите к [NEAR Data API](https://docs.fastnear.com/ru/neardata). ## Частые ошибки - Пытаться отправлять транзакцию через history API вместо сырого RPC. - Использовать Transactions API, когда пользователю нужны только текущие балансы или активы. - Слишком рано уходить в сырой RPC до того, как индексированная история уже ответила на читаемый вопрос «что произошло?». - Повторно использовать непрозрачные токены пагинации с другим эндпоинтом или другим набором фильтров. ## Полезные связанные страницы - [Transactions API](https://docs.fastnear.com/ru/tx) - [RPC Reference](https://docs.fastnear.com/ru/rpc) - [FastNear API](https://docs.fastnear.com/ru/api) - [NEAR Data API](https://docs.fastnear.com/ru/neardata) - [Choosing the Right Surface](https://docs.fastnear.com/ru/agents/choosing-surfaces) - [Agent Playbooks](https://docs.fastnear.com/ru/agents/playbooks) --- ## Berry Club: как восстанавливать исторические доски - HTML-маршрут: https://docs.fastnear.com/ru/tx/examples/berry-club - Markdown-маршрут: https://docs.fastnear.com/ru/tx/examples/berry-club.md **Источник:** [https://docs.fastnear.com/ru/tx/examples/berry-club](https://docs.fastnear.com/ru/tx/examples/berry-club) {/* FASTNEAR_AI_DISCOVERY: Этот подробный разбор показывает, как восстанавливать доски Berry Club через FastNear. Он отделяет текущее состояние из get_lines от исторического разбора через диапазоны блоков, историю аккаунта, раскрытие транзакций и проигрывание draw-аргументов. */} # Berry Club: как восстанавливать исторические доски Используйте этот разбор, когда вопрос звучит так: «как Berry Club выглядел в определённую эпоху и какие `draw`-вызовы сделали доску именно такой?» Это read-only разбор из семейства Transactions examples. Если нужна только доска прямо сейчас, используйте `get_lines` и остановитесь. Если нужно объяснить, как доска пришла к такому виду, переключайтесь на историю блоков, историю аккаунта, раскрытые `draw`-вызовы и проигрывание. Стратегия Сначала прочитайте живую доску, затем ограничьте эпоху и только после этого проигрывайте draw-вызовы, которые её объясняют. 01RPC call_function get_lines даёт текущую доску 50x50 и показывает, как выглядит «сейчас». 02POST /v0/blocks вместе с POST /v0/account ограничивают одну эпоху и дают кандидатные хеши draw. 03POST /v0/transactions раскрывает эти draw-вызовы, чтобы их можно было проиграть в исторические контрольные точки. Держите рядом: - [js.fastnear.com](https://js.fastnear.com/) - [fastnear/js-monorepo](https://github.com/fastnear/js-monorepo) - [Transactions API: история аккаунта](https://docs.fastnear.com/ru/tx/account) - [Transactions API: транзакции по хешу](https://docs.fastnear.com/ru/tx/transactions) - [Transactions API: диапазон блоков](https://docs.fastnear.com/ru/tx/blocks) - [RPC: call_function](https://docs.fastnear.com/ru/rpc/contract/call-function) В этом руководстве история Berry Club разбирается только на mainnet. Снимки ниже собраны из воспроизводимых данных mainnet, которые уже сохранены в этом репозитории. ## Короткая версия Berry Club даёт чистый view текущего состояния через `get_lines`, но не даёт готового эндпоинта вида «доска на блоке N». Из-за этого задача делится на две части: - используйте RPC `call_function`, когда вопрос звучит как «как доска выглядит сейчас?» - используйте индексированную историю, когда вопрос звучит как «какие записи привели к этой доске?» - используйте архивный RPC только тогда, когда нужно напрямую материализовать уже известную контрольную точку ```mermaid flowchart TD A["RPC call_function: get_lines"] --> B["Текущая доска 50x50"] C["Transactions API: /v0/blocks"] --> D["Ограничить эпоху"] D --> E["/v0/account для berryclub.ek.near"] E --> F["Кандидатные хеши draw-транзакций"] F --> G["Раскрытие через /v0/transactions"] G --> H["Проигрывание draw-записей в историческую доску"] ``` ## Почему Berry Club хорошо учит истории в NEAR Berry Club удобно показывает обе стороны задачи: - чистое чтение текущего состояния через `get_lines` - длинную историю вызовов `draw` с обычными аргументами `FunctionCall` - формат доски, который легко декодировать и рендерить обычным JavaScript Это очень NEAR-подобная форма: один view-метод для текущего состояния, один write-метод для изменений и индексированная история, когда нужно объяснить, как это состояние вообще появилось. ## 1. Сначала прочитайте текущую доску Живое демо использует `berryclub.ek.near` и читает доску через view-вызов `get_lines`: ```javascript await near.view({ contractId: 'berryclub.ek.near', methodName: 'get_lines', args: { lines: [...Array(50).keys()], }, }); ``` Это путь текущего состояния. Он не отвечает на вопрос, как доска пришла к такому виду. | Вопрос | Лучшая поверхность | Почему | | --- | --- | --- | | как доска выглядит сейчас? | [RPC `call_function`](https://docs.fastnear.com/ru/rpc/contract/call-function) | контракт уже отдаёт текущее состояние через `get_lines` | | какие `draw` были в этой эпохе? | [`/v0/account`](https://docs.fastnear.com/ru/tx/account) + [`/v0/transactions`](https://docs.fastnear.com/ru/tx/transactions) | индексированная история даёт ограниченный набор записей и раскрытые аргументы | | как доска выглядела в известной контрольной точке? | архивный RPC или полное проигрывание | можно напрямую материализовать состояние из архива или восстановить его самому по историческим записям | ## 2. Как декодировать `get_lines` в сетку 50x50 Полезная часть Berry Club-разметки из `js.fastnear.com` — это декодер строк: - каждая строка приходит в base64 - её нужно декодировать в байты - первые 4 байта нужно пропустить - дальше цвета читаются как 32-битные little-endian значения каждые 8 байт ```javascript function decodeLine(encodedLine) { const bytes = Buffer.from(encodedLine, 'base64'); const colors = []; for (let offset = 4; offset < bytes.length; offset += 8) { colors.push(bytes.readUInt32LE(offset) & 0xffffff); } return colors; } ``` Примените это ко всем 50 строкам — и получите полную сетку 50x50, готовую к рендерингу. ## 3. Ограничьте эпоху, которую хотите изучить Сначала ограничьте эпоху, прежде чем искать draw-записи. Проверочный снимок запуска в этом репозитории находится на блоке `21898354`, а средний снимок — на блоке `97601515`. Сначала зафиксируйте ближайший диапазон блоков: ```bash curl -sS https://tx.main.fastnear.com/v0/blocks \ -H 'content-type: application/json' \ --data '{ "from_block_height": 21898350, "to_block_height": 21898355, "desc": false, "limit": 5 }' ``` Затем переключитесь на историю аккаунта и запросите активность Berry Club внутри ограниченного диапазона блоков: ```bash curl -sS https://tx.main.fastnear.com/v0/account \ -H 'content-type: application/json' \ --data '{ "account_id": "berryclub.ek.near", "is_function_call": true, "is_receiver": true, "is_real_receiver": true, "from_tx_block_height": 97576515, "to_tx_block_height": 97601516, "desc": true, "limit": 40 }' ``` Здесь полезна именно такая последовательность: - `/v0/blocks` помогает понять соседство по высотам блоков - `/v0/account` возвращает кандидатные хеши транзакций Berry Club внутри этого диапазона ## 4. Раскройте транзакции и оставьте только `draw` Когда кандидатные хеши уже есть, раскройте их и оставьте только верхнеуровневые вызовы `draw`, где получатель — `berryclub.ek.near`. Аргументы вызова — это обычные данные `FunctionCall` вида `{ pixels: [...] }`: ```bash curl -sS https://tx.main.fastnear.com/v0/transactions \ -H 'content-type: application/json' \ --data '{ "tx_hashes": [ "Hq5qwsuiM2emJrqczWM9awCa7o6sTBYqYpcifUX2SUhQ", "8tBip5M2TrozhSyepAA3tYXpyKooi5t7b9c64wXjFvfL" ] }' | jq '.transactions[] | select(.transaction.receiver_id == "berryclub.ek.near") | .transaction.actions[]?.FunctionCall | select(.method_name == "draw") | { method_name, args: (.args | @base64d | fromjson) }' ``` Это даёт всё, что нужно для проигрывания: - какая транзакция записывала пиксели - какие координаты были затронуты - какие цвета были записаны ## 5. Проиграйте исторические `draw`-вызовы в доску Для полного проигрывания держите в памяти массив 50x50 и применяйте раскрытые транзакции `draw` от старых к новым. ```javascript const board = Array.from({ length: 50 }, () => Array(50).fill(0)); function applyDraw(boardState, drawArgs) { for (const pixel of drawArgs.pixels) { if (pixel.x < 0 || pixel.x >= 50 || pixel.y < 0 || pixel.y >= 50) { continue; } boardState[pixel.y][pixel.x] = pixel.color; } } for (const drawTx of drawTransactionsOldestFirst) { applyDraw(board, drawTx.args); } ``` Важно не путать два разных пути: - `get_lines` — это текущее состояние - `tx/account` плюс `tx/transactions` — это материал для проигрывания ## 6. Готовые контрольные точки по эпохам Галерея ниже использует уже сохранённые данные снимков, собранные из mainnet-истории Berry Club: - `launch` — последний успешный `draw` в пределах первых 24 часов после первого успешного draw - `mid` — последний успешный `draw` не позже средней временной точки всей истории Berry Club - `recent` — последний успешный `draw`, который увидел скрипт при пересборке снимков Галерея снимков: контрольные точки launch, mid и recent из сохранённого `src/data/berryClubSnapshots.json`. Сейчас эти снимки привязаны к таким транзакциям: - `launch`: `BDNFpCpLXjBrgjR6z6wCZmB9EWdHnVMdqau3iTWTRE5H` на блоке `21898354` - `mid`: `Hq5qwsuiM2emJrqczWM9awCa7o6sTBYqYpcifUX2SUhQ` на блоке `97601515` - `recent`: `8tBip5M2TrozhSyepAA3tYXpyKooi5t7b9c64wXjFvfL` на блоке `194588754` ## Куда идти за подписанными взаимодействиями Эта страница должна оставаться в режиме чтения. Если нужны живые подписанные сценарии для `draw` и `buy_tokens`, переходите сюда: - [js.fastnear.com](https://js.fastnear.com/) - [Berry Club example в fastnear/js-monorepo](https://github.com/fastnear/js-monorepo/tree/main/examples/static/berryclub) Именно там уместны кошелёк и подписанные действия. Эта страница посвящена историческому восстановлению. --- ## OutLayer: как проследить один запрос от вызова до callback - HTML-маршрут: https://docs.fastnear.com/ru/tx/examples/outlayer - Markdown-маршрут: https://docs.fastnear.com/ru/tx/examples/outlayer.md **Источник:** [https://docs.fastnear.com/ru/tx/examples/outlayer](https://docs.fastnear.com/ru/tx/examples/outlayer) {/* FASTNEAR_AI_DISCOVERY: Этот подробный разбор показывает, как использовать FastNear RPC и Transactions API, чтобы разбирать живое исполнение OutLayer в терминах NEAR. Он отделяет видимый request/worker/callback-поток, который уже можно трассировать через FastNear, от задокументированного внутреннего пути yield/resume и CKD/MPC. */} # OutLayer: как проследить один запрос от вызова до callback Используйте этот разбор, когда вопрос звучит так: «я вижу OutLayer в цепочке. Какая транзакция открыла работу, какая более поздняя транзакция пришла от воркера и где проявились callback, списание и возврат средств?» Это продвинутый разбор асинхронного исполнения в семействе Transactions examples. Держите NEAR-рамку первой: один `FunctionCall` со стороны вызывающего, одна более поздняя транзакция со стороны воркера, и квитанции только тогда, когда действительно нужно разбирать фазу завершения. Стратегия Сначала найдите caller-транзакцию и worker-транзакцию, а receipts подключайте только тогда, когда настоящим вопросом становится finish-путь. 01POST /v0/account — самый быстрый способ найти caller-side и worker-side хеши из одной и той же истории. 02POST /v0/transactions раскрывает оба хеша и показывает читаемые request, worker-resolution и ранние логи. 03Только после этого имеет смысл разбирать callback, списание и refund на уровне receipts или уходить в точные RPC-проверки идентичности. Полезные ссылки: - [История аккаунта](https://docs.fastnear.com/ru/tx/account) - [Транзакции по хешу](https://docs.fastnear.com/ru/tx/transactions) - [Просмотр аккаунта](https://docs.fastnear.com/ru/rpc/account/view-account) - [NEAR Integration в OutLayer](https://outlayer.fastnear.com/docs/near-integration) - [Secrets / CKD в OutLayer](https://outlayer.fastnear.com/docs/secrets) ## Короткая версия Если вы видите активность OutLayer в цепочке, практические вопросы обычно такие: - какая транзакция создала асинхронную единицу работы? - какая более поздняя транзакция пришла от воркера? - где именно проявились callback, списание и возврат средств? Это не вопрос о текущем состоянии. Это вопрос об истории исполнения. Полезный ход через FastNear — связать одну транзакцию `request_execution` со стороны вызывающего с одной транзакцией разрешения со стороны воркера, а к receipt переходить только на этапе завершения. ```mermaid sequenceDiagram autonumber participant Caller as "Вызывающая сторона" participant Outlayer as "outlayer.*" participant Worker as "worker.outlayer.*" participant Near as "исполняющая среда NEAR" Caller->>Outlayer: FunctionCall request_execution Outlayer-->>Near: создаёт асинхронную работу и контекст учёта Worker->>Outlayer: resolve_execution или submit_execution_output_and_resolve Outlayer-->>Near: логи завершения, путь callback, списание, возвраты ``` Всё это уже видно сегодня через FastNear и RPC. ## 1. Раскройте одну транзакцию запроса и одно разрешение воркера Если хотите сразу увидеть всю форму потока, начните с уже известной пары хешей и раскройте оба. Эта пара работала 18 апреля 2026 года: - `AJgn2DB7BaD3487wXii8rGM648eqvkFDqJ1zXCxfuRk4` — `request_execution` со стороны вызывающего - `AVbxfPyN5P1ryFh7HPstWbjiSantPYWfMpiwKcJ7hXTs` — `submit_execution_output_and_resolve` со стороны воркера ```bash title="Раскройте хеш запроса и хеш разрешения воркера" curl -sS https://tx.main.fastnear.com/v0/transactions \ -H 'content-type: application/json' \ --data '{ "tx_hashes":[ "AJgn2DB7BaD3487wXii8rGM648eqvkFDqJ1zXCxfuRk4", "AVbxfPyN5P1ryFh7HPstWbjiSantPYWfMpiwKcJ7hXTs" ] }' | jq '.transactions[] | { hash: .transaction.hash, signer: .transaction.signer_id, receiver: .transaction.receiver_id, actions: [.transaction.actions[] | keys[0]], logs: (.receipts[0].execution_outcome.outcome.logs[:2]) }' ``` В этом выборочном выводе: - хеш запроса шёл от `solarflux.near` к `outlayer.near` - в логах фигурировал разрешённый проект: `zavodil.near/near-email` - хеш воркера шёл от `worker.outlayer.near` к `outlayer.near` - в логах воркера было `Stored pending output` и `Resolving execution ... (combined flow)` Этого уже достаточно для видимой истории в терминах NEAR: исходный `FunctionCall` создал асинхронную единицу работы, позже воркер вернулся как отдельный подписант, а контракт разрешил результат в цепочке. Если копировать с этой страницы только одну команду, то именно эту. ## 2. Найдите два нужных хеша сами Если пары хешей у вас ещё нет, переключитесь на [Transactions API: история аккаунта](https://docs.fastnear.com/ru/tx/account). ```bash title="Недавняя mainnet-активность для outlayer.near" curl -sS https://tx.main.fastnear.com/v0/account \ -H 'content-type: application/json' \ --data '{"account_id":"outlayer.near","desc":true}' \ | jq '{txs_count, first: .account_txs[0]}' ``` 18 апреля 2026 года эта поверхность показывала более 5 000 трассированных транзакций для `outlayer.near`, а самый свежий выборочный хеш был таким: ```text AVbxfPyN5P1ryFh7HPstWbjiSantPYWfMpiwKcJ7hXTs ``` Этот хеш не был исходным пользовательским запросом. Это уже было последующее действие со стороны воркера. Именно поэтому история аккаунта — правильный первый поиск: здесь задача не в том, чтобы описать контракт целиком, а в том, чтобы найти две конкретные транзакции в одной истории исполнения. ```mermaid flowchart TD A["Transactions API: /v0/account для outlayer.*"] --> B["Найдите недавние хеши транзакций"] B --> C["Хеш request_execution со стороны вызывающего"] B --> D["Хеш разрешения со стороны воркера"] C --> E["Раскройте оба через /v0/transactions"] D --> E E --> F["Проверьте логи, request_id, project/source, callback-receipt, списание и возвраты"] ``` ## 3. Разберите фазу callback и возврата средств Если нужно пройти дальше, чем просто «воркер вернул результат», посмотрите список receipt у раскрытой воркерской транзакции. ```bash title="Показать последующие действия на уровне receipt для разрешения воркером" curl -sS https://tx.main.fastnear.com/v0/transactions \ -H 'content-type: application/json' \ --data '{"tx_hashes":["AVbxfPyN5P1ryFh7HPstWbjiSantPYWfMpiwKcJ7hXTs"]}' \ | jq '.transactions[0] | { hash: .transaction.hash, receipts: [ .receipts[] | { predecessor: .receipt.predecessor_id, receiver: .receiver_id, actions: [.receipt.receipt.Action.actions[] | keys[0]], logs: .execution_outcome.outcome.logs } ] }' ``` На что смотреть: - `FunctionCall:on_execution_response` - логи списания вроде `[[yNEAR charged: "..."]]` - события завершения вроде `execution_completed` - последующие receipt `Transfer` Здесь понятие receipt как раз становится правильной абстракцией: не в начале урока, а тогда, когда уже отлаживается реальный путь завершения. ## 4. Подтвердите контракт, если нужна точная проверка Если нужна точная проверка аккаунта и `code_hash`, используйте сырой RPC. Это шаг для проверки идентичности, а не для восстановления истории исполнения. ```bash title="Mainnet: view_account для outlayer.near" curl -sS https://rpc.mainnet.fastnear.com \ -H 'content-type: application/json' \ --data '{ "jsonrpc":"2.0", "id":"1", "method":"query", "params":{ "request_type":"view_account", "finality":"final", "account_id":"outlayer.near" } }' | jq '.result | {amount, locked, code_hash, storage_usage}' ``` ```bash title="Testnet: view_account для outlayer.testnet" curl -sS https://rpc.testnet.fastnear.com \ -H 'content-type: application/json' \ --data '{ "jsonrpc":"2.0", "id":"1", "method":"query", "params":{ "request_type":"view_account", "finality":"final", "account_id":"outlayer.testnet" } }' | jq '.result | {amount, locked, code_hash, storage_usage}' ``` По состоянию на 18 апреля 2026 года оба контракта возвращали один и тот же `code_hash`: ```text 94uKcoDB3QbEpxDj1xsw9CQwu9bAY1PoVPr2BZYRRv4K ``` Это сильный сигнал, что на обеих сетях развёрнут один и тот же бинарник контракта. ## 5. Что происходит внутри? Видимая история выше — это то, что NEAR-разработчику нужно сначала. Более глубокий слой объясняет, почему этот поток вообще интересен. ### Что можно наблюдать уже сейчас Через FastNear и RPC уже видно: - вызывающую транзакцию `request_execution` - воркерскую `resolve_execution` или `submit_execution_output_and_resolve` - завершающие receipt, где материализуются callback, списание и возврат средств Интеграция вашего контракта при этом остаётся обычной асинхронной композицией в NEAR: вы вызываете `outlayer.*`, а потом обрабатываете свой callback. ### Что задокументировано как внутренний механизм Документация OutLayer описывает более глубокий внутренний слой: `outlayer.*` использует семантику NEAR `yield/resume` как свою внутреннюю асинхронную границу, внешняя работа выполняется в TEE-воркерах, а защищённые секреты проходят через отдельный путь доверия, где TEE-keystore получает DAO-gated CKD через MPC signer. Для NEAR-разработчика здесь важна точность: мы не говорим, что ваш вызывающий контракт сам пишет `promise_yield_create`. Примитивы `yield/resume` в NEAR работают только в рамках одного и того же аккаунта, поэтому если этот механизм используется здесь, то yielding и resuming делает `outlayer.*`, а не исходный вызывающий контракт. Для сырой модели выполнения смотрите [Продвинутые возможности](https://docs.fastnear.com/ru/transaction-flow/advanced-features). Документация Secrets / CKD описывает этот путь keystore как двухуровневый: сначала keystore получает derivation key через DAO-gated путь к MPC, а затем использует уже полученную derivation capability для защищённых секретов во время исполнений приложения. Это объяснение доверительной модели, а не утверждение, что каждое обычное исполнение OutLayer делает новый DAO -> MPC round trip. Публичный gateway-аккаунт для этого пути keystore / DAO в наших текущих публичных chain-данных всё ещё не подтверждён, поэтому эту часть надо держать в корзине «задокументировано внутри», а не в корзине «уже наблюдается сейчас». ```mermaid flowchart TB subgraph Observable["Что уже можно наблюдать через FastNear / RPC"] Caller["Пользователь или вызывающий контракт"] -->|FunctionCall request_execution| Entry["outlayer.*"] Entry -->|поздняя активность воркера| Worker["worker.outlayer.*"] Worker -->|resolve_execution или submit_execution_output_and_resolve| Entry Entry -->|on_execution_response, списание, refund-переводы| Finish["Callback / finish receipt"] end subgraph Internal["Что задокументировано как внутренний слой"] Yield["внутренняя yield-точка в outlayer.*"] --> TEE["TEE-воркер исполняет WASM"] TEE -->|resume с результатом| Yield TEE --> Keystore["TEE-keystore для защищённых секретов"] Keystore -->|задокументированный DAO-gated request_key| DAO["DAO gateway (задокументирован)"] DAO -->|задокументированный CKD request| MPC["v1.signer / v1.signer-prod.testnet"] MPC -->|derivation key для keystore| Keystore end Entry -. та же логическая история исполнения .-> Yield classDef observable fill:#e7f1ff,stroke:#2563eb,color:#0f172a; classDef internal fill:#fff4e5,stroke:#b45309,color:#0f172a; class Caller,Entry,Worker,Finish observable; class Yield,TEE,Keystore,DAO,MPC internal; ``` ## Куда читать дальше - [Transactions API](https://docs.fastnear.com/ru/tx) для истории аккаунта, receipt и раскрытия транзакций - [Продвинутые возможности](https://docs.fastnear.com/ru/transaction-flow/advanced-features) для семантики `yield/resume` в NEAR - [Асинхронная модель](https://docs.fastnear.com/ru/transaction-flow/async-model) для лексики promise и callback - [NEAR Integration в OutLayer](https://outlayer.fastnear.com/docs/near-integration) для задокументированного контрактного интерфейса - [Secrets / CKD в OutLayer](https://outlayer.fastnear.com/docs/secrets) для задокументированного пути keystore, DAO и MPC --- ## RPC протокола NEAR: Просмотр ключа доступа - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/account/view_access_key - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/account/view_access_key.md # RPC протокола NEAR: Просмотр ключа доступа Просмотр ключа доступа аккаунта Получите права и nonce одного ключа доступа аккаунта по его публичному ключу. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/account/view_access_key - https://docs.fastnear.com/ru/rpcs/account/view_access_key/other/view_access_key - https://docs.fastnear.com/ru/reference/operation/view_access_key ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/account/view_access_key.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "root.near", "public_key": "ed25519:6666666666666666666666666666666666666666666", "request_type": "view_access_key", "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "root.near", "public_key": "ed25519:6666666666666666666666666666666666666666666", "request_type": "view_access_key", "finality": "final" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. - `public_key` (body, обязательный, string): Публичный ключ в формате `ed25519:...` или `secp256k1:...`. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "account_id", "public_key", "финальность" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "public_key", "required": true, "schema": { "type": "string", "description": "Публичный ключ с префиксом ed25519: или secp256k1:" } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "view_access_key" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Информация о ключе доступа ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Описывает область действия ключа доступа и nonce.", "required": [ "nonce", "permission" ], "properties": [ { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "permission", "required": true, "schema": { "type": "object", "description": "One of multiple possible types" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Список ключей доступа - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/account/view_access_key_list - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/account/view_access_key_list.md # RPC протокола NEAR: Список ключей доступа Просмотр списка ключей доступа аккаунта Получите все ключи доступа аккаунта — каждый с правами и nonce. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/account/view_access_key_list - https://docs.fastnear.com/ru/rpcs/account/view_access_key_list/other/view_access_key_list - https://docs.fastnear.com/ru/reference/operation/view_access_key_list ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/account/view_access_key_list.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "root.near", "request_type": "view_access_key_list", "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "root.near", "request_type": "view_access_key_list", "finality": "final" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "account_id", "финальность" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "view_access_key_list" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Список ключей доступа аккаунта ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Список ключей доступа", "required": [ "ключи" ], "properties": [ { "name": "ключи", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Описывает информацию о ключе доступа, включая публичный ключ." } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Просмотр аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/account/view_account - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/account/view_account.md # RPC протокола NEAR: Просмотр аккаунта Просмотр аккаунта Получите баланс аккаунта, размер хранилища и хеш кода на выбранной высоте блока или финальности. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/account/view_account - https://docs.fastnear.com/ru/rpcs/account/view_account/other/view_account - https://docs.fastnear.com/ru/reference/operation/view_account ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/account/view_account.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "root.near", "request_type": "view_account", "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "root.near", "request_type": "view_account", "finality": "final" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "account_id", "финальность" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "view_account" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Сведения об аккаунте ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Представление аккаунта", "required": [ "amount", "locked", "code_hash", "storage_usage" ], "properties": [ { "name": "amount", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "code_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "global_contract_account_id", "required": false, "schema": { "type": "string", "nullable": true, "description": "ID аккаунта NEAR" } }, { "name": "global_contract_hash", "required": false, "schema": { "type": "string", "nullable": true, "description": "Base58-encoded hash" } }, { "name": "locked", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "storage_paid_at", "required": false, "schema": { "type": "integer", "description": "TODO(2271): deprecated.", "format": "uint64", "default": 0 } }, { "name": "storage_usage", "required": true, "schema": { "type": "integer", "format": "uint64" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Блок по высоте - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/block/block_by_height - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/block/block_by_height.md # RPC протокола NEAR: Блок по высоте Получить блок по высоте Получите заголовок и сводку по чанкам блока по его высоте в цепочке. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/block/block_by_height - https://docs.fastnear.com/ru/rpcs/block/block_by_height/other/block_by_height - https://docs.fastnear.com/ru/reference/operation/block_by_height ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/block/block_by_height.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "блок", "params": { "block_id": 9820210 } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "блок", "params": { "block_id": 9820210 } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, обязательный, integer): Высота блока NEAR для запроса. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "блок" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "block_id" ], "properties": [ { "name": "block_id", "required": true, "schema": { "type": "integer", "description": "Высота блока для запроса" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object" } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Блок по хешу - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/block/block_by_id - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/block/block_by_id.md # RPC протокола NEAR: Блок по хешу Получить блок по хешу Получите заголовок и сводку по чанкам блока по его SHA-256-хешу в кодировке Base58. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/block/block_by_id - https://docs.fastnear.com/ru/rpcs/block/block_by_id/other/block_by_id - https://docs.fastnear.com/ru/reference/operation/block_by_id ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/block/block_by_id.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "блок", "params": { "block_id": "EPnLgE7iEq9s7yTkos96M3cWymH5avBAPm3qx3NXqR8H" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "блок", "params": { "block_id": "EPnLgE7iEq9s7yTkos96M3cWymH5avBAPm3qx3NXqR8H" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, обязательный, string): Хеш блока в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "блок" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "block_id" ], "properties": [ { "name": "block_id", "required": true, "schema": { "type": "string", "description": "Хеш блока в кодировке Base58" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object" } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Эффекты блока - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/block/block_effects - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/block/block_effects.md # RPC протокола NEAR: Эффекты блока Получить эффекты блока Получите сводку всех изменений состояния в одном блоке — какие аккаунты, ключи и записи состояния контрактов были затронуты. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/block/block_effects - https://docs.fastnear.com/ru/rpcs/block/block_effects/other/block_effects - https://docs.fastnear.com/ru/reference/operation/block_effects ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/block/block_effects.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "block_effects", "params": { "block_id": 9820210 } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "block_effects", "params": { "block_id": 9820210 } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, обязательный, integer | string): Высота блока (целое число) или хеш блока (строка). ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "block_effects" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "block_id" ], "properties": [ { "name": "block_id", "required": true, "schema": { "description": "Высота блока (целое число) или хеш блока (строка)", "oneOf": [ { "type": "integer", "description": "Высота блока" }, { "type": "string", "description": "Хеш блока в кодировке Base58" } ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "block_hash", "changes" ], "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "One of multiple possible types" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Вызов view-метода - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/contract/call - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/contract/call.md # RPC протокола NEAR: Вызов view-метода Вызвать view-метод контракта Вызовите view-метод контракта без газа и изменений состояния — чтение вычисляемых значений из логики контракта. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/contract/call - https://docs.fastnear.com/ru/rpcs/contract/call/other/call_function - https://docs.fastnear.com/ru/reference/operation/call_function ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/contract/call.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "request_type": "call_function", "finality": "final", "account_id": "contract.near", "method_name": "get_info", "args_base64": "e30=" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "request_type": "call_function", "finality": "final", "account_id": "contract.near", "method_name": "get_info", "args_base64": "e30=" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. - `args_base64` (body, обязательный, string): Сырые аргументы метода в кодировке Base64. Контракты, работающие с JSON, обычно ожидают UTF-8-байты JSON-полезной нагрузки; пример `e30=` соответствует `{}`. - `method_name` (body, обязательный, string): Имя view-метода контракта. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "account_id", "method_name", "args_base64", "финальность" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "args_base64", "required": true, "schema": { "type": "string", "description": "Base64-кодированные сырые аргументы метода. Контракты, работающие с JSON, обычно ожидают UTF-8-байты JSON-полезной нагрузки; пример `e30=` соответствует `{}`." } }, { "name": "method_name", "required": true, "schema": { "type": "string", "description": "Name of the contract view method to invoke." } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "call_function" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Результат, возвращённый методом контракта", "required": [ "result", "logs" ], "properties": [ { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "result", "required": true, "schema": { "type": "array", "items": { "type": "integer", "format": "uint8" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Код контракта - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_code - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_code.md # RPC протокола NEAR: Код контракта Получить код контракта Получите скомпилированный WebAssembly-байткод, развёрнутый непосредственно на одном аккаунте. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/contract/view_code - https://docs.fastnear.com/ru/rpcs/contract/view_code/other/view_code - https://docs.fastnear.com/ru/reference/operation/view_code ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/contract/view_code.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "intents.near", "request_type": "view_code", "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "intents.near", "request_type": "view_code", "finality": "final" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "account_id", "финальность" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "view_code" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Представление кода контракта.", "required": [ "code_base64", "hash" ], "properties": [ { "name": "code_base64", "required": true, "schema": { "type": "string" } }, { "name": "hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Глобальный код контракта - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code.md # RPC протокола NEAR: Глобальный код контракта Получить глобальный код контракта Найдите WebAssembly-байткод глобального контракта по SHA-256-хешу его кода в кодировке Base58. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code - https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code/other/view_global_contract_code - https://docs.fastnear.com/ru/reference/operation/view_global_contract_code ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/contract/view_global_contract_code.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "code_hash": "A2VxywASqbnarBAfTWobhDZjMXobjnYyJmkjhoXAiYBz", "request_type": "view_global_contract_code", "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "code_hash": "A2VxywASqbnarBAfTWobhDZjMXobjnYyJmkjhoXAiYBz", "request_type": "view_global_contract_code", "finality": "final" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `code_hash` (body, обязательный, string): Хеш в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "code_hash", "финальность" ], "properties": [ { "name": "code_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "view_global_contract_code" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Представление кода контракта.", "required": [ "code_base64", "hash" ], "properties": [ { "name": "code_base64", "required": true, "schema": { "type": "string" } }, { "name": "hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Глобальный код контракта по аккаунту - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code_by_account_id - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code_by_account_id.md # RPC протокола NEAR: Глобальный код контракта по аккаунту Получить глобальный код контракта по аккаунту Найдите WebAssembly-байткод глобального контракта по ID аккаунта, который его зарегистрировал. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code_by_account_id - https://docs.fastnear.com/ru/rpcs/contract/view_global_contract_code_by_account_id/other/view_global_contract_code_by_account_id - https://docs.fastnear.com/ru/reference/operation/view_global_contract_code_by_account_id ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/contract/view_global_contract_code_by_account_id.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "global-contract.nfts.tg", "request_type": "view_global_contract_code_by_account_id", "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "account_id": "global-contract.nfts.tg", "request_type": "view_global_contract_code_by_account_id", "finality": "final" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "account_id", "финальность" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "view_global_contract_code_by_account_id" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Представление кода контракта.", "required": [ "code_base64", "hash" ], "properties": [ { "name": "code_base64", "required": true, "schema": { "type": "string" } }, { "name": "hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Состояние контракта - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_state - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/contract/view_state.md # RPC протокола NEAR: Состояние контракта Получить состояние контракта Получите сырое состояние «ключ-значение», записанное контрактом, с опциональным фильтром по префиксу ключа. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/contract/view_state - https://docs.fastnear.com/ru/rpcs/contract/view_state/other/view_state - https://docs.fastnear.com/ru/reference/operation/view_state ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/contract/view_state.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "request_type": "view_state", "finality": "final", "account_id": "lockup.near", "prefix_base64": "U1RBVEU=" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "query", "params": { "request_type": "view_state", "finality": "final", "account_id": "lockup.near", "prefix_base64": "U1RBVEU=" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. - `include_proof` (body, boolean): Добавить криптографическое доказательство к ответу. - `prefix_base64` (body, обязательный, string): Префикс ключа хранилища в кодировке Base64. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "query" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "request_type", "account_id", "prefix_base64", "финальность" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "include_proof", "required": false, "schema": { "type": "boolean", "description": "Include a Merkle proof for the queried state alongside the values." } }, { "name": "prefix_base64", "required": true, "schema": { "type": "string", "description": "Base64-encoded storage key prefix. Use an empty string (`\"\"`) to remove the prefix filter and return all matching contract state values. Large contracts can produce very large responses when no prefix is set." } }, { "name": "request_type", "required": true, "schema": { "type": "string", "enum": [ "view_state" ] } }, { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Финальность блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Итоговые значения состояния для запроса просмотра состояния", "required": [ "values" ], "properties": [ { "name": "доказательство", "required": false, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "values", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Элемент состояния: ключ и значение сериализованы в Base64, а также приложено доказательство включения этого элемента состояния." } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Изменения состояния - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/changes - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/changes.md # RPC протокола NEAR: Изменения состояния Получить изменения состояния Получите подробные изменения состояния в блоке — с фильтром по аккаунту, префиксу ключа или типу изменения. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/changes - https://docs.fastnear.com/ru/rpcs/protocol/changes/other/changes - https://docs.fastnear.com/ru/reference/operation/changes ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/changes.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "changes", "params": { "finality": "final", "changes_type": "account_changes", "account_ids": [ "root.near" ] } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "changes", "params": { "finality": "final", "changes_type": "account_changes", "account_ids": [ "root.near" ] } }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "changes" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "description": "One of multiple possible types" } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "block_hash", "changes" ], "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "cause" ], "properties": [ { "name": "cause", "required": true, "schema": { "type": "object", "description": "One of multiple possible types" } } ] } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Чанк по блоку и шарду - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_block_shard - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_block_shard.md # RPC протокола NEAR: Чанк по блоку и шарду Получить чанк по блоку и шарду Получите транзакции и квитанции одного чанка по родительскому блоку и индексу шарда. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_block_shard - https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_block_shard/other/chunk_by_block_shard - https://docs.fastnear.com/ru/reference/operation/chunk_by_block_shard ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/chunk_by_block_shard.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "chunk", "params": { "block_id": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T", "shard_id": 10 } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "chunk", "params": { "block_id": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T", "shard_id": 10 } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, обязательный, integer | string): Высота блока (целое число) или хеш блока (строка). - `shard_id` (body, обязательный, integer): Идентификатор шарда. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "chunk" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "block_id", "shard_id" ], "properties": [ { "name": "block_id", "required": true, "schema": { "description": "Высота блока (целое число) или хеш блока (строка)", "oneOf": [ { "type": "integer", "description": "Высота блока" }, { "type": "string", "description": "Хеш блока в кодировке Base58" } ] } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "description": "Shard identifier" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "author", "header", "транзакции", "квитанции" ], "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Contains main info about the chunk.", "required": [ "chunk_hash", "prev_block_hash", "outcome_root", "prev_state_root", "encoded_merkle_root", "encoded_length", "height_created", "height_included", "shard_id", "gas_used", "gas_limit", "balance_burnt", "outgoing_receipts_root", "tx_root", "validator_proposals", "signature" ], "properties": [ { "name": "balance_burnt", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "bandwidth_requests", "required": false, "schema": { "type": "object", "nullable": true, "description": "One of multiple possible types" } }, { "name": "chunk_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "congestion_info", "required": false, "schema": { "type": "object", "nullable": true, "description": "Хранит уровень перегрузки шарда. Подробнее о перегрузке [здесь](https://near.github.io/nearcore/architecture/how/receipt-congestion.html?highlight=congestion#receipt-congestion)" } }, { "name": "encoded_length", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "encoded_merkle_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "gas_limit", "required": true, "schema": { "type": "string", "description": "Количество газа" } }, { "name": "gas_used", "required": true, "schema": { "type": "string", "description": "Количество газа" } }, { "name": "height_created", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "outgoing_receipts_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_state_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "rent_paid", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR", "default": "0" } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "description": "Shard identifier" } }, { "name": "signature", "required": true, "schema": { "type": "string", "description": "Base58-encoded cryptographic signature" } }, { "name": "tx_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "validator_proposals", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "validator_reward", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR", "default": "0" } } ] } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Чанк по хешу - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_hash - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_hash.md # RPC протокола NEAR: Чанк по хешу Получить чанк по хешу Получите транзакции и квитанции одного чанка по его хешу содержимого в кодировке Base58. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_hash - https://docs.fastnear.com/ru/rpcs/protocol/chunk_by_hash/other/chunk_by_hash - https://docs.fastnear.com/ru/reference/operation/chunk_by_hash ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/chunk_by_hash.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "chunk", "params": { "chunk_id": "349Wr5HMm2Bvyy8GuhExAZ4F353tXCChx1FfAsYnQTAn" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "chunk", "params": { "chunk_id": "349Wr5HMm2Bvyy8GuhExAZ4F353tXCChx1FfAsYnQTAn" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `chunk_id` (body, обязательный, string): Хеш чанка в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "chunk" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "chunk_id" ], "properties": [ { "name": "chunk_id", "required": true, "schema": { "type": "string", "description": "Base58-encoded chunk hash" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "author", "header", "транзакции", "квитанции" ], "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Contains main info about the chunk.", "required": [ "chunk_hash", "prev_block_hash", "outcome_root", "prev_state_root", "encoded_merkle_root", "encoded_length", "height_created", "height_included", "shard_id", "gas_used", "gas_limit", "balance_burnt", "outgoing_receipts_root", "tx_root", "validator_proposals", "signature" ], "properties": [ { "name": "balance_burnt", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "bandwidth_requests", "required": false, "schema": { "type": "object", "nullable": true, "description": "One of multiple possible types" } }, { "name": "chunk_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "congestion_info", "required": false, "schema": { "type": "object", "nullable": true, "description": "Хранит уровень перегрузки шарда. Подробнее о перегрузке [здесь](https://near.github.io/nearcore/architecture/how/receipt-congestion.html?highlight=congestion#receipt-congestion)" } }, { "name": "encoded_length", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "encoded_merkle_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "gas_limit", "required": true, "schema": { "type": "string", "description": "Количество газа" } }, { "name": "gas_used", "required": true, "schema": { "type": "string", "description": "Количество газа" } }, { "name": "height_created", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "outgoing_receipts_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_state_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "rent_paid", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR", "default": "0" } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "description": "Shard identifier" } }, { "name": "signature", "required": true, "schema": { "type": "string", "description": "Base58-encoded cryptographic signature" } }, { "name": "tx_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "validator_proposals", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "validator_reward", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR", "default": "0" } } ] } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Конфигурация клиента - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/client_config - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/client_config.md # RPC протокола NEAR: Конфигурация клиента Получить конфигурацию клиента Получите локальную клиентскую конфигурацию узла — таймауты, настройки повторов и параметры оператора. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/client_config - https://docs.fastnear.com/ru/rpcs/protocol/client_config/other/client_config - https://docs.fastnear.com/ru/reference/operation/client_config ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/client_config.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "client_config", "params": [] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "client_config", "params": [] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "client_config" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "description": "Empty array as this method takes no parameters", "example": [] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "ClientConfig where some fields can be updated at runtime.", "properties": [ { "name": "archive", "required": false, "schema": { "type": "boolean", "description": "Not clear old data, set `true` for archive nodes." } }, { "name": "block_fetch_horizon", "required": false, "schema": { "type": "integer", "description": "Горизонт, после которого вместо получения блока извлекается полное состояние.", "format": "uint64" } }, { "name": "block_header_fetch_horizon", "required": false, "schema": { "type": "integer", "description": "Behind this horizon header fetch kicks in.", "format": "uint64" } }, { "name": "block_production_tracking_delay", "required": false, "schema": { "type": "array", "description": "Интервал проверки необходимости выпустить или пропустить блок.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "catchup_step_period", "required": false, "schema": { "type": "array", "description": "Time between check to perform catchup.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "chain_id", "required": false, "schema": { "type": "string", "description": "ID цепочки для статуса." } }, { "name": "chunk_distribution_network", "required": false, "schema": { "type": "object", "nullable": true, "description": "Конфигурация функции Chunk Distribution Network.\nОна позволяет узлам отправлять и получать чанки через центральный поток.\nПреимущества такого подхода: (1) меньше трафика запросов и ответов\nв одноранговой сети и (2) меньшая задержка для RPC-узлов, индексирующих цепочку.", "properties": [ { "name": "enabled", "required": false, "schema": { "type": "boolean" } }, { "name": "uris", "required": false, "schema": { "type": "object", "description": "URI для функции Chunk Distribution Network." } } ] } }, { "name": "chunk_request_retry_period", "required": false, "schema": { "type": "array", "description": "Время между проверками на повторный запрос чанков.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "chunk_validation_threads", "required": false, "schema": { "type": "integer", "description": "Number of threads for ChunkValidationActor pool.", "format": "uint" } }, { "name": "chunk_wait_mult", "required": false, "schema": { "type": "array", "description": "Multiplier for the wait time for all chunks to be received.", "items": { "type": "integer", "format": "int32" } } }, { "name": "chunks_cache_height_horizon", "required": false, "schema": { "type": "integer", "description": "Height horizon for the chunk cache. A chunk is removed from the cache\nif its height + chunks_cache_height_horizon < largest_seen_height.\nThe default value is DEFAULT_CHUNKS_CACHE_HEIGHT_HORIZON.", "format": "uint64" } }, { "name": "client_background_migration_threads", "required": false, "schema": { "type": "integer", "description": "Количество потоков, выполняющих фоновые миграционные работы в клиенте.", "format": "uint" } }, { "name": "cloud_archival_writer", "required": false, "schema": { "type": "object", "nullable": true, "description": "Конфигурация облачного компонента записи архивных данных. Если эта конфигурация задана, компонент включается и\nзаписывает данные, связанные с чанками, на основе отслеживаемых шардов. Эта конфигурация также управляет дополнительным архивным\nповедением, например записью данных блоков и интервалом опроса.", "properties": [ { "name": "archive_block_data", "required": false, "schema": { "type": "boolean", "description": "Определяет, должны ли данные, связанные с блоками, записываться в облачное хранилище.", "default": false } }, { "name": "polling_interval", "required": false, "schema": { "type": "object", "description": "Интервал, с которым система проверяет новые блоки или чанки для архивации.", "default": { "nanos": 0, "secs": 1 } } } ] } }, { "name": "disable_tx_routing", "required": false, "schema": { "type": "boolean", "description": "Если значение `true`, узел не будет пересылать транзакции следующим производителям чанков." } }, { "name": "doomslug_step_period", "required": false, "schema": { "type": "array", "description": "Time between running doomslug timer.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "enable_early_prepare_transactions", "required": false, "schema": { "type": "boolean", "description": "Если значение `true`, транзакции для следующего чанка будут подготавливаться заранее, сразу после того,\nкак будет готово post-state предыдущего чанка. Это помогает быстрее выпускать чанки в сетях с высокой пропускной способностью.\nТекущая реализация увеличивает задержку в сетях с низкой нагрузкой; это будет исправлено позже.\nПо умолчанию параметр отключён." } }, { "name": "enable_multiline_logging", "required": false, "schema": { "type": "boolean" } }, { "name": "enable_statistics_export", "required": false, "schema": { "type": "boolean", "description": "Re-export storage layer statistics as prometheus metrics." } }, { "name": "epoch_length", "required": false, "schema": { "type": "integer", "description": "Epoch length.", "format": "uint64" } }, { "name": "epoch_sync", "required": false, "schema": { "type": "object", "description": "Options for epoch sync.", "properties": [ { "name": "epoch_sync_horizon_num_epochs", "required": false, "schema": { "type": "integer", "description": "Количество эпох от головы сети, за пределами которого узел переключится с header-синхронизации\nна epoch-синхронизацию. На стороне потребителя это значение\nумножается на epoch_length, чтобы получить горизонт в блоках.", "format": "uint64", "default": 2 } }, { "name": "timeout_for_epoch_sync", "required": false, "schema": { "type": "object", "description": "Timeout for epoch sync requests. The node will continue retrying indefinitely even\nif this timeout is exceeded." } } ] } }, { "name": "expected_shutdown", "required": false, "schema": { "type": "string", "description": "Корректное завершение работы на ожидаемой высоте блока." } }, { "name": "gc", "required": false, "schema": { "type": "object", "description": "Configuration for garbage collection.", "properties": [ { "name": "gc_blocks_limit", "required": false, "schema": { "type": "integer", "description": "Максимальное количество блоков, собираемых сборщиком мусора\nза один вызов.", "format": "uint64", "default": 2 } }, { "name": "gc_fork_clean_step", "required": false, "schema": { "type": "integer", "description": "Maximum number of height to go through at each garbage collection step\nwhen cleaning forks during garbage collection.", "format": "uint64", "default": 100 } }, { "name": "gc_num_epochs_to_keep", "required": false, "schema": { "type": "integer", "description": "Number of epochs for which we keep store data.", "format": "uint64", "default": 5 } }, { "name": "gc_step_period", "required": false, "schema": { "type": "object", "description": "How often gc should be run", "default": { "nanos": 500000000, "secs": 0 } } } ] } }, { "name": "header_sync_expected_height_per_second", "required": false, "schema": { "type": "integer", "description": "Expected increase of header head height per second during header sync", "format": "uint64" } }, { "name": "header_sync_initial_timeout", "required": false, "schema": { "type": "array", "description": "How much time to wait after initial header sync", "items": { "type": "integer", "format": "uint64" } } }, { "name": "header_sync_progress_timeout", "required": false, "schema": { "type": "array", "description": "How much time to wait after some progress is made in header sync", "items": { "type": "integer", "format": "uint64" } } }, { "name": "header_sync_stall_ban_timeout", "required": false, "schema": { "type": "array", "description": "How much time to wait before banning a peer in header sync if sync is too slow", "items": { "type": "integer", "format": "uint64" } } }, { "name": "log_summary_period", "required": false, "schema": { "type": "array", "description": "Period between logging summary information.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "log_summary_style", "required": false, "schema": { "type": "string", "description": "Enable coloring of the logs", "enum": [ "plain", "colored" ] } }, { "name": "max_block_production_delay", "required": false, "schema": { "type": "array", "description": "Максимальное время ожидания подтверждений перед выпуском блока.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "max_block_wait_delay", "required": false, "schema": { "type": "array", "description": "Maximum duration before skipping given height.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "max_gas_burnt_view", "required": false, "schema": { "type": "string", "nullable": true, "description": "Количество газа" } }, { "name": "min_block_production_delay", "required": false, "schema": { "type": "array", "description": "Минимальная длительность перед выпуском блока.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "min_num_peers", "required": false, "schema": { "type": "integer", "description": "Minimum number of peers to start syncing.", "format": "uint" } }, { "name": "num_block_producer_seats", "required": false, "schema": { "type": "integer", "description": "Количество мест для производителей блоков", "format": "uint64" } }, { "name": "orphan_state_witness_max_size", "required": false, "schema": { "type": "integer", "description": "Максимальный размер state witness в OrphanStateWitnessPool.\nВ пуле сохраняются только orphan-witness, размер которых меньше этого значения.\nЭто ограничивает максимальное потребление памяти пулом OrphanStateWitnessPool.", "format": "uint64" } }, { "name": "orphan_state_witness_pool_size", "required": false, "schema": { "type": "integer", "description": "OrphanStateWitnessPool хранит экземпляры ChunkStateWitness, которые нельзя обработать,\nпотому что предыдущий блок недоступен. Эти witness остаются в пуле, пока\nне появится нужный блок. Эта переменная определяет, сколько witness можно хранить в пуле.", "format": "uint" } }, { "name": "produce_chunk_add_transactions_time_limit", "required": false, "schema": { "type": "string", "description": "Ограничивает время добавления транзакций в чанк.\nНода формирует чанк, добавляя транзакции из пула транзакций, пока\nне будет достигнут один из лимитов. Этот лимит по времени гарантирует, что добавление транзакций не займёт\nдольше указанной длительности и поможет быстрее выпустить чанк." } }, { "name": "produce_empty_blocks", "required": false, "schema": { "type": "boolean", "description": "Выпускать пустые блоки; значение `false` используется для тестирования." } }, { "name": "protocol_version_check", "required": false, "schema": { "type": "string", "description": "Определяет, проверяет ли узел совместимость версии сети для следующей или через одну эпохи.", "enum": [ "Next", "NextNext" ] } }, { "name": "resharding_config", "required": false, "schema": { "type": "string" } }, { "name": "rpc_addr", "required": false, "schema": { "type": "string", "nullable": true, "description": "Порт RPC для статуса, на котором слушает узел." } }, { "name": "save_invalid_witnesses", "required": false, "schema": { "type": "boolean", "description": "Save observed instances of invalid ChunkStateWitness to the database in DBCol::InvalidChunkStateWitnesses.\nSaving invalid witnesses is useful for analysis and debugging.\nThis option can cause extra load on the database and is not recommended for production use." } }, { "name": "save_latest_witnesses", "required": false, "schema": { "type": "boolean", "description": "Сохраняет наблюдаемые экземпляры ChunkStateWitness в базу данных DBCol::LatestChunkStateWitnesses.\nСохранение последних экземпляров ChunkStateWitness полезно для анализа и отладки.\nЭта опция может создавать дополнительную нагрузку на базу данных и не рекомендуется для продового контура." } }, { "name": "save_state_changes", "required": false, "schema": { "type": "boolean", "description": "Нужно ли сохранять изменения состояния на диск." } }, { "name": "save_trie_changes", "required": false, "schema": { "type": "boolean", "description": "save_trie_changes should be set to true iff\n- archive if false - non-archival nodes need trie changes to perform garbage collection\n- archive is true, cold_store is configured and migration to split_storage is finished - node\nworking in split storage mode needs trie changes in order to do garbage collection on hot." } }, { "name": "save_tx_outcomes", "required": false, "schema": { "type": "boolean", "description": "Нужно ли сохранять результаты транзакций на диск." } }, { "name": "save_untracked_partial_chunks_parts", "required": false, "schema": { "type": "boolean", "description": "Whether to persist partial chunk parts for untracked shards or not." } }, { "name": "skip_sync_wait", "required": false, "schema": { "type": "boolean", "description": "Skip waiting for sync (for testing or single node testnet)." } }, { "name": "state_request_server_threads", "required": false, "schema": { "type": "integer", "description": "Number of threads for StateRequestActor pool.", "format": "uint" } }, { "name": "state_request_throttle_period", "required": false, "schema": { "type": "array", "description": "Количество секунд между запросами состояния для view-клиента.\nОкно троттлинга для запросов состояния (заголовки и части).", "items": { "type": "integer", "format": "uint64" } } }, { "name": "state_requests_per_throttle_period", "required": false, "schema": { "type": "integer", "description": "Максимальное количество запросов состояния, обслуживаемых за период троттлинга", "format": "uint" } }, { "name": "state_sync", "required": false, "schema": { "type": "object", "description": "Параметры синхронизации состояния.", "properties": [ { "name": "concurrency", "required": false, "schema": { "type": "object" } }, { "name": "dump", "required": false, "schema": { "type": "object", "nullable": true, "description": "Настраивает способ выгрузки состояния во внешнее хранилище." } }, { "name": "parts_compression_lvl", "required": false, "schema": { "type": "integer", "description": "Уровень сжатия Zstd для частей состояния.", "format": "int32", "default": 1 } }, { "name": "sync", "required": false, "schema": { "type": "string", "nullable": true, "description": "Синхронизирует состояние от пиров, не читая ничего из внешнего хранилища.", "enum": [ "Peers" ] } } ] } }, { "name": "state_sync_enabled", "required": false, "schema": { "type": "boolean", "description": "Использовать ли механизм State Sync.\nЕсли отключён, узел будет выполнять Block Sync вместо State Sync." } }, { "name": "state_sync_external_backoff", "required": false, "schema": { "type": "array", "description": "Дополнительное время ожидания после неудачного запроса к внешнему хранилищу", "items": { "type": "integer", "format": "uint64" } } }, { "name": "state_sync_external_timeout", "required": false, "schema": { "type": "array", "description": "Как долго ждать ответа от централизованной синхронизации состояния", "items": { "type": "integer", "format": "uint64" } } }, { "name": "state_sync_p2p_timeout", "required": false, "schema": { "type": "array", "description": "Как долго ждать ответа от p2p-синхронизации состояния", "items": { "type": "integer", "format": "uint64" } } }, { "name": "state_sync_retry_backoff", "required": false, "schema": { "type": "array", "description": "Как долго ждать после неудачного запроса синхронизации состояния", "items": { "type": "integer", "format": "uint64" } } }, { "name": "sync_check_period", "required": false, "schema": { "type": "array", "description": "How often to check that we are not out of sync.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "sync_height_threshold", "required": false, "schema": { "type": "integer", "description": "Sync height threshold: below this difference in height don't start syncing.", "format": "uint64" } }, { "name": "sync_max_block_requests", "required": false, "schema": { "type": "integer", "description": "Максимальное количество запросов блоков, отправляемых пирам для синхронизации", "format": "uint" } }, { "name": "sync_step_period", "required": false, "schema": { "type": "array", "description": "While syncing, how long to check for each step.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "tracked_shards_config", "required": false, "schema": { "type": "object", "description": "One of multiple possible types" } }, { "name": "transaction_pool_size_limit", "required": false, "schema": { "type": "integer", "nullable": true, "description": "Ограничение размера пула транзакций одного шарда в байтах. Если не задано,\nразмер не ограничен.", "format": "uint64" } }, { "name": "transaction_request_handler_threads", "required": false, "schema": { "type": "integer", "format": "uint" } }, { "name": "trie_viewer_state_size_limit", "required": false, "schema": { "type": "integer", "nullable": true, "description": "Верхняя граница размера состояния контракта в байтах, при котором оно ещё доступно для просмотра. None — без ограничения", "format": "uint64" } }, { "name": "ttl_account_id_router", "required": false, "schema": { "type": "array", "description": "Time to persist Accounts Id in the router without removing them.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "tx_routing_height_horizon", "required": false, "schema": { "type": "integer", "description": "Если узел не является производителем чанков в пределах этого числа блоков,\nмаршрутизировать запросы к будущим производителям чанков.", "format": "uint64" } }, { "name": "version", "required": false, "schema": { "type": "object", "description": "Data structure for semver version and github tag or commit.", "required": [ "version", "build", "commit" ], "properties": [ { "name": "build", "required": true, "schema": { "type": "string" } }, { "name": "commit", "required": true, "schema": { "type": "string" } }, { "name": "rustc_version", "required": false, "schema": { "type": "string", "default": "" } }, { "name": "version", "required": true, "schema": { "type": "string" } } ] } }, { "name": "view_client_threads", "required": false, "schema": { "type": "integer", "description": "Количество потоков для пула ViewClientActor.", "format": "uint" } }, { "name": "dynamic_resharding_dry_run", "required": false, "schema": { "type": "boolean", "description": "Если значение `true`, рантайм выполнит пробный динамический ресхардинг на последнем блоке каждой эпохи.\nЭто означает вычисление предварительных граничных аккаунтов для разделения отслеживаемых шардов." } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Уровень перегрузки - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_congestion_level - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_congestion_level.md # RPC протокола NEAR: Уровень перегрузки Получить уровень перегрузки Измерьте нагрузку одного шарда на выбранном блоке — оценка насыщения от 0.0 до 1.0. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_congestion_level - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_congestion_level/other/EXPERIMENTAL_congestion_level - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_congestion_level ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/EXPERIMENTAL_congestion_level.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_congestion_level", "params": { "block_id": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T", "shard_id": 10 } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_congestion_level", "params": { "block_id": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T", "shard_id": 10 } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, обязательный, integer | string): Высота блока (целое число) или хеш блока (строка). - `shard_id` (body, обязательный, integer): Идентификатор шарда. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_congestion_level" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "nullable": true, "required": [ "block_id", "shard_id" ], "properties": [ { "name": "block_id", "required": true, "schema": { "description": "Высота блока (целое число) или хеш блока (строка)", "oneOf": [ { "type": "integer", "description": "Высота блока" }, { "type": "string", "description": "Хеш блока в кодировке Base58" } ] } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "description": "Shard identifier" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "congestion_level" ], "properties": [ { "name": "congestion_level", "required": true, "schema": { "type": "number", "format": "double" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Доказательство блока для лайт-клиента - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_block_proof - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_block_proof.md # RPC протокола NEAR: Доказательство блока для лайт-клиента Получить доказательство блока для лайт-клиента Получите Merkle-доказательство — по хешам блока и вершины лайт-клиента в кодировке Base58 — того, что блок включён в верифицированную цепочку лайт-клиента. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_block_proof - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_block_proof/other/EXPERIMENTAL_light_client_block_proof - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_light_client_block_proof ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/EXPERIMENTAL_light_client_block_proof.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_light_client_block_proof", "params": { "block_hash": "64utzv4G8AwNSxVnj23KPwU46VL435jQbQokbaYFtZ6V", "light_client_head": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_light_client_block_proof", "params": { "block_hash": "64utzv4G8AwNSxVnj23KPwU46VL435jQbQokbaYFtZ6V", "light_client_head": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_hash` (body, обязательный, string): Хеш в кодировке Base58. - `light_client_head` (body, обязательный, string): Хеш в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_light_client_block_proof" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "block_hash", "light_client_head" ], "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "light_client_head", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "block_header_lite", "block_proof" ], "properties": [ { "name": "block_header_lite", "required": true, "schema": { "type": "object", "required": [ "prev_block_hash", "inner_rest_hash", "inner_lite" ], "properties": [ { "name": "inner_lite", "required": true, "schema": { "type": "object", "description": "Часть состояния для текущей головы лёгкого клиента. Подробнее [здесь](https://nomicon.io/ChainSpec/LightClient)." } }, { "name": "inner_rest_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } }, { "name": "block_proof", "required": true, "schema": { "type": "array", "items": { "type": "object" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Доказательство исполнения для лайт-клиента - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_proof - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_proof.md # RPC протокола NEAR: Доказательство исполнения для лайт-клиента Получить доказательство исполнения для лайт-клиента Получите Merkle-доказательство включения транзакции или квитанции по ID в кодировке Base58 — EXPERIMENTAL-вариант метода `light_client_proof`. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_proof - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_light_client_proof/other/EXPERIMENTAL_light_client_proof - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_light_client_proof ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/EXPERIMENTAL_light_client_proof.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_light_client_proof", "params": { "light_client_head": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T", "sender_id": "escrow.ai.near", "transaction_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx", "type": "квитанция" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_light_client_proof", "params": { "light_client_head": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T", "sender_id": "escrow.ai.near", "transaction_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx", "type": "квитанция" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `light_client_head` (body, обязательный, string): Хеш в кодировке Base58. - `sender_id` (body, string): ID аккаунта NEAR. - `transaction_hash` (body, string): Хеш в кодировке Base58. - `type` (body, string): Предмет доказательства — `transaction` подтверждает включение транзакции верхнего уровня, `receipt` подтверждает включение конкретной квитанции, сформированной в ходе исполнения. - `receipt_id` (body, string): Base58-encoded hash - `receiver_id` (body, string): ID аккаунта NEAR ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_light_client_proof" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "light_client_head" ], "properties": [ { "name": "light_client_head", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "sender_id", "required": false, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "transaction_hash", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "type", "required": false, "schema": { "type": "string", "description": "Proof subject — `receipt` proves inclusion of a specific receipt produced during execution.", "enum": [ "квитанция" ] } }, { "name": "receipt_id", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "receiver_id", "required": false, "schema": { "type": "string", "description": "ID аккаунта NEAR" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "outcome_proof", "outcome_root_proof", "block_header_lite", "block_proof" ], "properties": [ { "name": "block_header_lite", "required": true, "schema": { "type": "object", "required": [ "prev_block_hash", "inner_rest_hash", "inner_lite" ], "properties": [ { "name": "inner_lite", "required": true, "schema": { "type": "object", "description": "Часть состояния для текущей головы лёгкого клиента. Подробнее [здесь](https://nomicon.io/ChainSpec/LightClient)." } }, { "name": "inner_rest_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } }, { "name": "block_proof", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "outcome_proof", "required": true, "schema": { "type": "object", "required": [ "доказательство", "block_hash", "id", "outcome" ], "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "id", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "outcome", "required": true, "schema": { "type": "object" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object" } } } ] } }, { "name": "outcome_root_proof", "required": true, "schema": { "type": "array", "items": { "type": "object" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Конфигурация протокола - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_protocol_config - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_protocol_config.md # RPC протокола NEAR: Конфигурация протокола Получить конфигурацию протокола Получите рантайм-конфигурацию протокола на выбранном блоке — стоимость газа, цены хранилища и действующие лимиты. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_protocol_config - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_protocol_config/other/EXPERIMENTAL_protocol_config - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_protocol_config ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/EXPERIMENTAL_protocol_config.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_protocol_config", "params": { "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_protocol_config", "params": { "finality": "final" } }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_protocol_config" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "description": "One of multiple possible types" } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "properties": [ { "name": "avg_hidden_validator_seats_per_shard", "required": false, "schema": { "type": "array", "description": "Ожидаемое количество скрытых валидаторов на шард.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "block_producer_kickout_threshold", "required": false, "schema": { "type": "integer", "description": "Порог исключения производителей блоков, значение от 0 до 100.", "format": "uint8" } }, { "name": "chain_id", "required": false, "schema": { "type": "string", "description": "ID блокчейна. Должен быть уникальным для каждого блокчейна.\nЕсли у ваших testnet-блокчейнов chain ID не уникальны, вас ждут проблемы." } }, { "name": "chunk_producer_kickout_threshold", "required": false, "schema": { "type": "integer", "description": "Threshold for kicking out chunk producers, between 0 and 100.", "format": "uint8" } }, { "name": "chunk_validator_only_kickout_threshold", "required": false, "schema": { "type": "integer", "description": "Порог исключения нод, которые являются только валидаторами чанков, значение от 0 до 100.", "format": "uint8" } }, { "name": "dynamic_resharding", "required": false, "schema": { "type": "boolean", "description": "Enable dynamic re-sharding." } }, { "name": "epoch_length", "required": false, "schema": { "type": "integer", "description": "Длина эпохи, измеряемая в высотах блоков.", "format": "uint64" } }, { "name": "fishermen_threshold", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "gas_limit", "required": false, "schema": { "type": "string", "description": "Количество газа" } }, { "name": "gas_price_adjustment_rate", "required": false, "schema": { "type": "array", "description": "Коэффициент корректировки цены газа", "items": { "type": "integer", "format": "int32" } } }, { "name": "genesis_height", "required": false, "schema": { "type": "integer", "description": "Высота генезис-блока.", "format": "uint64" } }, { "name": "genesis_time", "required": false, "schema": { "type": "string", "description": "Официальное время запуска блокчейна.", "format": "date-time" } }, { "name": "max_gas_price", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "max_inflation_rate", "required": false, "schema": { "type": "array", "description": "Maximum inflation on the total supply every epoch.", "items": { "type": "integer", "format": "int32" } } }, { "name": "max_kickout_stake_perc", "required": false, "schema": { "type": "integer", "description": "Максимальный процент стейка валидаторов, которых будем исключать.", "format": "uint8" } }, { "name": "min_gas_price", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "minimum_stake_divisor", "required": false, "schema": { "type": "integer", "description": "Минимальный стейк, необходимый для стейкинга, — это последняя цена места, делённая на это число.", "format": "uint64" } }, { "name": "minimum_stake_ratio", "required": false, "schema": { "type": "array", "description": "Минимальное отношение s/s_total, которое может быть у производителя блоков.\nПодробнее см. ", "items": { "type": "integer", "format": "int32" } } }, { "name": "minimum_validators_per_shard", "required": false, "schema": { "type": "integer", "description": "Минимальное количество валидаторов, которое должно быть в каждом шарде", "format": "uint64" } }, { "name": "num_block_producer_seats", "required": false, "schema": { "type": "integer", "description": "Количество мест для производителей блоков в генезисе.", "format": "uint64" } }, { "name": "num_block_producer_seats_per_shard", "required": false, "schema": { "type": "array", "description": "Задаёт количество шардов и количество мест для производителей блоков на каждый шард в генезисе.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "num_blocks_per_year", "required": false, "schema": { "type": "integer", "description": "Ожидаемое количество блоков в год", "format": "uint64" } }, { "name": "online_max_threshold", "required": false, "schema": { "type": "array", "description": "Максимальный порог онлайна, выше которого валидатор получает полную награду.", "items": { "type": "integer", "format": "int32" } } }, { "name": "online_min_threshold", "required": false, "schema": { "type": "array", "description": "Минимальный порог онлайна, ниже которого валидатор не получает награду.", "items": { "type": "integer", "format": "int32" } } }, { "name": "protocol_reward_rate", "required": false, "schema": { "type": "array", "description": "Ставка казны протокола", "items": { "type": "integer", "format": "int32" } } }, { "name": "protocol_treasury_account", "required": false, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "protocol_upgrade_stake_threshold", "required": false, "schema": { "type": "array", "description": "Threshold of stake that needs to indicate that they ready for upgrade.", "items": { "type": "integer", "format": "int32" } } }, { "name": "protocol_version", "required": false, "schema": { "type": "integer", "description": "Текущая версия протокола", "format": "uint32" } }, { "name": "runtime_config", "required": false, "schema": { "type": "object", "description": "Представление, сохраняющее JSON-формат конфигурации рантайма.", "properties": [ { "name": "account_creation_config", "required": false, "schema": { "type": "object", "description": "Структура описывает конфигурацию создания новых аккаунтов." } }, { "name": "congestion_control_config", "required": false, "schema": { "type": "object", "description": "The configuration for congestion control. More info about congestion [here](https://near.github.io/nearcore/architecture/how/receipt-congestion.html?highlight=congestion#receipt-congestion)" } }, { "name": "storage_amount_per_byte", "required": false, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "transaction_costs", "required": false, "schema": { "type": "object", "description": "Describes different fees for the runtime" } }, { "name": "wasm_config", "required": false, "schema": { "type": "object", "description": "Конфигурация операций wasm." } }, { "name": "witness_config", "required": false, "schema": { "type": "object", "description": "Configuration specific to ChunkStateWitness." } } ] } }, { "name": "shard_layout", "required": false, "schema": { "type": "object", "description": "One of multiple possible types" } }, { "name": "shuffle_shard_assignment_for_chunk_producers", "required": false, "schema": { "type": "boolean", "description": "Если значение `true`, производители чанков перемешиваются между шардами. Иными словами, если\nраспределение шардов было `[S_0, S_1, S_2, S_3]`, где `S_i` — множество\nпроизводителей чанков для шарда `i`, то при включённом флаге\nраспределение может стать, например, `[S_2, S_0, S_3, S_1]`." } }, { "name": "target_validator_mandates_per_shard", "required": false, "schema": { "type": "integer", "description": "Целевое количество мандатов валидаторов чанков для каждого шарда.", "format": "uint64" } }, { "name": "transaction_validity_period", "required": false, "schema": { "type": "integer", "description": "Количество блоков, в течение которых заданная транзакция действительна", "format": "uint64" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Информация о разделённом хранилище - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_split_storage_info - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_split_storage_info.md # RPC протокола NEAR: Информация о разделённом хранилище Получить сведения о разделённом хранилище Изучите раскладку разделённого хранилища узла — границу между горячими недавними и холодными архивными данными. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_split_storage_info - https://docs.fastnear.com/ru/rpcs/protocol/EXPERIMENTAL_split_storage_info/other/EXPERIMENTAL_split_storage_info - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_split_storage_info ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/EXPERIMENTAL_split_storage_info.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_split_storage_info", "params": [] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_split_storage_info", "params": [] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_split_storage_info" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "description": "Empty array as this method takes no parameters", "example": [] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Contains the split storage information.", "properties": [ { "name": "cold_head_height", "required": false, "schema": { "type": "integer", "nullable": true, "format": "uint64" } }, { "name": "final_head_height", "required": false, "schema": { "type": "integer", "nullable": true, "format": "uint64" } }, { "name": "head_height", "required": false, "schema": { "type": "integer", "nullable": true, "format": "uint64" } }, { "name": "hot_db_kind", "required": false, "schema": { "type": "string", "nullable": true } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Цена газа - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/gas_price - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/gas_price.md # RPC протокола NEAR: Цена газа Получить текущую цену газа Получите текущую общесетевую цену газа для самого последнего блока. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/gas_price - https://docs.fastnear.com/ru/rpcs/protocol/gas_price/other/gas_price - https://docs.fastnear.com/ru/reference/operation/gas_price ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/gas_price.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "gas_price", "params": [ null ] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "gas_price", "params": [ null ] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "gas_price" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "example": [ null ], "items": { "nullable": true } } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "gas_price" ], "properties": [ { "name": "gas_price", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Цена газа по блоку - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/gas_price_by_block - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/gas_price_by_block.md # RPC протокола NEAR: Цена газа по блоку Получить цену газа по блоку Получите общесетевую цену газа на выбранном историческом блоке — по высоте или хешу. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/gas_price_by_block - https://docs.fastnear.com/ru/rpcs/protocol/gas_price_by_block/other/gas_price_by_block - https://docs.fastnear.com/ru/reference/operation/gas_price_by_block ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/gas_price_by_block.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "gas_price", "params": { "block_id": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "gas_price", "params": { "block_id": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, обязательный, integer | string): Высота блока (целое число) или хеш блока (строка). ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "gas_price" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "block_id" ], "properties": [ { "name": "block_id", "required": true, "schema": { "description": "Высота блока (целое число) или хеш блока (строка)", "oneOf": [ { "type": "integer", "description": "Высота блока" }, { "type": "string", "description": "Хеш блока в кодировке Base58" } ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "gas_price" ], "properties": [ { "name": "gas_price", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Конфигурация генезиса - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/genesis_config - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/genesis_config.md # RPC протокола NEAR: Конфигурация генезиса Получить конфигурацию генезиса Получите неизменяемую генезис-конфигурацию цепочки — начальные записи, настройки протокола и длину эпохи в блоке 0. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/genesis_config - https://docs.fastnear.com/ru/rpcs/protocol/genesis_config/other/genesis_config - https://docs.fastnear.com/ru/reference/operation/genesis_config ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/genesis_config.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "genesis_config", "params": [] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "genesis_config", "params": [] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "genesis_config" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "description": "Empty array as this method takes no parameters", "example": [] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "protocol_version", "genesis_time", "chain_id", "genesis_height", "num_block_producer_seats", "num_block_producer_seats_per_shard", "avg_hidden_validator_seats_per_shard", "dynamic_resharding", "epoch_length", "gas_limit", "min_gas_price", "max_gas_price", "block_producer_kickout_threshold", "chunk_producer_kickout_threshold", "gas_price_adjustment_rate", "валидаторы", "transaction_validity_period", "protocol_reward_rate", "max_inflation_rate", "total_supply", "num_blocks_per_year", "protocol_treasury_account", "fishermen_threshold" ], "properties": [ { "name": "avg_hidden_validator_seats_per_shard", "required": true, "schema": { "type": "array", "description": "Ожидаемое количество скрытых валидаторов на шард.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "block_producer_kickout_threshold", "required": true, "schema": { "type": "integer", "description": "Порог исключения производителей блоков, значение от 0 до 100.", "format": "uint8" } }, { "name": "chain_id", "required": true, "schema": { "type": "string", "description": "ID блокчейна. Должен быть уникальным для каждого блокчейна.\nЕсли у ваших testnet-блокчейнов chain ID не уникальны, вас ждут проблемы." } }, { "name": "chunk_producer_assignment_changes_limit", "required": false, "schema": { "type": "integer", "description": "Ограничивает число изменений шардов в распределении производителей чанков,\nесли алгоритм способен выбрать распределение с лучшим балансом\nчисла производителей чанков по шардам.", "format": "uint64", "default": 5 } }, { "name": "chunk_producer_kickout_threshold", "required": true, "schema": { "type": "integer", "description": "Threshold for kicking out chunk producers, between 0 and 100.", "format": "uint8" } }, { "name": "chunk_validator_only_kickout_threshold", "required": false, "schema": { "type": "integer", "description": "Порог исключения нод, которые являются только валидаторами чанков, значение от 0 до 100.", "format": "uint8", "default": 80 } }, { "name": "dynamic_resharding", "required": true, "schema": { "type": "boolean", "description": "Enable dynamic re-sharding." } }, { "name": "epoch_length", "required": true, "schema": { "type": "integer", "description": "Длина эпохи, измеряемая в высотах блоков.", "format": "uint64" } }, { "name": "fishermen_threshold", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "gas_limit", "required": true, "schema": { "type": "string", "description": "Количество газа" } }, { "name": "gas_price_adjustment_rate", "required": true, "schema": { "type": "array", "description": "Коэффициент корректировки цены газа", "items": { "type": "integer", "format": "int32" } } }, { "name": "genesis_height", "required": true, "schema": { "type": "integer", "description": "Высота генезис-блока.", "format": "uint64" } }, { "name": "genesis_time", "required": true, "schema": { "type": "string", "description": "Официальное время запуска блокчейна.", "format": "date-time" } }, { "name": "max_gas_price", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "max_inflation_rate", "required": true, "schema": { "type": "array", "description": "Maximum inflation on the total supply every epoch.", "items": { "type": "integer", "format": "int32" } } }, { "name": "max_kickout_stake_perc", "required": false, "schema": { "type": "integer", "description": "Максимальный процент стейка валидаторов, которых будем исключать.", "format": "uint8", "default": 100 } }, { "name": "min_gas_price", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "minimum_stake_divisor", "required": false, "schema": { "type": "integer", "description": "Минимальный стейк, необходимый для стейкинга, — это последняя цена места, делённая на это число.", "format": "uint64", "default": 10 } }, { "name": "minimum_stake_ratio", "required": false, "schema": { "type": "array", "description": "Минимальное отношение s/s_total, которое может быть у производителя блоков.\nПодробнее см. ", "items": { "type": "integer", "format": "int32" } } }, { "name": "minimum_validators_per_shard", "required": false, "schema": { "type": "integer", "description": "Минимальное количество валидаторов, которое должно быть в каждом шарде", "format": "uint64", "default": 1 } }, { "name": "num_block_producer_seats", "required": true, "schema": { "type": "integer", "description": "Количество мест для производителей блоков в генезисе.", "format": "uint64" } }, { "name": "num_block_producer_seats_per_shard", "required": true, "schema": { "type": "array", "description": "Задаёт количество шардов и количество мест для производителей блоков на каждый шард в генезисе.\nПрим.: не используется с protocol_feature_chunk_only_producers — заменено на minimum_validators_per_shard.\nПрим.: раньше не использовалось, так как все производители блоков выпускали чанки для всех шардов.", "items": { "type": "integer", "format": "uint64" } } }, { "name": "num_blocks_per_year", "required": true, "schema": { "type": "integer", "description": "Ожидаемое количество блоков в год", "format": "uint64" } }, { "name": "num_chunk_only_producer_seats", "required": false, "schema": { "type": "integer", "description": "Deprecated.", "format": "uint64", "default": 300 } }, { "name": "num_chunk_producer_seats", "required": false, "schema": { "type": "integer", "description": "Number of chunk producers.\nDon't mess it up with chunk-only producers feature which is deprecated.", "format": "uint64", "default": 100 } }, { "name": "num_chunk_validator_seats", "required": false, "schema": { "type": "integer", "format": "uint64", "default": 300 } }, { "name": "online_max_threshold", "required": false, "schema": { "type": "array", "description": "Максимальный порог онлайна, выше которого валидатор получает полную награду.", "items": { "type": "integer", "format": "int32" } } }, { "name": "online_min_threshold", "required": false, "schema": { "type": "array", "description": "Минимальный порог онлайна, ниже которого валидатор не получает награду.", "items": { "type": "integer", "format": "int32" } } }, { "name": "protocol_reward_rate", "required": true, "schema": { "type": "array", "description": "Ставка казны протокола", "items": { "type": "integer", "format": "int32" } } }, { "name": "protocol_treasury_account", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "protocol_upgrade_stake_threshold", "required": false, "schema": { "type": "array", "description": "Threshold of stake that needs to indicate that they ready for upgrade.", "items": { "type": "integer", "format": "int32" } } }, { "name": "protocol_version", "required": true, "schema": { "type": "integer", "description": "Версия протокола, для которой предназначен этот genesis.", "format": "uint32" } }, { "name": "shard_layout", "required": false, "schema": { "type": "object", "description": "One of multiple possible types", "default": { "V2": { "boundary_accounts": [], "id_to_index_map": { "0": 0 }, "index_to_id_map": { "0": 0 }, "shard_ids": [ 0 ], "version": 0 } } } }, { "name": "shuffle_shard_assignment_for_chunk_producers", "required": false, "schema": { "type": "boolean", "description": "Если значение `true`, производители чанков перемешиваются между шардами. Иными словами, если\nраспределение шардов было `[S_0, S_1, S_2, S_3]`, где `S_i` — множество\nпроизводителей чанков для шарда `i`, то при включённом флаге\nраспределение может стать, например, `[S_2, S_0, S_3, S_1]`.", "default": false } }, { "name": "target_validator_mandates_per_shard", "required": false, "schema": { "type": "integer", "description": "Целевое количество мандатов валидаторов чанков для каждого шарда.", "format": "uint64", "default": 68 } }, { "name": "total_supply", "required": true, "schema": { "type": "string", "description": "Amount in yoctoNEAR" } }, { "name": "transaction_validity_period", "required": true, "schema": { "type": "integer", "description": "Количество блоков, в течение которых заданная транзакция действительна", "format": "uint64" } }, { "name": "use_production_config", "required": false, "schema": { "type": "boolean", "description": "Используется только для тестов. Мы жёстко задаём часть конфигурации для mainnet и testnet\nв AllEpochConfig, и нам нужен способ протестировать этот путь в коде. Для этого и служит этот флаг.\nЕсли установить `true`, узел будет использовать тот же путь переопределения конфигурации, что и mainnet и testnet.", "default": false } }, { "name": "валидаторы", "required": true, "schema": { "type": "array", "description": "Список начальных валидаторов.", "items": { "type": "object", "description": "Информация об аккаунтах валидаторов" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Состояние узла - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/health - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/health.md # RPC протокола NEAR: Состояние узла Проверить состояние узла Проверьте работоспособность узла — `null` при успехе, ошибка при проблемах. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/health - https://docs.fastnear.com/ru/rpcs/protocol/health/other/health - https://docs.fastnear.com/ru/reference/operation/health ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/health.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "health", "params": [] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "health", "params": [] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "health" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "description": "Empty array as this method takes no parameters", "example": [] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Статус состояния узла" } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Последний блок - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/latest_block - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/latest_block.md # RPC протокола NEAR: Последний блок Получить последний блок Получите последний финализированный блок — финальность выбирается автоматически, ID блока не требуется. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/latest_block - https://docs.fastnear.com/ru/rpcs/protocol/latest_block/other/latest_block - https://docs.fastnear.com/ru/reference/operation/latest_block ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/latest_block.yaml` ## Сети - Архивный RPC mainnet: https://rpc.mainnet.fastnear.com/ - Архивный RPC testnet: https://rpc.testnet.fastnear.com/ - Архивный RPC mainnet: https://archival-rpc.mainnet.fastnear.com/ - Архивный RPC testnet: https://archival-rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Архивный RPC mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "блок", "params": { "finality": "final" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "блок", "params": { "finality": "optimistic" } }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "блок" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "финальность" ], "properties": [ { "name": "финальность", "required": true, "schema": { "type": "string", "description": "Селектор финальности для последнего видимого блока", "enum": [ "final", "near-final", "optimistic" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object" } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Доказательство для лайт-клиента - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/light_client_proof - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/light_client_proof.md # RPC протокола NEAR: Доказательство для лайт-клиента Получить доказательство для лайт-клиента Получите Merkle-доказательство — по ID транзакции или квитанции в кодировке Base58 — того, что элемент был включён и исполнен, для верификации лайт-клиентом. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/light_client_proof - https://docs.fastnear.com/ru/rpcs/protocol/light_client_proof/other/light_client_proof - https://docs.fastnear.com/ru/reference/operation/light_client_proof ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/light_client_proof.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "light_client_proof", "params": { "type": "квитанция", "transaction_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx", "sender_id": "escrow.ai.near", "light_client_head": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "light_client_proof", "params": { "type": "квитанция", "transaction_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx", "sender_id": "escrow.ai.near", "light_client_head": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `light_client_head` (body, обязательный, string): Хеш в кодировке Base58. - `sender_id` (body, string): ID аккаунта NEAR. - `transaction_hash` (body, string): Хеш в кодировке Base58. - `type` (body, string): Предмет доказательства — `transaction` подтверждает включение транзакции верхнего уровня, `receipt` подтверждает включение конкретной квитанции, сформированной в ходе исполнения. - `receipt_id` (body, string): Base58-encoded hash - `receiver_id` (body, string): ID аккаунта NEAR ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "light_client_proof" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "light_client_head" ], "properties": [ { "name": "light_client_head", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "sender_id", "required": false, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "transaction_hash", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "type", "required": false, "schema": { "type": "string", "description": "Proof subject — `receipt` proves inclusion of a specific receipt produced during execution.", "enum": [ "квитанция" ] } }, { "name": "receipt_id", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "receiver_id", "required": false, "schema": { "type": "string", "description": "ID аккаунта NEAR" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "outcome_proof", "outcome_root_proof", "block_header_lite", "block_proof" ], "properties": [ { "name": "block_header_lite", "required": true, "schema": { "type": "object", "required": [ "prev_block_hash", "inner_rest_hash", "inner_lite" ], "properties": [ { "name": "inner_lite", "required": true, "schema": { "type": "object", "description": "Часть состояния для текущей головы лёгкого клиента. Подробнее [здесь](https://nomicon.io/ChainSpec/LightClient)." } }, { "name": "inner_rest_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } }, { "name": "block_proof", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "outcome_proof", "required": true, "schema": { "type": "object", "required": [ "доказательство", "block_hash", "id", "outcome" ], "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "id", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "outcome", "required": true, "schema": { "type": "object" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object" } } } ] } }, { "name": "outcome_root_proof", "required": true, "schema": { "type": "array", "items": { "type": "object" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Окна обслуживания - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/maintenance_windows - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/maintenance_windows.md # RPC протокола NEAR: Окна обслуживания Получить окна обслуживания Найдите предстоящие диапазоны блоков, когда валидатор может безопасно перезапуститься, не пропуская производство блоков. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/maintenance_windows - https://docs.fastnear.com/ru/rpcs/protocol/maintenance_windows/other/maintenance_windows - https://docs.fastnear.com/ru/reference/operation/maintenance_windows ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/maintenance_windows.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "maintenance_windows", "params": { "account_id": "root.near" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "maintenance_windows", "params": { "account_id": "root.near" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): ID аккаунта NEAR. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "maintenance_windows" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "account_id" ], "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "array", "items": { "type": "object", "required": [ "start", "end" ], "properties": [ { "name": "end", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "start", "required": true, "schema": { "type": "integer", "format": "uint64" } } ] } } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Метрики узла - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/metrics - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/metrics.md # RPC протокола NEAR: Метрики узла Получить метрики узла Соберите метрики узла в Prometheus-формате для мониторинга. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/metrics - https://docs.fastnear.com/ru/rpcs/protocol/metrics/other/metrics - https://docs.fastnear.com/ru/reference/operation/metrics ## Операция - Транспорт: json-rpc - Метод: GET - Путь: `/metrics` - Исходная спецификация: `rpcs/protocol/metrics.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "metrics", "params": {} } ``` ## Справка по запросу ## Справка по ответу - Статус: 200 - Тип данных: text/plain - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "string", "description": "Prometheus exposition text", "example": "# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.\n# TYPE process_cpu_seconds_total counter\nprocess_cpu_seconds_total 12.34" } ``` --- ## RPC протокола NEAR: Сведения о сети - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/network_info - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/network_info.md # RPC протокола NEAR: Сведения о сети Получить сведения о сети Получите список активных подключений к пирам узла и отслеживаемых им производителей блоков. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/network_info - https://docs.fastnear.com/ru/rpcs/protocol/network_info/other/network_info - https://docs.fastnear.com/ru/reference/operation/network_info ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/network_info.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "network_info", "params": [] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "network_info", "params": [] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "network_info" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "description": "Empty array as this method takes no parameters", "example": [] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "active_peers", "num_active_peers", "peer_max_count", "sent_bytes_per_sec", "received_bytes_per_sec", "known_producers" ], "properties": [ { "name": "active_peers", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "known_producers", "required": true, "schema": { "type": "array", "description": "Аккаунты известных производителей блоков и чанков из таблицы маршрутизации.", "items": { "type": "object" } } }, { "name": "num_active_peers", "required": true, "schema": { "type": "integer", "format": "uint" } }, { "name": "peer_max_count", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "received_bytes_per_sec", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "sent_bytes_per_sec", "required": true, "schema": { "type": "integer", "format": "uint64" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Следующий блок для лайт-клиента - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/next_light_client_block - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/next_light_client_block.md # RPC протокола NEAR: Следующий блок для лайт-клиента Получить следующий блок для лайт-клиента Получите следующий заголовок блока для лайт-клиента после известного хеша вершины его верифицированной цепочки в кодировке Base58. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/next_light_client_block - https://docs.fastnear.com/ru/rpcs/protocol/next_light_client_block/other/next_light_client_block - https://docs.fastnear.com/ru/reference/operation/next_light_client_block ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/next_light_client_block.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "next_light_client_block", "params": { "last_block_hash": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "next_light_client_block", "params": { "last_block_hash": "9XN7MtDywZvfGx6TKy1MT2iCZkKuHikJXmNazxdZ4x6T" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `last_block_hash` (body, обязательный, string): Хеш в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "next_light_client_block" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "last_block_hash" ], "properties": [ { "name": "last_block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Состояние для текущей головы лёгкого клиента. Подробнее [здесь](https://nomicon.io/ChainSpec/LightClient).", "properties": [ { "name": "approvals_after_next", "required": false, "schema": { "type": "array", "items": { "type": "string", "nullable": true, "description": "Base58-encoded cryptographic signature" } } }, { "name": "inner_lite", "required": false, "schema": { "type": "object", "description": "Часть состояния для текущей головы лёгкого клиента. Подробнее [здесь](https://nomicon.io/ChainSpec/LightClient).", "required": [ "height", "epoch_id", "next_epoch_id", "prev_state_root", "outcome_root", "timestamp", "timestamp_nanosec", "next_bp_hash", "block_merkle_root" ], "properties": [ { "name": "block_merkle_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "epoch_id", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "next_bp_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "next_epoch_id", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "outcome_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "prev_state_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "timestamp", "required": true, "schema": { "type": "integer", "description": "Legacy json number. Should not be used.", "format": "uint64" } }, { "name": "timestamp_nanosec", "required": true, "schema": { "type": "string" } } ] } }, { "name": "inner_rest_hash", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "next_block_inner_hash", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "next_bps", "required": false, "schema": { "type": "array", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Статус узла - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/status - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/protocol/status.md # RPC протокола NEAR: Статус узла Получить статус узла Получите версию узла, прогресс синхронизации и последний обработанный блок в одном ответе. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/protocol/status - https://docs.fastnear.com/ru/rpcs/protocol/status/other/status - https://docs.fastnear.com/ru/reference/operation/status ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/protocol/status.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "статус", "params": [] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "статус", "params": [] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "статус" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "description": "Empty array as this method takes no parameters", "example": [] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "version", "chain_id", "protocol_version", "latest_protocol_version", "валидаторы", "sync_info", "node_public_key", "uptime_sec", "genesis_hash" ], "properties": [ { "name": "chain_id", "required": true, "schema": { "type": "string", "description": "Unique chain id." } }, { "name": "detailed_debug_status", "required": false, "schema": { "type": "object", "nullable": true, "required": [ "network_info", "sync_status", "catchup_status", "current_head_status", "current_header_head_status", "block_production_delay_millis" ], "properties": [ { "name": "block_production_delay_millis", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "catchup_status", "required": true, "schema": { "type": "array", "items": { "type": "object" } } }, { "name": "current_head_status", "required": true, "schema": { "type": "object", "description": "Высота и хеш блока" } }, { "name": "current_header_head_status", "required": true, "schema": { "type": "object", "description": "Высота и хеш блока" } }, { "name": "network_info", "required": true, "schema": { "type": "object" } }, { "name": "sync_status", "required": true, "schema": { "type": "string" } } ] } }, { "name": "genesis_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "latest_protocol_version", "required": true, "schema": { "type": "integer", "description": "Последняя версия протокола, поддерживаемая этим клиентом.", "format": "uint32" } }, { "name": "node_key", "required": false, "schema": { "type": "string", "nullable": true, "description": "Публичный ключ с префиксом ed25519: или secp256k1:" } }, { "name": "node_public_key", "required": true, "schema": { "type": "string", "description": "Публичный ключ с префиксом ed25519: или secp256k1:" } }, { "name": "protocol_version", "required": true, "schema": { "type": "integer", "description": "Текущая активная версия протокола.", "format": "uint32" } }, { "name": "rpc_addr", "required": false, "schema": { "type": "string", "nullable": true, "description": "Адрес RPC-сервера. None, если у узла не включён RPC-эндпоинт." } }, { "name": "sync_info", "required": true, "schema": { "type": "object", "description": "Статус синхронизации узла.", "required": [ "latest_block_hash", "latest_block_height", "latest_state_root", "latest_block_time", "syncing" ], "properties": [ { "name": "earliest_block_hash", "required": false, "schema": { "type": "string", "nullable": true, "description": "Base58-encoded hash" } }, { "name": "earliest_block_height", "required": false, "schema": { "type": "integer", "nullable": true, "format": "uint64" } }, { "name": "earliest_block_time", "required": false, "schema": { "type": "string", "nullable": true } }, { "name": "epoch_id", "required": false, "schema": { "type": "string", "nullable": true, "description": "Base58-encoded epoch identifier hash" } }, { "name": "epoch_start_height", "required": false, "schema": { "type": "integer", "nullable": true, "format": "uint64" } }, { "name": "latest_block_hash", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "latest_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "latest_block_time", "required": true, "schema": { "type": "string" } }, { "name": "latest_state_root", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "syncing", "required": true, "schema": { "type": "boolean" } } ] } }, { "name": "uptime_sec", "required": true, "schema": { "type": "integer", "description": "Uptime of the node.", "format": "int64" } }, { "name": "validator_account_id", "required": false, "schema": { "type": "string", "nullable": true, "description": "ID аккаунта NEAR" } }, { "name": "validator_public_key", "required": false, "schema": { "type": "string", "nullable": true, "description": "Публичный ключ с префиксом ed25519: или secp256k1:" } }, { "name": "валидаторы", "required": true, "schema": { "type": "array", "description": "Валидаторы текущей эпохи.", "items": { "type": "object" } } }, { "name": "version", "required": true, "schema": { "type": "object", "description": "Data structure for semver version and github tag or commit.", "required": [ "version", "build", "commit" ], "properties": [ { "name": "build", "required": true, "schema": { "type": "string" } }, { "name": "commit", "required": true, "schema": { "type": "string" } }, { "name": "rustc_version", "required": false, "schema": { "type": "string", "default": "" } }, { "name": "version", "required": true, "schema": { "type": "string" } } ] } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Отправка транзакции (асинхронно) - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_async - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_async.md # RPC протокола NEAR: Отправка транзакции (асинхронно) Отправить транзакцию асинхронно Отправьте свежеподписанную транзакцию и сразу получите её хеш, без ожидания исполнения. Примеры по умолчанию служат только для иллюстрации и не являются повторно используемыми подписанными пакетами данных. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_async - https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_async/other/broadcast_tx_async - https://docs.fastnear.com/ru/reference/operation/broadcast_tx_async ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/transaction/broadcast_tx_async.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "broadcast_tx_async", "params": { "signed_tx_base64": "DgAAAG1pa2UubmVhcgCpPJgEEFUwQjFQvL8V3CnZ0h688WG5sVsKE8JYM37ax2cUjgEAAAAAAAAADQAAAG1pa2V0ZXN0Lm5lYXIPfFBmYNAIe2/MicVhDXbvT3w06LxS2OCF0UHIYgjNDQAAAHRlc3RpbmcgbWVtbwEAAAADAQAAAAAAAAAAAAAAAAAAAA==" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "broadcast_tx_async", "params": { "signed_tx_base64": "DgAAAG1pa2UubmVhcgCpPJgEEFUwQjFQvL8V3CnZ0h688WG5sVsKE8JYM37ax2cUjgEAAAAAAAAADQAAAG1pa2V0ZXN0Lm5lYXIPfFBmYNAIe2/MicVhDXbvT3w06LxS2OCF0UHIYgjNDQAAAHRlc3RpbmcgbWVtbwEAAAADAQAAAAAAAAAAAAAAAAAAAA==" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `signed_tx_base64` (body, обязательный, string): Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса. - `wait_until` (body, string): Желаемый уровень гарантии статуса исполнения. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "broadcast_tx_async" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "signed_tx_base64" ], "properties": [ { "name": "signed_tx_base64", "required": true, "schema": { "type": "string", "description": "Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса." } }, { "name": "wait_until", "required": false, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "default": "EXECUTED_OPTIMISTIC", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Отправка транзакции (с подтверждением) - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_commit - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_commit.md # RPC протокола NEAR: Отправка транзакции (с подтверждением) Отправить транзакцию и дождаться подтверждения Отправьте свежеподписанную транзакцию и дождитесь её коммита — это устаревший синхронный способ отправки, который заменён `send_tx`. Примеры по умолчанию служат только для иллюстрации и не являются повторно используемыми подписанными пакетами данных. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_commit - https://docs.fastnear.com/ru/rpcs/transaction/broadcast_tx_commit/other/broadcast_tx_commit - https://docs.fastnear.com/ru/reference/operation/broadcast_tx_commit ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/transaction/broadcast_tx_commit.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "broadcast_tx_commit", "params": { "signed_tx_base64": "DgAAAG1pa2UubmVhcgCpPJgEEFUwQjFQvL8V3CnZ0h688WG5sVsKE8JYM37ax2cUjgEAAAAAAAAADQAAAG1pa2V0ZXN0Lm5lYXIPfFBmYNAIe2/MicVhDXbvT3w06LxS2OCF0UHIYgjNDQAAAHRlc3RpbmcgbWVtbwEAAAADAQAAAAAAAAAAAAAAAAAAAA==" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "broadcast_tx_commit", "params": { "signed_tx_base64": "DgAAAG1pa2UubmVhcgCpPJgEEFUwQjFQvL8V3CnZ0h688WG5sVsKE8JYM37ax2cUjgEAAAAAAAAADQAAAG1pa2V0ZXN0Lm5lYXIPfFBmYNAIe2/MicVhDXbvT3w06LxS2OCF0UHIYgjNDQAAAHRlc3RpbmcgbWVtbwEAAAADAQAAAAAAAAAAAAAAAAAAAA==" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `signed_tx_base64` (body, обязательный, string): Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса. - `wait_until` (body, string): Желаемый уровень гарантии статуса исполнения. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "broadcast_tx_commit" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "signed_tx_base64" ], "properties": [ { "name": "signed_tx_base64", "required": true, "schema": { "type": "string", "description": "Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса." } }, { "name": "wait_until", "required": false, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "default": "EXECUTED_OPTIMISTIC", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "final_execution_status" ], "properties": [ { "name": "final_execution_status", "required": true, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } }, { "name": "квитанции", "required": false, "schema": { "type": "array", "description": "Квитанции, порождённые транзакцией", "items": { "type": "object" } } }, { "name": "receipts_outcome", "required": false, "schema": { "type": "array", "description": "Результаты исполнения квитанций.", "items": { "type": "object" } } }, { "name": "статус", "required": false, "schema": { "type": "object", "description": "One of multiple possible types" } }, { "name": "транзакция", "required": false, "schema": { "type": "object", "description": "Подписанная транзакция" } }, { "name": "transaction_outcome", "required": false, "schema": { "type": "object", "description": "Результат исполнения подписанной транзакции." } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Квитанция по ID - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_receipt - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_receipt.md # RPC протокола NEAR: Квитанция по ID Получить квитанцию по ID Получите одну квитанцию по её ID в кодировке Base58 — межшардовую единицу исполнения, производимую транзакцией. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_receipt - https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_receipt/other/EXPERIMENTAL_receipt - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_receipt ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/transaction/EXPERIMENTAL_receipt.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_receipt", "params": { "receipt_id": "ETMK9HmPsAYcNxfSXBejMWQs57W4Ph5HDYoYhDMpotQn" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_receipt", "params": { "receipt_id": "ETMK9HmPsAYcNxfSXBejMWQs57W4Ph5HDYoYhDMpotQn" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `receipt_id` (body, обязательный, string): Хеш в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_receipt" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "receipt_id" ], "properties": [ { "name": "receipt_id", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "predecessor_id", "receiver_id", "receipt_id", "квитанция" ], "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "priority", "required": false, "schema": { "type": "integer", "description": "Deprecated, retained for backward compatibility.", "format": "uint64", "default": 0 } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "One of multiple possible types" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string", "description": "Base58-encoded hash" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string", "description": "ID аккаунта NEAR" } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Подробный статус транзакции - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_tx_status - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_tx_status.md # RPC протокола NEAR: Подробный статус транзакции Получить подробный статус транзакции Получите полное дерево квитанций и результаты исполнения каждой квитанции по хешу в кодировке Base58 — богаче, чем `tx_status`. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_tx_status - https://docs.fastnear.com/ru/rpcs/transaction/EXPERIMENTAL_tx_status/other/EXPERIMENTAL_tx_status - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_tx_status ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/transaction/EXPERIMENTAL_tx_status.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_tx_status", "params": { "wait_until": "EXECUTED_OPTIMISTIC", "sender_account_id": "escrow.ai.near", "tx_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_tx_status", "params": { "wait_until": "EXECUTED_OPTIMISTIC", "sender_account_id": "escrow.ai.near", "tx_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `wait_until` (body, string): Желаемый уровень гарантии статуса исполнения. - `signed_tx_base64` (body, string): Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса. - `sender_account_id` (body, string): ID аккаунта NEAR. - `tx_hash` (body, string): Хеш в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_tx_status" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "properties": [ { "name": "wait_until", "required": false, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "default": "EXECUTED_OPTIMISTIC", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } }, { "name": "signed_tx_base64", "required": false, "schema": { "type": "string", "description": "Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса." } }, { "name": "sender_account_id", "required": false, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "final_execution_status" ], "properties": [ { "name": "final_execution_status", "required": true, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } }, { "name": "квитанции", "required": false, "schema": { "type": "array", "description": "Квитанции, порождённые транзакцией", "items": { "type": "object" } } }, { "name": "receipts_outcome", "required": false, "schema": { "type": "array", "description": "Результаты исполнения квитанций.", "items": { "type": "object" } } }, { "name": "статус", "required": false, "schema": { "type": "object", "description": "One of multiple possible types" } }, { "name": "транзакция", "required": false, "schema": { "type": "object", "description": "Подписанная транзакция" } }, { "name": "transaction_outcome", "required": false, "schema": { "type": "object", "description": "Результат исполнения подписанной транзакции." } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Отправить транзакцию - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/send_tx - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/send_tx.md # RPC протокола NEAR: Отправить транзакцию Отправить транзакцию Отправьте свежеподписанную транзакцию и дождитесь её итогового результата исполнения — это текущий синхронный способ отправки. Примеры по умолчанию служат только для иллюстрации и не являются повторно используемыми подписанными пакетами данных. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/transaction/send_tx - https://docs.fastnear.com/ru/rpcs/transaction/send_tx/other/send_tx - https://docs.fastnear.com/ru/reference/operation/send_tx ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/transaction/send_tx.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "send_tx", "params": { "signed_tx_base64": "ExampleBase64EncodedTransaction", "wait_until": "EXECUTED_OPTIMISTIC" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "send_tx", "params": { "signed_tx_base64": "ExampleBase64EncodedTransaction", "wait_until": "EXECUTED_OPTIMISTIC" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `signed_tx_base64` (body, обязательный, string): Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса. - `wait_until` (body, string): Желаемый уровень гарантии статуса исполнения. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "send_tx" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "signed_tx_base64" ], "properties": [ { "name": "signed_tx_base64", "required": true, "schema": { "type": "string", "description": "Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса." } }, { "name": "wait_until", "required": false, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "default": "EXECUTED_OPTIMISTIC", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "final_execution_status" ], "properties": [ { "name": "final_execution_status", "required": true, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } }, { "name": "квитанции", "required": false, "schema": { "type": "array", "description": "Квитанции, порождённые транзакцией", "items": { "type": "object" } } }, { "name": "receipts_outcome", "required": false, "schema": { "type": "array", "description": "Результаты исполнения квитанций.", "items": { "type": "object" } } }, { "name": "статус", "required": false, "schema": { "type": "object", "description": "One of multiple possible types" } }, { "name": "транзакция", "required": false, "schema": { "type": "object", "description": "Подписанная транзакция" } }, { "name": "transaction_outcome", "required": false, "schema": { "type": "object", "description": "Результат исполнения подписанной транзакции." } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Статус транзакции - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/tx_status - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/transaction/tx_status.md # RPC протокола NEAR: Статус транзакции Проверить статус транзакции Проверьте итоговый результат транзакции по её хешу в кодировке Base58 — успех, сбой или ещё не завершена. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/transaction/tx_status - https://docs.fastnear.com/ru/rpcs/transaction/tx_status/other/tx_status - https://docs.fastnear.com/ru/reference/operation/tx_status ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/transaction/tx_status.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "tx", "params": { "tx_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx", "sender_account_id": "escrow.ai.near" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "tx", "params": { "tx_hash": "34E7weKCDqXh3xPKdBgSWRqo44yTWjbka9deMK8JbAxx", "sender_account_id": "escrow.ai.near" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `wait_until` (body, string): Желаемый уровень гарантии статуса исполнения. - `signed_tx_base64` (body, string): Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса. - `sender_account_id` (body, string): ID аккаунта NEAR. - `tx_hash` (body, string): Хеш транзакции в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "tx" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "properties": [ { "name": "wait_until", "required": false, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "default": "EXECUTED_OPTIMISTIC", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } }, { "name": "signed_tx_base64", "required": false, "schema": { "type": "string", "description": "Подписанная транзакция в кодировке Base64. Сгенерируйте новый подписанный пакет данных для подписывающего аккаунта непосредственно перед отправкой или запросом статуса." } }, { "name": "sender_account_id", "required": false, "schema": { "type": "string", "description": "ID аккаунта NEAR" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string", "description": "Base58-encoded hash" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "required": [ "final_execution_status" ], "properties": [ { "name": "final_execution_status", "required": true, "schema": { "type": "string", "description": "Желаемый уровень гарантии статуса исполнения", "enum": [ "NONE", "INCLUDED", "INCLUDED_FINAL", "EXECUTED", "EXECUTED_OPTIMISTIC", "FINAL" ] } }, { "name": "квитанции", "required": false, "schema": { "type": "array", "description": "Квитанции, порождённые транзакцией", "items": { "type": "object" } } }, { "name": "receipts_outcome", "required": false, "schema": { "type": "array", "description": "Результаты исполнения квитанций.", "items": { "type": "object" } } }, { "name": "статус", "required": false, "schema": { "type": "object", "description": "One of multiple possible types" } }, { "name": "транзакция", "required": false, "schema": { "type": "object", "description": "Подписанная транзакция" } }, { "name": "transaction_outcome", "required": false, "schema": { "type": "object", "description": "Результат исполнения подписанной транзакции." } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Упорядоченные валидаторы - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/validators/EXPERIMENTAL_validators_ordered - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/validators/EXPERIMENTAL_validators_ordered.md # RPC протокола NEAR: Упорядоченные валидаторы Получить упорядоченных валидаторов Получите список валидаторов, упорядоченный по размеру стейка на выбранном блоке — шире, чем только активный набор. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/validators/EXPERIMENTAL_validators_ordered - https://docs.fastnear.com/ru/rpcs/validators/EXPERIMENTAL_validators_ordered/other/EXPERIMENTAL_validators_ordered - https://docs.fastnear.com/ru/reference/operation/EXPERIMENTAL_validators_ordered ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/validators/EXPERIMENTAL_validators_ordered.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_validators_ordered", "params": { "block_id": 194263739 } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "EXPERIMENTAL_validators_ordered", "params": { "block_id": 194263739 } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, integer | string): Высота блока (целое число) или хеш блока (строка). ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "EXPERIMENTAL_validators_ordered" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "properties": [ { "name": "block_id", "required": false, "schema": { "description": "Высота блока (целое число) или хеш блока (строка)", "oneOf": [ { "type": "integer", "description": "Высота блока" }, { "type": "string", "description": "Хеш блока в кодировке Base58" }, { "nullable": true } ] } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "array", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Валидаторы по эпохе - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/validators/validators_by_epoch - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/validators/validators_by_epoch.md # RPC протокола NEAR: Валидаторы по эпохе Получить валидаторов по эпохе Получите набор валидаторов выбранной прошлой эпохи по высоте начального блока или хеш-идентификатору эпохи в кодировке Base58. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/validators/validators_by_epoch - https://docs.fastnear.com/ru/rpcs/validators/validators_by_epoch/other/validators_by_epoch - https://docs.fastnear.com/ru/reference/operation/validators_by_epoch ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/validators/validators_by_epoch.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "валидаторы", "params": { "epoch_id": "4cPDvNDzf3zbKvAxPNWnNGGz8x2tty6xhowmsugAm3fo" } } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "валидаторы", "params": { "epoch_id": "4cPDvNDzf3zbKvAxPNWnNGGz8x2tty6xhowmsugAm3fo" } }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `epoch_id` (body, обязательный, string): Хеш-идентификатор эпохи в кодировке Base58. ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "валидаторы" ] } }, { "name": "params", "required": true, "schema": { "type": "object", "required": [ "epoch_id" ], "properties": [ { "name": "epoch_id", "required": true, "schema": { "type": "string", "description": "Base58-encoded epoch identifier hash" } } ] } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Информация о валидаторах текущей и следующей эпохи", "required": [ "current_validators", "next_validators", "current_fishermen", "next_fishermen", "current_proposals", "prev_epoch_kickout", "epoch_start_height", "epoch_height" ], "properties": [ { "name": "current_fishermen", "required": true, "schema": { "type": "array", "description": "Fishermen текущей эпохи", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "current_proposals", "required": true, "schema": { "type": "array", "description": "Заявки (proposals) в текущей эпохе", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "current_validators", "required": true, "schema": { "type": "array", "description": "Валидаторы текущей эпохи", "items": { "type": "object", "description": "Описывает сведения о валидаторе текущей эпохи" } } }, { "name": "epoch_height", "required": true, "schema": { "type": "integer", "description": "Epoch height", "format": "uint64" } }, { "name": "epoch_start_height", "required": true, "schema": { "type": "integer", "description": "Высота блока начала эпохи", "format": "uint64" } }, { "name": "next_fishermen", "required": true, "schema": { "type": "array", "description": "Fishermen for the next epoch", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "next_validators", "required": true, "schema": { "type": "array", "description": "Валидаторы следующей эпохи", "items": { "type": "object" } } }, { "name": "prev_epoch_kickout", "required": true, "schema": { "type": "array", "description": "Kickout in the previous epoch", "items": { "type": "object" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## RPC протокола NEAR: Текущие валидаторы - HTML-маршрут: https://docs.fastnear.com/ru/rpcs/validators/validators_current - Markdown-маршрут: https://docs.fastnear.com/ru/rpcs/validators/validators_current.md # RPC протокола NEAR: Текущие валидаторы Получить текущих валидаторов Получите активный набор валидаторов текущей эпохи со стейками и статистикой производительности. ## Ссылки на источник - https://docs.fastnear.com/ru/rpcs/validators/validators_current - https://docs.fastnear.com/ru/rpcs/validators/validators_current/other/validators_current - https://docs.fastnear.com/ru/reference/operation/validators_current ## Операция - Транспорт: json-rpc - Метод: POST - Путь: `/` - Исходная спецификация: `rpcs/validators/validators_current.yaml` ## Сети - Mainnet: https://rpc.mainnet.fastnear.com/ - Testnet: https://rpc.testnet.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Контракт OpenAPI описывает API-ключ FastNear как параметр запроса `apiKey`. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Финальность: final - Эндпоинт: https://rpc.mainnet.fastnear.com/ ### Тело запроса ```json { "jsonrpc": "2.0", "id": "fastnear", "method": "валидаторы", "params": [ null ] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "jsonrpc": "2.0", "id": "fastnear", "method": "валидаторы", "params": [ null ] }, "headers": {}, "path": {}, "query": {} } ``` ### Схема запроса ```json { "type": "object", "required": [ "jsonrpc", "id", "method", "params" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "type": "string", "example": "fastnear" } }, { "name": "method", "required": true, "schema": { "type": "string", "enum": [ "валидаторы" ] } }, { "name": "params", "required": true, "schema": { "type": "array", "example": [ null ], "items": { "nullable": true } } } ] } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Успешный ответ ### Схема ответа ```json { "type": "object", "required": [ "jsonrpc", "id" ], "properties": [ { "name": "jsonrpc", "required": true, "schema": { "type": "string", "enum": [ "2.0" ] } }, { "name": "id", "required": true, "schema": { "oneOf": [ { "type": "string" }, { "type": "number" } ] } }, { "name": "result", "required": false, "schema": { "type": "object", "description": "Информация о валидаторах текущей и следующей эпохи", "required": [ "current_validators", "next_validators", "current_fishermen", "next_fishermen", "current_proposals", "prev_epoch_kickout", "epoch_start_height", "epoch_height" ], "properties": [ { "name": "current_fishermen", "required": true, "schema": { "type": "array", "description": "Fishermen текущей эпохи", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "current_proposals", "required": true, "schema": { "type": "array", "description": "Заявки (proposals) в текущей эпохе", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "current_validators", "required": true, "schema": { "type": "array", "description": "Валидаторы текущей эпохи", "items": { "type": "object", "description": "Описывает сведения о валидаторе текущей эпохи" } } }, { "name": "epoch_height", "required": true, "schema": { "type": "integer", "description": "Epoch height", "format": "uint64" } }, { "name": "epoch_start_height", "required": true, "schema": { "type": "integer", "description": "Высота блока начала эпохи", "format": "uint64" } }, { "name": "next_fishermen", "required": true, "schema": { "type": "array", "description": "Fishermen for the next epoch", "items": { "type": "object", "description": "One of multiple possible types" } } }, { "name": "next_validators", "required": true, "schema": { "type": "array", "description": "Валидаторы следующей эпохи", "items": { "type": "object" } } }, { "name": "prev_epoch_kickout", "required": true, "schema": { "type": "array", "description": "Kickout in the previous epoch", "items": { "type": "object" } } } ] } }, { "name": "error", "required": false, "schema": { "type": "object", "properties": [ { "name": "код", "required": false, "schema": { "type": "integer" } }, { "name": "message", "required": false, "schema": { "type": "string" } }, { "name": "data", "required": false, "schema": { "type": "object" } } ] } } ], "refName": "JsonRpcResponse" } ``` --- ## FastNear API - Состояние - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/system/health - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/system/health.md # FastNear API - Состояние Проверить состояние сервиса Пинг FastNEAR API для проверки доступности — возвращает `{status: ok}` при успехе. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/system/health - https://docs.fastnear.com/ru/apis/fastnear/openapi/system/get_health ## Операция - Транспорт: http - Метод: GET - Путь: `/health` - Исходная спецификация: `apis/fastnear/system/health.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/health - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": {}, "query": {} } ``` ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Строка состояния сервиса ### Схема ответа ```json { "type": "object", "required": [ "статус" ], "additionalProperties": false, "properties": [ { "name": "статус", "required": true, "schema": { "type": "string" } } ], "refName": "HealthResponse" } ``` --- ## FastNear API - Статус - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/system/status - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/system/status.md # FastNear API - Статус Получить статус синхронизации сервиса Проверьте текущую индексированную высоту блока, задержку и версию развёрнутого сервиса. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/system/status - https://docs.fastnear.com/ru/apis/fastnear/openapi/system/get_status ## Операция - Транспорт: http - Метод: GET - Путь: `/status` - Исходная спецификация: `apis/fastnear/system/status.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/status - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": {}, "query": {} } ``` ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Текущий статус синхронизации FastNear API ### Схема ответа ```json { "type": "object", "required": [ "version", "sync_block_height", "sync_latency_sec", "sync_block_timestamp_nanosec", "sync_balance_block_height" ], "additionalProperties": false, "properties": [ { "name": "sync_balance_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "sync_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "sync_block_timestamp_nanosec", "required": true, "schema": { "type": "string" } }, { "name": "sync_latency_sec", "required": true, "schema": { "type": "number", "format": "double" } }, { "name": "version", "required": true, "schema": { "type": "string" } } ], "refName": "StatusResponse" } ``` --- ## FastNear API - V0 FT аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/account_ft - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/account_ft.md # FastNear API - V0 FT аккаунта Получить ID FT-контрактов аккаунта Получите ID FT-контрактов, которых касался аккаунт — только ID, без балансов. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v0/account_ft - https://docs.fastnear.com/ru/apis/fastnear/openapi/fungible-tokens/account_ft_v0 ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/account/{account_id}/ft` - Исходная спецификация: `apis/fastnear/v0/account_ft.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который передают встроенные клиенты портала. Публичный FastNear API его не требует. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v0/account/root.near/ft - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "account_id": "root.near" }, "query": {} } ``` ### Входные данные - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры пути - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который передают встроенные клиенты портала. Публичный FastNear API его не требует. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: ID FT-контрактов для запрошенного аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_id", "contract_ids" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "contract_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } } ], "refName": "V0ContractsResponse" } ``` --- ## FastNear API - V0 NFT аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/account_nft - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/account_nft.md # FastNear API - V0 NFT аккаунта Получить ID NFT-контрактов аккаунта Получите ID NFT-контрактов, которых касался аккаунт — только ID, без метаданных по высоте блока. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v0/account_nft - https://docs.fastnear.com/ru/apis/fastnear/openapi/non-fungible-tokens/account_nft_v0 ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/account/{account_id}/nft` - Исходная спецификация: `apis/fastnear/v0/account_nft.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который передают встроенные клиенты портала. Публичный FastNear API его не требует. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v0/account/root.near/nft - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "account_id": "root.near" }, "query": {} } ``` ### Входные данные - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры пути - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который передают встроенные клиенты портала. Публичный FastNear API его не требует. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: ID NFT-контрактов для запрошенного аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_id", "contract_ids" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "contract_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } } ], "refName": "V0ContractsResponse" } ``` --- ## FastNear API - V0 стейкинг аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/account_staking - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/account_staking.md # FastNear API - V0 стейкинг аккаунта Получить ID стейкинг-пулов аккаунта Получите ID стейкинг-пулов для одного аккаунта — только ID пулов, без метаданных по высоте блока. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v0/account_staking - https://docs.fastnear.com/ru/apis/fastnear/openapi/staking/account_staking_v0 ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/account/{account_id}/staking` - Исходная спецификация: `apis/fastnear/v0/account_staking.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который передают встроенные клиенты портала. Публичный FastNear API его не требует. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v0/account/root.near/staking - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "account_id": "root.near" }, "query": {} } ``` ### Входные данные - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры пути - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который передают встроенные клиенты портала. Публичный FastNear API его не требует. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: ID стейкинг-пулов для запрошенного аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_id", "pools" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "pools", "required": true, "schema": { "type": "array", "items": { "type": "string" } } } ], "refName": "V0StakingResponse" } ``` --- ## FastNear API - V0 Поиск по публичному ключу - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/public_key_lookup - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/public_key_lookup.md # FastNear API - V0 Поиск по публичному ключу Найти аккаунты полного доступа по публичному ключу Получите индексированные ID аккаунтов, связанные с публичным ключом полного доступа. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v0/public_key_lookup - https://docs.fastnear.com/ru/apis/fastnear/openapi/public-key/lookup_by_public_key_v0 ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/public_key/{public_key}` - Исходная спецификация: `apis/fastnear/v0/public_key_lookup.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v0/public_key/ed25519%3ACCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "public_key": "ed25519:CCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT" }, "query": {} } ``` ### Входные данные - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры пути - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Подходящие ID аккаунтов для переданного публичного ключа полного доступа ### Схема ответа ```json { "type": "object", "required": [ "public_key", "account_ids" ], "additionalProperties": false, "properties": [ { "name": "account_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "PublicKeyLookupResponse" } ``` --- ## FastNear API - V0 Поиск по публичному ключу (все) - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/public_key_lookup_all - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v0/public_key_lookup_all.md # FastNear API - V0 Поиск по публичному ключу (все) Найти все аккаунты по публичному ключу Получите все аккаунты, связанные с публичным ключом — ключи полного доступа и ключи с ограничениями вместе. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v0/public_key_lookup_all - https://docs.fastnear.com/ru/apis/fastnear/openapi/public-key/lookup_by_public_key_all_v0 ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/public_key/{public_key}/all` - Исходная спецификация: `apis/fastnear/v0/public_key_lookup_all.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v0/public_key/ed25519%3ACCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT/all - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "public_key": "ed25519:CCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT" }, "query": {} } ``` ### Входные данные - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры пути - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Подходящие ID аккаунтов для переданного публичного ключа, включая ключи ограниченного доступа ### Схема ответа ```json { "type": "object", "required": [ "public_key", "account_ids" ], "additionalProperties": false, "properties": [ { "name": "account_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "PublicKeyLookupResponse" } ``` --- ## FastNear API - V1 FT аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_ft - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_ft.md # FastNear API - V1 FT аккаунта Получить индексированные строки FT-токенов аккаунта Получите строки балансов FT-токенов аккаунта — каждая с ID контракта, балансом и высотой последнего обновления. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v1/account_ft - https://docs.fastnear.com/ru/apis/fastnear/openapi/fungible-tokens/account_ft_v1 ## Операция - Транспорт: http - Метод: GET - Путь: `/v1/account/{account_id}/ft` - Исходная спецификация: `apis/fastnear/v1/account_ft.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v1/account/root.near/ft - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "account_id": "root.near" }, "query": {} } ``` ### Входные данные - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры пути - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Индексированные строки FT-токенов для указанного аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_id", "токены" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "токены", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "contract_id", "last_update_block_height", "balance" ], "additionalProperties": false, "properties": [ { "name": "balance", "required": true, "schema": { "type": "string" } }, { "name": "contract_id", "required": true, "schema": { "type": "string" } }, { "name": "last_update_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "TokenRow" } } } ], "refName": "V1FtResponse" } ``` --- ## FastNear API - V1 Полный снимок аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_full - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_full.md # FastNear API - V1 Полный снимок аккаунта Получить полный индексированный снимок аккаунта Получите объединённое индексированное представление аккаунта, включая стейкинг-пулы, FT-балансы, NFT и состояние аккаунта. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v1/account_full - https://docs.fastnear.com/ru/apis/fastnear/openapi/accounts/account_full_v1 ## Операция - Транспорт: http - Метод: GET - Путь: `/v1/account/{account_id}/full` - Исходная спецификация: `apis/fastnear/v1/account_full.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v1/account/root.near/full - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "account_id": "root.near" }, "query": {} } ``` ### Входные данные - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры пути - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Полный индексированный снимок указанного аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_id", "pools", "токены", "nfts", "состояние" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "nfts", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "contract_id", "last_update_block_height" ], "additionalProperties": false, "properties": [ { "name": "contract_id", "required": true, "schema": { "type": "string" } }, { "name": "last_update_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "NftRow" } } }, { "name": "pools", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "pool_id", "last_update_block_height" ], "additionalProperties": false, "properties": [ { "name": "last_update_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "pool_id", "required": true, "schema": { "type": "string" } } ], "refName": "PoolRow" } } }, { "name": "состояние", "required": true, "schema": { "type": "object" } }, { "name": "токены", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "contract_id", "last_update_block_height", "balance" ], "additionalProperties": false, "properties": [ { "name": "balance", "required": true, "schema": { "type": "string" } }, { "name": "contract_id", "required": true, "schema": { "type": "string" } }, { "name": "last_update_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "TokenRow" } } } ], "refName": "AccountFullResponse" } ``` --- ## FastNear API - V1 NFT аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_nft - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_nft.md # FastNear API - V1 NFT аккаунта Получить индексированные строки NFT аккаунта Получите строки NFT-контрактов для аккаунта, каждая с метаданными по высоте блока. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v1/account_nft - https://docs.fastnear.com/ru/apis/fastnear/openapi/non-fungible-tokens/account_nft_v1 ## Операция - Транспорт: http - Метод: GET - Путь: `/v1/account/{account_id}/nft` - Исходная спецификация: `apis/fastnear/v1/account_nft.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v1/account/root.near/nft - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "account_id": "root.near" }, "query": {} } ``` ### Входные данные - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры пути - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Индексированные строки NFT-контрактов для указанного аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_id", "токены" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "токены", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "contract_id", "last_update_block_height" ], "additionalProperties": false, "properties": [ { "name": "contract_id", "required": true, "schema": { "type": "string" } }, { "name": "last_update_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "NftRow" } } } ], "refName": "V1NftResponse" } ``` --- ## FastNEAR API — V1 стейкинг аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_staking - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/account_staking.md # FastNEAR API — V1 стейкинг аккаунта Поиск индексированных стейкинг-пулов аккаунта Получите строки по стейкинг-пулам для аккаунта, каждая с метаданными по высоте блока. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v1/account_staking - https://docs.fastnear.com/ru/apis/fastnear/openapi/staking/account_staking_v1 ## Операция - Транспорт: http - Метод: GET - Путь: `/v1/account/{account_id}/staking` - Исходная спецификация: `apis/fastnear/v1/account_staking.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, передаваемый встраиваемыми клиентами портала. Публичный FastNEAR API его не требует. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v1/account/root.near/staking - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "account_id": "root.near" }, "query": {} } ``` ### Входные данные - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры пути - `account_id` (путь, обязательный, string): ID аккаунта NEAR для проверки. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, передаваемый встраиваемыми клиентами портала. Публичный FastNEAR API его не требует. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Индексированные записи стейкинг-пулов для указанного аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_id", "pools" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "pools", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "pool_id", "last_update_block_height" ], "additionalProperties": false, "properties": [ { "name": "last_update_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "pool_id", "required": true, "schema": { "type": "string" } } ], "refName": "PoolRow" } } } ], "refName": "V1StakingResponse" } ``` --- ## FastNEAR API — V1 топ держателей FT - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/ft_top - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/ft_top.md # FastNEAR API — V1 топ держателей FT Поиск индексированных топ-держателей FT-токена Получите список держателей с наибольшим балансом для FT-контракта, отсортированный по убыванию баланса. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v1/ft_top - https://docs.fastnear.com/ru/apis/fastnear/openapi/fungible-tokens/ft_top_v1 ## Операция - Транспорт: http - Метод: GET - Путь: `/v1/ft/{token_id}/top` - Исходная спецификация: `apis/fastnear/v1/ft_top.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, передаваемый встраиваемыми клиентами портала. Публичный FastNEAR API его не требует. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v1/ft/wrap.near/top - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "token_id": "wrap.near" }, "query": {} } ``` ### Входные данные - `token_id` (путь, обязательный, string): ID аккаунта контракта FT-токена. ### Параметры пути - `token_id` (путь, обязательный, string): ID аккаунта контракта FT-токена. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, передаваемый встраиваемыми клиентами портала. Публичный FastNEAR API его не требует. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Индексированные топ-держатели указанного FT-токена ### Схема ответа ```json { "type": "object", "required": [ "token_id", "аккаунтов" ], "additionalProperties": false, "properties": [ { "name": "аккаунтов", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "account_id", "balance" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "balance", "required": true, "schema": { "type": "string" } } ], "refName": "AccountBalanceRow" } } }, { "name": "token_id", "required": true, "schema": { "type": "string" } } ], "refName": "TokenAccountsResponse" } ``` --- ## FastNear API - V1 Поиск по публичному ключу - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/public_key_lookup - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/public_key_lookup.md # FastNear API - V1 Поиск по публичному ключу Найти аккаунты полного доступа по публичному ключу Получите индексированные ID аккаунтов, связанные с публичным ключом полного доступа. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v1/public_key_lookup - https://docs.fastnear.com/ru/apis/fastnear/openapi/public-key/lookup_by_public_key_v1 ## Операция - Транспорт: http - Метод: GET - Путь: `/v1/public_key/{public_key}` - Исходная спецификация: `apis/fastnear/v1/public_key_lookup.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v1/public_key/ed25519%3ACCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "public_key": "ed25519:CCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT" }, "query": {} } ``` ### Входные данные - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры пути - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Подходящие ID аккаунтов для переданного публичного ключа полного доступа ### Схема ответа ```json { "type": "object", "required": [ "public_key", "account_ids" ], "additionalProperties": false, "properties": [ { "name": "account_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "PublicKeyLookupResponse" } ``` --- ## FastNear API - V1 Поиск по публичному ключу (все) - HTML-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/public_key_lookup_all - Markdown-маршрут: https://docs.fastnear.com/ru/apis/fastnear/v1/public_key_lookup_all.md # FastNear API - V1 Поиск по публичному ключу (все) Найти все индексированные аккаунты по публичному ключу Получите все аккаунты, связанные с публичным ключом — ключи полного доступа и ключи с ограничениями вместе. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/fastnear/v1/public_key_lookup_all - https://docs.fastnear.com/ru/apis/fastnear/openapi/public-key/lookup_by_public_key_all_v1 ## Операция - Транспорт: http - Метод: GET - Путь: `/v1/public_key/{public_key}/all` - Исходная спецификация: `apis/fastnear/v1/public_key_lookup_all.yaml` ## Сети - Mainnet: https://api.fastnear.com/ - Testnet: https://test.api.fastnear.com/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://api.fastnear.com/v1/public_key/ed25519%3ACCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT/all - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "public_key": "ed25519:CCaThr3uokqnUs6Z5vVnaDcJdrfuTpYJHJWcAGubDjT" }, "query": {} } ``` ### Входные данные - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры пути - `public_key` (путь, обязательный, string): Публичный ключ NEAR в формате `ed25519:...` или `secp256k1:...`. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ, который могут передавать встроенные клиенты портала. Публичный FastNear API не требует его. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Подходящие ID аккаунтов для переданного публичного ключа, включая ключи ограниченного доступа ### Схема ответа ```json { "type": "object", "required": [ "public_key", "account_ids" ], "additionalProperties": false, "properties": [ { "name": "account_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "PublicKeyLookupResponse" } ``` --- ## KV FastData API - Последние ключи по вызывающему аккаунту - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/all_by_predecessor - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/all_by_predecessor.md # KV FastData API - Последние ключи по вызывающему аккаунту Получить последние строки «ключ-значение» для одного вызывающего аккаунта по всем контрактам Получите последние значения для всех контрактов, к которым обращался один вызывающий аккаунт. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/all_by_predecessor - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/latest/all_by_predecessor ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/all/{predecessor_id}` - Исходная спецификация: `apis/kv-fastdata/v0/all_by_predecessor.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://kv.main.fastnear.com/v0/all/james.near - Активный пример: Mainnet ### Тело запроса ```json { "include_metadata": true, "limit": 50 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "include_metadata": true, "limit": 50 }, "headers": {}, "path": { "predecessor_id": "james.near" }, "query": {} } ``` ### Входные данные - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. - `include_metadata` (body, boolean): Добавить в каждую запись метаданные квитанции и подписанта. - `limit` (body, integer): Maximum number of entries to return in one page (1–200, default 50). - `page_token` (body, string): Непрозрачный токен страницы из предыдущего ответа `/v0/all/{predecessor_id}`. ### Схема запроса ```json { "type": "object", "additionalProperties": false, "properties": [ { "name": "include_metadata", "required": false, "schema": { "type": "boolean", "description": "Включать в каждую запись метаданные квитанции и подписанта.", "default": false } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum number of entries to return in one page (1–200, default 50).", "format": "int32" } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Непрозрачный токен страницы из предыдущего ответа `/v0/all/{predecessor_id}`." } } ], "refName": "AllRequest" } ``` ### Параметры пути - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Последние строки для выбранного вызывающего аккаунта ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - История по точному ключу - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/get_history_key - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/get_history_key.md # KV FastData API - История по точному ключу Получить исторические строки для одного точного ключа в рамках одного вызывающего аккаунта и контракта Получите каждую историческую запись для одного точного ключа под одним вызывающим аккаунтом и контрактом. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/get_history_key - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/history/get_history_key ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/history/{current_account_id}/{predecessor_id}/{key}` - Исходная спецификация: `apis/kv-fastdata/v0/get_history_key.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://kv.main.fastnear.com/v0/history/social.near/james.near/%7Bkey%7D - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "current_account_id": "social.near", "predecessor_id": "james.near", "key": "graph/follow/sleet.near" }, "query": {} } ``` ### Входные данные - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. - `ключ` (путь, обязательный, string): Точный ключ FastData, который нужно вернуть. ### Параметры пути - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. - `ключ` (путь, обязательный, string): Точный ключ FastData, который нужно вернуть. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Исторические строки для выбранного вызывающего аккаунта, контракта и ключа ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - Последнее значение по точному ключу - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/get_latest_key - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/get_latest_key.md # KV FastData API - Последнее значение по точному ключу Получить последнюю строку для одного точного ключа в рамках одного вызывающего аккаунта и контракта Получите последнее значение для одного точного ключа под одним вызывающим аккаунтом и контрактом. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/get_latest_key - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/latest/get_latest_key ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/latest/{current_account_id}/{predecessor_id}/{key}` - Исходная спецификация: `apis/kv-fastdata/v0/get_latest_key.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://kv.main.fastnear.com/v0/latest/social.near/james.near/%7Bkey%7D - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "current_account_id": "social.near", "predecessor_id": "james.near", "key": "graph/follow/sleet.near" }, "query": {} } ``` ### Входные данные - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. - `ключ` (путь, обязательный, string): Точный ключ FastData, который нужно вернуть. ### Параметры пути - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. - `ключ` (путь, обязательный, string): Точный ключ FastData, который нужно вернуть. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Последняя строка для выбранного вызывающего аккаунта, контракта и ключа ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - История по аккаунту - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_account - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_account.md # KV FastData API - История по аккаунту Получить историю записей «ключ-значение» для одного контракта по всем вызывающим аккаунтам Получите исторические строки FastData для одного целевого аккаунта по всем вызывающим аккаунтам. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_account - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/history/history_by_account ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/history/{current_account_id}` - Исходная спецификация: `apis/kv-fastdata/v0/history_by_account.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://kv.main.fastnear.com/v0/history/social.near - Активный пример: Mainnet ### Тело запроса ```json { "asc": true, "include_metadata": true, "key_prefix": "graph/follow/sleet.near", "limit": 10 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "asc": true, "include_metadata": true, "key_prefix": "graph/follow/sleet.near", "limit": 10 }, "headers": {}, "path": { "current_account_id": "social.near" }, "query": {} } ``` ### Входные данные - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `asc` (body, boolean): Сортировать результаты истории по возрастанию. По умолчанию сначала идут новые записи. - `include_metadata` (body, boolean): Добавить в каждую запись метаданные квитанции и подписанта. - `ключ` (body, string): Фильтр по точному ключу. Взаимно исключающий с `key_prefix`. - `key_prefix` (body, string): Фильтр по префиксу для совпадения пространств имён ключей. - `limit` (body, integer): Maximum number of entries to return in one page (1–200, default 50). - `page_token` (body, string): Непрозрачный токен страницы из предыдущего ответа с тем же эндпоинтом и набором фильтров. ### Схема запроса ```json { "type": "object", "additionalProperties": false, "properties": [ { "name": "asc", "required": false, "schema": { "type": "boolean", "description": "Сортировать по возрастанию для эндпоинтов истории. По умолчанию — от новых к старым.", "default": false } }, { "name": "include_metadata", "required": false, "schema": { "type": "boolean", "description": "Включать в каждую запись метаданные квитанции и подписанта.", "default": false } }, { "name": "ключ", "required": false, "schema": { "type": "string", "description": "Фильтр по точному ключу. Взаимно исключающий с `key_prefix`." } }, { "name": "key_prefix", "required": false, "schema": { "type": "string", "description": "Фильтр по префиксу для сопоставления пространств имён ключей." } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum number of entries to return in one page (1–200, default 50).", "format": "int32" } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Непрозрачный токен страницы из предыдущего ответа того же эндпоинта и набора фильтров." } } ], "refName": "QueryRequest" } ``` ### Параметры пути - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Исторические строки для выбранного контракта ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - История по глобальному ключу - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_key - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_key.md # KV FastData API - История по глобальному ключу Получить историю по точному ключу во всех индексированных контрактах Получите исторические значения выбранного ключа по аккаунтам и вызывающим аккаунтам. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_key - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/history/history_by_key ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/history` - Исходная спецификация: `apis/kv-fastdata/v0/history_by_key.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://kv.main.fastnear.com/v0/history - Активный пример: Mainnet ### Тело запроса ```json { "asc": true, "include_metadata": false, "limit": 50 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "asc": true, "include_metadata": false, "key": "graph/follow/sleet.near", "limit": 50 }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `asc` (body, boolean): Сортировать результаты истории по возрастанию. По умолчанию сначала идут новые записи. - `include_metadata` (body, boolean): Добавить в каждую запись метаданные квитанции и подписанта. - `ключ` (body, обязательный, string): Точное имя ключа для сопоставления по всем аккаунтам и предшественникам. - `limit` (body, integer): Maximum number of entries to return in one page (1–200, default 50). - `page_token` (body, string): Непрозрачный токен страницы из предыдущего ответа с тем же эндпоинтом и набором фильтров. ### Схема запроса ```json { "type": "object", "required": [ "ключ" ], "additionalProperties": false, "properties": [ { "name": "asc", "required": false, "schema": { "type": "boolean", "description": "Сортировать результаты истории по возрастанию. По умолчанию — от новых к старым.", "default": false } }, { "name": "include_metadata", "required": false, "schema": { "type": "boolean", "description": "Включать в каждую запись метаданные квитанции и подписанта.", "default": false } }, { "name": "ключ", "required": true, "schema": { "type": "string", "description": "Точное имя ключа для сопоставления по всем аккаунтам и предшественникам." } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum number of entries to return in one page (1–200, default 50).", "format": "int32" } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Непрозрачный токен страницы из предыдущего ответа того же эндпоинта и набора фильтров." } } ], "refName": "ByKeyRequest" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Исторические строки для выбранного ключа ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - История по вызывающему аккаунту - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_predecessor - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_predecessor.md # KV FastData API - История по вызывающему аккаунту Получить историю записей «ключ-значение» для одного вызывающего аккаунта и контракта Получите исторические строки FastData для одного вызывающего аккаунта и целевого аккаунта. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/history_by_predecessor - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/history/history_by_predecessor ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/history/{current_account_id}/{predecessor_id}` - Исходная спецификация: `apis/kv-fastdata/v0/history_by_predecessor.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://kv.main.fastnear.com/v0/history/social.near/james.near - Активный пример: Mainnet ### Тело запроса ```json { "asc": false, "include_metadata": true, "key_prefix": "graph/follow/", "limit": 50 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "asc": false, "include_metadata": true, "key_prefix": "graph/follow/", "limit": 50 }, "headers": {}, "path": { "current_account_id": "social.near", "predecessor_id": "james.near" }, "query": {} } ``` ### Входные данные - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. - `asc` (body, boolean): Сортировать результаты истории по возрастанию. По умолчанию сначала идут новые записи. - `include_metadata` (body, boolean): Добавить в каждую запись метаданные квитанции и подписанта. - `ключ` (body, string): Фильтр по точному ключу. Взаимно исключающий с `key_prefix`. - `key_prefix` (body, string): Фильтр по префиксу для совпадения пространств имён ключей. - `limit` (body, integer): Maximum number of entries to return in one page (1–200, default 50). - `page_token` (body, string): Непрозрачный токен страницы из предыдущего ответа с тем же эндпоинтом и набором фильтров. ### Схема запроса ```json { "type": "object", "additionalProperties": false, "properties": [ { "name": "asc", "required": false, "schema": { "type": "boolean", "description": "Сортировать по возрастанию для эндпоинтов истории. По умолчанию — от новых к старым.", "default": false } }, { "name": "include_metadata", "required": false, "schema": { "type": "boolean", "description": "Включать в каждую запись метаданные квитанции и подписанта.", "default": false } }, { "name": "ключ", "required": false, "schema": { "type": "string", "description": "Фильтр по точному ключу. Взаимно исключающий с `key_prefix`." } }, { "name": "key_prefix", "required": false, "schema": { "type": "string", "description": "Фильтр по префиксу для сопоставления пространств имён ключей." } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum number of entries to return in one page (1–200, default 50).", "format": "int32" } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Непрозрачный токен страницы из предыдущего ответа того же эндпоинта и набора фильтров." } } ], "refName": "QueryRequest" } ``` ### Параметры пути - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Исторические строки для выбранного вызывающего аккаунта и аккаунта контракта ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - Последние значения по аккаунту - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/latest_by_account - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/latest_by_account.md # KV FastData API - Последние значения по аккаунту Получить последние строки «ключ-значение» для одного контракта по всем вызывающим аккаунтам Получите последние строки FastData для одного целевого аккаунта по всем вызывающим аккаунтам. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/latest_by_account - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/latest/latest_by_account ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/latest/{current_account_id}` - Исходная спецификация: `apis/kv-fastdata/v0/latest_by_account.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://kv.main.fastnear.com/v0/latest/social.near - Активный пример: Mainnet ### Тело запроса ```json { "include_metadata": true, "key_prefix": "graph/follow/", "limit": 50 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "include_metadata": true, "key_prefix": "graph/follow/", "limit": 50 }, "headers": {}, "path": { "current_account_id": "social.near" }, "query": {} } ``` ### Входные данные - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `include_metadata` (body, boolean): Добавить в каждую запись метаданные квитанции и подписанта. - `ключ` (body, string): Фильтр по точному ключу. Взаимно исключающий с `key_prefix`. - `key_prefix` (body, string): Фильтр по префиксу для совпадения пространств имён ключей. - `limit` (body, integer): Maximum number of entries to return in one page (1–200, default 50). - `page_token` (body, string): Непрозрачный токен страницы из предыдущего ответа с тем же эндпоинтом и набором фильтров. ### Схема запроса ```json { "type": "object", "additionalProperties": false, "properties": [ { "name": "include_metadata", "required": false, "schema": { "type": "boolean", "description": "Включать в каждую запись метаданные квитанции и подписанта.", "default": false } }, { "name": "ключ", "required": false, "schema": { "type": "string", "description": "Фильтр по точному ключу. Взаимно исключающий с `key_prefix`." } }, { "name": "key_prefix", "required": false, "schema": { "type": "string", "description": "Фильтр по префиксу для сопоставления пространств имён ключей." } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum number of entries to return in one page (1–200, default 50).", "format": "int32" } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Непрозрачный токен страницы из предыдущего ответа того же эндпоинта и набора фильтров." } } ], "refName": "LatestRequest" } ``` ### Параметры пути - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Последние строки для выбранного контракта ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - Последние значения по вызывающему аккаунту - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/latest_by_predecessor - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/latest_by_predecessor.md # KV FastData API - Последние значения по вызывающему аккаунту Получить последние строки «ключ-значение» для одного вызывающего аккаунта и контракта Получите последние строки FastData для одного вызывающего аккаунта и целевого аккаунта. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/latest_by_predecessor - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/latest/latest_by_predecessor ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/latest/{current_account_id}/{predecessor_id}` - Исходная спецификация: `apis/kv-fastdata/v0/latest_by_predecessor.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://kv.main.fastnear.com/v0/latest/social.near/james.near - Активный пример: Mainnet ### Тело запроса ```json { "include_metadata": true, "key_prefix": "graph/follow/", "limit": 50 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "include_metadata": true, "key_prefix": "graph/follow/", "limit": 50 }, "headers": {}, "path": { "current_account_id": "social.near", "predecessor_id": "james.near" }, "query": {} } ``` ### Входные данные - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. - `include_metadata` (body, boolean): Добавить в каждую запись метаданные квитанции и подписанта. - `ключ` (body, string): Фильтр по точному ключу. Взаимно исключающий с `key_prefix`. - `key_prefix` (body, string): Фильтр по префиксу для совпадения пространств имён ключей. - `limit` (body, integer): Maximum number of entries to return in one page (1–200, default 50). - `page_token` (body, string): Непрозрачный токен страницы из предыдущего ответа с тем же эндпоинтом и набором фильтров. ### Схема запроса ```json { "type": "object", "additionalProperties": false, "properties": [ { "name": "include_metadata", "required": false, "schema": { "type": "boolean", "description": "Включать в каждую запись метаданные квитанции и подписанта.", "default": false } }, { "name": "ключ", "required": false, "schema": { "type": "string", "description": "Фильтр по точному ключу. Взаимно исключающий с `key_prefix`." } }, { "name": "key_prefix", "required": false, "schema": { "type": "string", "description": "Фильтр по префиксу для сопоставления пространств имён ключей." } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum number of entries to return in one page (1–200, default 50).", "format": "int32" } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Непрозрачный токен страницы из предыдущего ответа того же эндпоинта и набора фильтров." } } ], "refName": "LatestRequest" } ``` ### Параметры пути - `current_account_id` (путь, обязательный, string): Аккаунт контракта, для которого были записаны ключи FastData. - `predecessor_id` (путь, обязательный, string): Вызывающий аккаунт, который записал ключи FastData. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Последние строки для выбранного вызывающего аккаунта и аккаунта контракта ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ], "refName": "KvEntry" } } }, { "name": "page_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination cursor for the next page. Absent when there are no more results." } } ], "refName": "ListResponse" } ``` --- ## KV FastData API - Пакетный поиск по ключам - HTML-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/multi - Markdown-маршрут: https://docs.fastnear.com/ru/apis/kv-fastdata/v0/multi.md # KV FastData API - Пакетный поиск по ключам Получить последние строки для нескольких полностью квалифицированных ключей Получите последнюю строку FastData сразу для 100 ключей в одном запросе. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/kv-fastdata/v0/multi - https://docs.fastnear.com/ru/apis/kv-fastdata/openapi/latest/multi ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/multi` - Исходная спецификация: `apis/kv-fastdata/v0/multi.yaml` ## Сети - Mainnet: https://kv.main.fastnear.com/ - Testnet: https://kv.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://kv.main.fastnear.com/v0/multi - Активный пример: Mainnet ### Тело запроса ```json { "include_metadata": true } ``` ## Справка по запросу ### Активный пример ```json { "body": { "include_metadata": true, "keys": [ "social.near/james.near/graph/follow/sleet.near", "social.near/james.near/graph/follow/missing" ] }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `include_metadata` (body, boolean): Добавить в каждую запись метаданные квитанции и подписанта. - `ключи` (body, обязательный, array): Полноквалифицированные ключи в форме current_account_id/predecessor_id/key. ### Схема запроса ```json { "type": "object", "required": [ "ключи" ], "additionalProperties": false, "properties": [ { "name": "include_metadata", "required": false, "schema": { "type": "boolean", "description": "Включать в каждую запись метаданные квитанции и подписанта.", "default": false } }, { "name": "ключи", "required": true, "schema": { "type": "array", "description": "Полноквалифицированные ключи в форме current_account_id/predecessor_id/key.", "items": { "type": "string" } } } ], "refName": "MultiRequest" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Последние строки для запрошенных ключей ### Схема ответа ```json { "type": "object", "required": [ "entries" ], "additionalProperties": false, "properties": [ { "name": "entries", "required": true, "schema": { "type": "array", "items": { "oneOf": [ { "type": "object", "required": [ "predecessor_id", "current_account_id", "block_height", "block_timestamp", "ключ", "value" ], "additionalProperties": false, "properties": [ { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "current_account_id", "required": true, "schema": { "type": "string" } }, { "name": "ключ", "required": true, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": false, "schema": { "type": "string" } }, { "name": "signer_id", "required": false, "schema": { "type": "string" } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } }, { "name": "value", "required": true, "schema": { "description": "Raw JSON value as stored in FastData." } } ] }, { "enum": [ null ] } ] } } } ], "refName": "MultiResponse" } ``` --- ## NEAR Data API - Состояние - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/system/health - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/system/health.md # NEAR Data API - Состояние Проверить состояние сервиса Проверьте работоспособность сервиса NEAR Data — возвращает `{status: ok}` при успехе, ошибку при проблемах. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/system/health - https://docs.fastnear.com/ru/apis/neardata/openapi/system/get_health ## Операция - Транспорт: http - Метод: GET - Путь: `/health` - Исходная спецификация: `apis/neardata/system/health.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/health - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": {}, "query": {} } ``` ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Поле состояния сервиса ### Схема ответа ```json { "type": "object", "required": [ "статус" ], "additionalProperties": false, "properties": [ { "name": "статус", "required": true, "schema": { "type": "string" } } ], "refName": "HealthResponse" } ``` --- ## NEAR Data API - Финализированный блок - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block.md # NEAR Data API - Финализированный блок Получить финализированный блок по высоте Получите полный документ финализированного блока на выбранной высоте — заголовок плюс каждый чанк и данные шарда. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/block - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_block ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/block/{block_height}` - Исходная спецификация: `apis/neardata/v0/block.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/block/9820210 - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "block_height": "9820210" }, "query": {} } ``` ### Входные данные - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. ### Параметры пути - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Запрошенный документ или `null`, если выбранный срез отсутствует ### Схема ответа ```json { "type": "object", "description": "Full block document as served by neardata, including the block envelope and per-shard payloads.", "required": [ "блок", "shards" ], "additionalProperties": false, "properties": [ { "name": "блок", "required": true, "schema": { "type": "object", "description": "Block-level payload returned by neardata.", "required": [ "author", "chunks", "header" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Block producer account ID." } }, { "name": "chunks", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Block header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunks_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "gas_price", "required": false, "schema": { "type": "string" } }, { "name": "hash", "required": false, "schema": { "type": "string" } }, { "name": "height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "next_epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "prev_hash", "required": false, "schema": { "type": "string" } }, { "name": "prev_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "timestamp", "required": false, "schema": { "type": "integer" } }, { "name": "timestamp_nanosec", "required": false, "schema": { "type": "string" } }, { "name": "total_supply", "required": false, "schema": { "type": "string" } } ], "refName": "BlockHeader" } } ], "refName": "BlockEnvelope" } }, { "name": "shards", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Per-shard payload returned by neardata for a block.", "required": [ "chunk", "receipt_execution_outcomes", "shard_id", "state_changes" ], "additionalProperties": false, "properties": [ { "name": "chunk", "required": true, "schema": { "type": "object", "description": "Chunk payload returned by neardata for a single shard in a selected block.", "required": [ "author", "header", "квитанции", "транзакции" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Chunk producer account ID." } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Transaction entry returned inside a neardata chunk.", "required": [ "outcome", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "outcome", "required": true, "schema": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "required": [ "actions", "hash", "nonce", "priority_fee", "public_key", "receiver_id", "signature", "signer_id" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "hash", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "signature", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } } ], "refName": "SignedTransactionDocument" } } ], "refName": "ChunkTransactionWrapper" } } } ], "refName": "ChunkDocument" } }, { "name": "receipt_execution_outcomes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "state_changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "State change entry returned by neardata for a shard.", "required": [ "cause", "change", "type" ], "additionalProperties": false, "properties": [ { "name": "cause", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "tx_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "tx_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseTransactionProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseReceiptProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseActionReceiptGasReward" } ], "refName": "StateChangeCause" } }, { "name": "change", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "account_id", "amount", "code_hash", "locked", "storage_paid_at", "storage_usage" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "amount", "required": true, "schema": { "type": "string" } }, { "name": "code_hash", "required": true, "schema": { "type": "string" } }, { "name": "locked", "required": true, "schema": { "type": "string" } }, { "name": "storage_paid_at", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "storage_usage", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "StateChangeValueAccountUpdate" }, { "type": "object", "required": [ "access_key", "account_id", "public_key" ], "additionalProperties": false, "properties": [ { "name": "access_key", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueAccessKeyUpdate" }, { "type": "object", "required": [ "account_id", "key_base64", "value_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } }, { "name": "value_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataUpdate" }, { "type": "object", "required": [ "account_id", "key_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataDeletion" } ], "refName": "StateChangeValue" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeItem" } } } ], "refName": "ShardDocument" } } } ], "refName": "BlockDocument" } ``` --- ## NEAR Data API - Чанк блока - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_chunk - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_chunk.md # NEAR Data API - Чанк блока Получить чанк из финализированного блока Получите один чанк — транзакции и входящие квитанции одного шарда — на выбранной высоте блока. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/block_chunk - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_chunk ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/block/{block_height}/chunk/{shard_id}` - Исходная спецификация: `apis/neardata/v0/block_chunk.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/block/50000000/chunk/0 - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "block_height": "50000000", "shard_id": "0" }, "query": {} } ``` ### Входные данные - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. - `shard_id` (путь, обязательный, string): Идентификатор шарда, чанк которого нужно вернуть. ### Параметры пути - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. - `shard_id` (путь, обязательный, string): Идентификатор шарда, чанк которого нужно вернуть. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Запрошенный документ или `null`, если выбранный срез отсутствует ### Схема ответа ```json { "type": "object", "description": "Chunk payload returned by neardata for a single shard in a selected block.", "required": [ "author", "header", "квитанции", "транзакции" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Chunk producer account ID." } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Transaction entry returned inside a neardata chunk.", "required": [ "outcome", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "outcome", "required": true, "schema": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "required": [ "actions", "hash", "nonce", "priority_fee", "public_key", "receiver_id", "signature", "signer_id" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "hash", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "signature", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } } ], "refName": "SignedTransactionDocument" } } ], "refName": "ChunkTransactionWrapper" } } } ], "refName": "ChunkDocument" } ``` --- ## NEAR Data API - Заголовки блока - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_headers - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_headers.md # NEAR Data API - Заголовки блока Получить объект блока для финализированного блока Получите только заголовок финализированного блока и сводку по чанкам — без содержимого отдельных шардов. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/block_headers - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_block_headers ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/block/{block_height}/headers` - Исходная спецификация: `apis/neardata/v0/block_headers.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/block/9820210/headers - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "block_height": "9820210" }, "query": {} } ``` ### Входные данные - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. ### Параметры пути - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Запрошенный документ или `null`, если выбранный срез отсутствует ### Схема ответа ```json { "type": "object", "description": "Block-level payload returned by neardata.", "required": [ "author", "chunks", "header" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Block producer account ID." } }, { "name": "chunks", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Block header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunks_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "gas_price", "required": false, "schema": { "type": "string" } }, { "name": "hash", "required": false, "schema": { "type": "string" } }, { "name": "height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "next_epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "prev_hash", "required": false, "schema": { "type": "string" } }, { "name": "prev_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "timestamp", "required": false, "schema": { "type": "integer" } }, { "name": "timestamp_nanosec", "required": false, "schema": { "type": "string" } }, { "name": "total_supply", "required": false, "schema": { "type": "string" } } ], "refName": "BlockHeader" } } ], "refName": "BlockEnvelope" } ``` --- ## NEAR Data API - Оптимистичный блок - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_optimistic - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_optimistic.md # NEAR Data API - Оптимистичный блок Получить оптимистичный блок по высоте Получите оптимистичный (ещё не финализированный) блок на выбранной высоте — может перенаправить на финализированные данные, когда окно оптимистичности закрылось. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/block_optimistic - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_block_optimistic ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/block_opt/{block_height}` - Исходная спецификация: `apis/neardata/v0/block_optimistic.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/block_opt/9820210 - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "block_height": "9820210" }, "query": {} } ``` ### Входные данные - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. ### Параметры пути - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Запрошенный документ или `null`, если выбранный срез отсутствует ### Схема ответа ```json { "type": "object", "description": "Full block document as served by neardata, including the block envelope and per-shard payloads.", "required": [ "блок", "shards" ], "additionalProperties": false, "properties": [ { "name": "блок", "required": true, "schema": { "type": "object", "description": "Block-level payload returned by neardata.", "required": [ "author", "chunks", "header" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Block producer account ID." } }, { "name": "chunks", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Block header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunks_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "gas_price", "required": false, "schema": { "type": "string" } }, { "name": "hash", "required": false, "schema": { "type": "string" } }, { "name": "height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "next_epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "prev_hash", "required": false, "schema": { "type": "string" } }, { "name": "prev_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "timestamp", "required": false, "schema": { "type": "integer" } }, { "name": "timestamp_nanosec", "required": false, "schema": { "type": "string" } }, { "name": "total_supply", "required": false, "schema": { "type": "string" } } ], "refName": "BlockHeader" } } ], "refName": "BlockEnvelope" } }, { "name": "shards", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Per-shard payload returned by neardata for a block.", "required": [ "chunk", "receipt_execution_outcomes", "shard_id", "state_changes" ], "additionalProperties": false, "properties": [ { "name": "chunk", "required": true, "schema": { "type": "object", "description": "Chunk payload returned by neardata for a single shard in a selected block.", "required": [ "author", "header", "квитанции", "транзакции" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Chunk producer account ID." } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Transaction entry returned inside a neardata chunk.", "required": [ "outcome", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "outcome", "required": true, "schema": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "required": [ "actions", "hash", "nonce", "priority_fee", "public_key", "receiver_id", "signature", "signer_id" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "hash", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "signature", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } } ], "refName": "SignedTransactionDocument" } } ], "refName": "ChunkTransactionWrapper" } } } ], "refName": "ChunkDocument" } }, { "name": "receipt_execution_outcomes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "state_changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "State change entry returned by neardata for a shard.", "required": [ "cause", "change", "type" ], "additionalProperties": false, "properties": [ { "name": "cause", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "tx_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "tx_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseTransactionProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseReceiptProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseActionReceiptGasReward" } ], "refName": "StateChangeCause" } }, { "name": "change", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "account_id", "amount", "code_hash", "locked", "storage_paid_at", "storage_usage" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "amount", "required": true, "schema": { "type": "string" } }, { "name": "code_hash", "required": true, "schema": { "type": "string" } }, { "name": "locked", "required": true, "schema": { "type": "string" } }, { "name": "storage_paid_at", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "storage_usage", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "StateChangeValueAccountUpdate" }, { "type": "object", "required": [ "access_key", "account_id", "public_key" ], "additionalProperties": false, "properties": [ { "name": "access_key", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueAccessKeyUpdate" }, { "type": "object", "required": [ "account_id", "key_base64", "value_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } }, { "name": "value_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataUpdate" }, { "type": "object", "required": [ "account_id", "key_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataDeletion" } ], "refName": "StateChangeValue" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeItem" } } } ], "refName": "ShardDocument" } } } ], "refName": "BlockDocument" } ``` --- ## NEAR Data API - Шард блока - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_shard - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/block_shard.md # NEAR Data API - Шард блока Получить шард из финализированного блока Получите полное содержимое одного шарда на выбранном блоке — чанк плюс изменения состояния и произведённые квитанции. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/block_shard - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_shard ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/block/{block_height}/shard/{shard_id}` - Исходная спецификация: `apis/neardata/v0/block_shard.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/block/50000000/shard/0 - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": { "block_height": "50000000", "shard_id": "0" }, "query": {} } ``` ### Входные данные - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. - `shard_id` (путь, обязательный, string): Идентификатор шарда, который нужно вернуть. ### Параметры пути - `block_height` (путь, обязательный, string): Высота блока NEAR для запроса. - `shard_id` (путь, обязательный, string): Идентификатор шарда, который нужно вернуть. ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Запрошенный документ или `null`, если выбранный срез отсутствует ### Схема ответа ```json { "type": "object", "description": "Per-shard payload returned by neardata for a block.", "required": [ "chunk", "receipt_execution_outcomes", "shard_id", "state_changes" ], "additionalProperties": false, "properties": [ { "name": "chunk", "required": true, "schema": { "type": "object", "description": "Chunk payload returned by neardata for a single shard in a selected block.", "required": [ "author", "header", "квитанции", "транзакции" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Chunk producer account ID." } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Transaction entry returned inside a neardata chunk.", "required": [ "outcome", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "outcome", "required": true, "schema": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "required": [ "actions", "hash", "nonce", "priority_fee", "public_key", "receiver_id", "signature", "signer_id" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "hash", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "signature", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } } ], "refName": "SignedTransactionDocument" } } ], "refName": "ChunkTransactionWrapper" } } } ], "refName": "ChunkDocument" } }, { "name": "receipt_execution_outcomes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "state_changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "State change entry returned by neardata for a shard.", "required": [ "cause", "change", "type" ], "additionalProperties": false, "properties": [ { "name": "cause", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "tx_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "tx_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseTransactionProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseReceiptProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseActionReceiptGasReward" } ], "refName": "StateChangeCause" } }, { "name": "change", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "account_id", "amount", "code_hash", "locked", "storage_paid_at", "storage_usage" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "amount", "required": true, "schema": { "type": "string" } }, { "name": "code_hash", "required": true, "schema": { "type": "string" } }, { "name": "locked", "required": true, "schema": { "type": "string" } }, { "name": "storage_paid_at", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "storage_usage", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "StateChangeValueAccountUpdate" }, { "type": "object", "required": [ "access_key", "account_id", "public_key" ], "additionalProperties": false, "properties": [ { "name": "access_key", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueAccessKeyUpdate" }, { "type": "object", "required": [ "account_id", "key_base64", "value_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } }, { "name": "value_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataUpdate" }, { "type": "object", "required": [ "account_id", "key_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataDeletion" } ], "refName": "StateChangeValue" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeItem" } } } ], "refName": "ShardDocument" } ``` --- ## NEAR Data API - Первый блок - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/first_block - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/first_block.md # NEAR Data API - Первый блок Перенаправление на первый блок после генезиса Перенаправление на первый блок цепочки после генезиса — стартовый курсор для индексаторов, обходящих цепочку с начала. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/first_block - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_first_block ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/first_block` - Исходная спецификация: `apis/neardata/v0/first_block.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/first_block - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": {}, "query": {} } ``` ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Полный документ блока после автоматического прохождения перенаправления ### Схема ответа ```json { "type": "object", "description": "Full block document as served by neardata, including the block envelope and per-shard payloads.", "required": [ "блок", "shards" ], "additionalProperties": false, "properties": [ { "name": "блок", "required": true, "schema": { "type": "object", "description": "Block-level payload returned by neardata.", "required": [ "author", "chunks", "header" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Block producer account ID." } }, { "name": "chunks", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Block header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunks_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "gas_price", "required": false, "schema": { "type": "string" } }, { "name": "hash", "required": false, "schema": { "type": "string" } }, { "name": "height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "next_epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "prev_hash", "required": false, "schema": { "type": "string" } }, { "name": "prev_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "timestamp", "required": false, "schema": { "type": "integer" } }, { "name": "timestamp_nanosec", "required": false, "schema": { "type": "string" } }, { "name": "total_supply", "required": false, "schema": { "type": "string" } } ], "refName": "BlockHeader" } } ], "refName": "BlockEnvelope" } }, { "name": "shards", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Per-shard payload returned by neardata for a block.", "required": [ "chunk", "receipt_execution_outcomes", "shard_id", "state_changes" ], "additionalProperties": false, "properties": [ { "name": "chunk", "required": true, "schema": { "type": "object", "description": "Chunk payload returned by neardata for a single shard in a selected block.", "required": [ "author", "header", "квитанции", "транзакции" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Chunk producer account ID." } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Transaction entry returned inside a neardata chunk.", "required": [ "outcome", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "outcome", "required": true, "schema": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "required": [ "actions", "hash", "nonce", "priority_fee", "public_key", "receiver_id", "signature", "signer_id" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "hash", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "signature", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } } ], "refName": "SignedTransactionDocument" } } ], "refName": "ChunkTransactionWrapper" } } } ], "refName": "ChunkDocument" } }, { "name": "receipt_execution_outcomes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "state_changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "State change entry returned by neardata for a shard.", "required": [ "cause", "change", "type" ], "additionalProperties": false, "properties": [ { "name": "cause", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "tx_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "tx_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseTransactionProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseReceiptProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseActionReceiptGasReward" } ], "refName": "StateChangeCause" } }, { "name": "change", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "account_id", "amount", "code_hash", "locked", "storage_paid_at", "storage_usage" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "amount", "required": true, "schema": { "type": "string" } }, { "name": "code_hash", "required": true, "schema": { "type": "string" } }, { "name": "locked", "required": true, "schema": { "type": "string" } }, { "name": "storage_paid_at", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "storage_usage", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "StateChangeValueAccountUpdate" }, { "type": "object", "required": [ "access_key", "account_id", "public_key" ], "additionalProperties": false, "properties": [ { "name": "access_key", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueAccessKeyUpdate" }, { "type": "object", "required": [ "account_id", "key_base64", "value_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } }, { "name": "value_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataUpdate" }, { "type": "object", "required": [ "account_id", "key_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataDeletion" } ], "refName": "StateChangeValue" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeItem" } } } ], "refName": "ShardDocument" } } } ], "refName": "BlockDocument" } ``` --- ## NEAR Data API - Последний финализированный блок - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/last_block_final - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/last_block_final.md # NEAR Data API - Последний финализированный блок Перенаправление на последний финализированный блок Перенаправление на самый свежий финализированный блок — курсор вершины цепочки после достижения консенсуса. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/last_block_final - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_last_block_final ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/last_block/final` - Исходная спецификация: `apis/neardata/v0/last_block_final.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/last_block/final - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": {}, "query": {} } ``` ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Полный документ блока после автоматического прохождения перенаправления ### Схема ответа ```json { "type": "object", "description": "Full block document as served by neardata, including the block envelope and per-shard payloads.", "required": [ "блок", "shards" ], "additionalProperties": false, "properties": [ { "name": "блок", "required": true, "schema": { "type": "object", "description": "Block-level payload returned by neardata.", "required": [ "author", "chunks", "header" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Block producer account ID." } }, { "name": "chunks", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Block header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunks_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "gas_price", "required": false, "schema": { "type": "string" } }, { "name": "hash", "required": false, "schema": { "type": "string" } }, { "name": "height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "next_epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "prev_hash", "required": false, "schema": { "type": "string" } }, { "name": "prev_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "timestamp", "required": false, "schema": { "type": "integer" } }, { "name": "timestamp_nanosec", "required": false, "schema": { "type": "string" } }, { "name": "total_supply", "required": false, "schema": { "type": "string" } } ], "refName": "BlockHeader" } } ], "refName": "BlockEnvelope" } }, { "name": "shards", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Per-shard payload returned by neardata for a block.", "required": [ "chunk", "receipt_execution_outcomes", "shard_id", "state_changes" ], "additionalProperties": false, "properties": [ { "name": "chunk", "required": true, "schema": { "type": "object", "description": "Chunk payload returned by neardata for a single shard in a selected block.", "required": [ "author", "header", "квитанции", "транзакции" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Chunk producer account ID." } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Transaction entry returned inside a neardata chunk.", "required": [ "outcome", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "outcome", "required": true, "schema": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "required": [ "actions", "hash", "nonce", "priority_fee", "public_key", "receiver_id", "signature", "signer_id" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "hash", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "signature", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } } ], "refName": "SignedTransactionDocument" } } ], "refName": "ChunkTransactionWrapper" } } } ], "refName": "ChunkDocument" } }, { "name": "receipt_execution_outcomes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "state_changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "State change entry returned by neardata for a shard.", "required": [ "cause", "change", "type" ], "additionalProperties": false, "properties": [ { "name": "cause", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "tx_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "tx_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseTransactionProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseReceiptProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseActionReceiptGasReward" } ], "refName": "StateChangeCause" } }, { "name": "change", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "account_id", "amount", "code_hash", "locked", "storage_paid_at", "storage_usage" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "amount", "required": true, "schema": { "type": "string" } }, { "name": "code_hash", "required": true, "schema": { "type": "string" } }, { "name": "locked", "required": true, "schema": { "type": "string" } }, { "name": "storage_paid_at", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "storage_usage", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "StateChangeValueAccountUpdate" }, { "type": "object", "required": [ "access_key", "account_id", "public_key" ], "additionalProperties": false, "properties": [ { "name": "access_key", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueAccessKeyUpdate" }, { "type": "object", "required": [ "account_id", "key_base64", "value_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } }, { "name": "value_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataUpdate" }, { "type": "object", "required": [ "account_id", "key_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataDeletion" } ], "refName": "StateChangeValue" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeItem" } } } ], "refName": "ShardDocument" } } } ], "refName": "BlockDocument" } ``` --- ## NEAR Data API - Последний оптимистичный блок - HTML-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/last_block_optimistic - Markdown-маршрут: https://docs.fastnear.com/ru/apis/neardata/v0/last_block_optimistic.md # NEAR Data API - Последний оптимистичный блок Перенаправление на последний оптимистичный блок Перенаправление на самый свежий оптимистичный блок — максимально свежая вершина, до финализации. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/neardata/v0/last_block_optimistic - https://docs.fastnear.com/ru/apis/neardata/openapi/blocks/get_last_block_optimistic ## Операция - Транспорт: http - Метод: GET - Путь: `/v0/last_block/optimistic` - Исходная спецификация: `apis/neardata/v0/last_block_optimistic.yaml` ## Сети - Mainnet: https://mainnet.neardata.xyz/ - Testnet: https://testnet.neardata.xyz/ ## Авторизация - API-ключ через query `apiKey`: Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. - Этот экспорт намеренно не включает локально сохранённые учётные данные ## Текущий запрос - Сеть: Mainnet - Метод: GET - URL: https://mainnet.neardata.xyz/v0/last_block/optimistic - Активный пример: Mainnet ## Справка по запросу ### Активный пример ```json { "body": null, "headers": {}, "path": {}, "query": {} } ``` ### Параметры запроса - `apiKey` (query, string): Необязательный API-ключ подписки FastNear. Неверные значения могут вернуть `401` до обработки перенаправления. ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Полный документ блока после автоматического прохождения перенаправления ### Схема ответа ```json { "type": "object", "description": "Full block document as served by neardata, including the block envelope and per-shard payloads.", "required": [ "блок", "shards" ], "additionalProperties": false, "properties": [ { "name": "блок", "required": true, "schema": { "type": "object", "description": "Block-level payload returned by neardata.", "required": [ "author", "chunks", "header" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Block producer account ID." } }, { "name": "chunks", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Block header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunks_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "gas_price", "required": false, "schema": { "type": "string" } }, { "name": "hash", "required": false, "schema": { "type": "string" } }, { "name": "height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "next_epoch_id", "required": false, "schema": { "type": "string" } }, { "name": "prev_hash", "required": false, "schema": { "type": "string" } }, { "name": "prev_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "timestamp", "required": false, "schema": { "type": "integer" } }, { "name": "timestamp_nanosec", "required": false, "schema": { "type": "string" } }, { "name": "total_supply", "required": false, "schema": { "type": "string" } } ], "refName": "BlockHeader" } } ], "refName": "BlockEnvelope" } }, { "name": "shards", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Per-shard payload returned by neardata for a block.", "required": [ "chunk", "receipt_execution_outcomes", "shard_id", "state_changes" ], "additionalProperties": false, "properties": [ { "name": "chunk", "required": true, "schema": { "type": "object", "description": "Chunk payload returned by neardata for a single shard in a selected block.", "required": [ "author", "header", "квитанции", "транзакции" ], "additionalProperties": false, "properties": [ { "name": "author", "required": true, "schema": { "type": "string", "description": "Chunk producer account ID." } }, { "name": "header", "required": true, "schema": { "type": "object", "description": "Chunk header object as served by neardata.", "additionalProperties": true, "properties": [ { "name": "chunk_hash", "required": false, "schema": { "type": "string" } }, { "name": "gas_limit", "required": false, "schema": { "type": "integer" } }, { "name": "gas_used", "required": false, "schema": { "type": "integer" } }, { "name": "height_created", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "height_included", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "outcome_root", "required": false, "schema": { "type": "string" } }, { "name": "outgoing_receipts_root", "required": false, "schema": { "type": "string" } }, { "name": "prev_block_hash", "required": false, "schema": { "type": "string" } }, { "name": "shard_id", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_root", "required": false, "schema": { "type": "string" } } ], "refName": "ChunkHeader" } }, { "name": "квитанции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" } } }, { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Transaction entry returned inside a neardata chunk.", "required": [ "outcome", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "outcome", "required": true, "schema": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "required": [ "actions", "hash", "nonce", "priority_fee", "public_key", "receiver_id", "signature", "signer_id" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "hash", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "signature", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } } ], "refName": "SignedTransactionDocument" } } ], "refName": "ChunkTransactionWrapper" } } } ], "refName": "ChunkDocument" } }, { "name": "receipt_execution_outcomes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "Execution result paired with an optional receipt object.", "required": [ "execution_outcome", "квитанция" ], "additionalProperties": false, "properties": [ { "name": "execution_outcome", "required": true, "schema": { "type": "object", "required": [ "block_hash", "id", "outcome", "доказательство" ], "additionalProperties": false, "properties": [ { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "id", "required": true, "schema": { "type": "string" } }, { "name": "outcome", "required": true, "schema": { "type": "object", "required": [ "executor_id", "gas_burnt", "logs", "metadata", "receipt_ids", "статус", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "executor_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "logs", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "metadata", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "receipt_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "статус", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "SuccessReceiptId" ], "additionalProperties": false, "properties": [ { "name": "SuccessReceiptId", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessReceiptId" }, { "type": "object", "required": [ "SuccessValue" ], "additionalProperties": false, "properties": [ { "name": "SuccessValue", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeStatusSuccessValue" }, { "type": "object", "required": [ "Failure" ], "additionalProperties": false, "properties": [ { "name": "Failure", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ExecutionOutcomeStatusFailure" } ], "refName": "ExecutionOutcomeStatus" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } } ], "refName": "ExecutionOutcomeSummary" } }, { "name": "доказательство", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ExecutionProofItem" } } } ], "refName": "ExecutionOutcomeDocument" } }, { "name": "квитанция", "required": true, "schema": { "type": "object", "description": "Receipt payload when neardata includes it for this entry.", "oneOf": [ { "type": "object", "description": "Receipt object as served by neardata inside a chunk payload.", "required": [ "predecessor_id", "priority", "квитанция", "receipt_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "квитанция", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "Action" ], "additionalProperties": false, "properties": [ { "name": "Action", "required": true, "schema": { "type": "object", "required": [ "actions", "gas_price", "input_data_ids", "is_promise_yield", "output_data_receivers", "signer_id", "signer_public_key" ], "additionalProperties": false, "properties": [ { "name": "actions", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true, "refName": "ActionDocument" } } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "input_data_ids", "required": true, "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "is_promise_yield", "required": true, "schema": { "type": "boolean" } }, { "name": "output_data_receivers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "data_id", "receiver_id" ], "additionalProperties": false, "properties": [ { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "OutputDataReceiverDocument" } } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } } ], "refName": "ActionReceiptDocument" } } ], "refName": "ActionReceiptBody" }, { "type": "object", "required": [ "Data" ], "additionalProperties": false, "properties": [ { "name": "Data", "required": true, "schema": { "type": "object", "required": [ "data", "data_id", "is_promise_resume" ], "additionalProperties": false, "properties": [ { "name": "data", "required": true, "schema": { "type": "string" } }, { "name": "data_id", "required": true, "schema": { "type": "string" } }, { "name": "is_promise_resume", "required": true, "schema": { "type": "boolean" } } ], "refName": "DataReceiptDocument" } } ], "refName": "DataReceiptBody" } ], "refName": "ReceiptBody" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } } ], "refName": "ReceiptDocument" }, { "type": "object", "additionalProperties": false, "refName": "OmittedReceiptDocument" } ] } }, { "name": "tx_hash", "required": false, "schema": { "type": "string" } } ], "refName": "ExecutionWithReceipt" } } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "state_changes", "required": true, "schema": { "type": "array", "items": { "type": "object", "description": "State change entry returned by neardata for a shard.", "required": [ "cause", "change", "type" ], "additionalProperties": false, "properties": [ { "name": "cause", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "tx_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "tx_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseTransactionProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseReceiptProcessing" }, { "type": "object", "required": [ "receipt_hash", "type" ], "additionalProperties": false, "properties": [ { "name": "receipt_hash", "required": true, "schema": { "type": "string" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeCauseActionReceiptGasReward" } ], "refName": "StateChangeCause" } }, { "name": "change", "required": true, "schema": { "oneOf": [ { "type": "object", "required": [ "account_id", "amount", "code_hash", "locked", "storage_paid_at", "storage_usage" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "amount", "required": true, "schema": { "type": "string" } }, { "name": "code_hash", "required": true, "schema": { "type": "string" } }, { "name": "locked", "required": true, "schema": { "type": "string" } }, { "name": "storage_paid_at", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "storage_usage", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "StateChangeValueAccountUpdate" }, { "type": "object", "required": [ "access_key", "account_id", "public_key" ], "additionalProperties": false, "properties": [ { "name": "access_key", "required": true, "schema": { "type": "object", "additionalProperties": true } }, { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "public_key", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueAccessKeyUpdate" }, { "type": "object", "required": [ "account_id", "key_base64", "value_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } }, { "name": "value_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataUpdate" }, { "type": "object", "required": [ "account_id", "key_base64" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "key_base64", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeValueDataDeletion" } ], "refName": "StateChangeValue" } }, { "name": "type", "required": true, "schema": { "type": "string" } } ], "refName": "StateChangeItem" } } } ], "refName": "ShardDocument" } } } ], "refName": "BlockDocument" } ``` --- ## Транзакции API - История аккаунта - HTML-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/account - Markdown-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/account.md # Транзакции API - История аккаунта Получить историю транзакций аккаунта Получите историю транзакций аккаунта с необязательными фильтрами по подписанту, статусу успеха и порядку сортировки. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/transactions/v0/account - https://docs.fastnear.com/ru/apis/transactions/openapi/account/get_account ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/account` - Исходная спецификация: `apis/transactions/v0/account.yaml` ## Сети - Mainnet: https://tx.main.fastnear.com/ - Testnet: https://tx.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://tx.main.fastnear.com/v0/account - Активный пример: Mainnet ### Тело запроса ```json { "account_id": "intents.near", "desc": true, "is_real_signer": true, "is_success": true, "limit": 50 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "account_id": "intents.near", "desc": true, "is_real_signer": true, "is_success": true, "limit": 50 }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): NEAR account to query transactions for (may be a signer, predecessor, receiver, or related party). - `desc` (body, boolean): Sort newest-first when true; oldest-first when false or omitted. - `from_tx_block_height` (body, integer): Inclusive lower bound on the transaction's block height. - `is_action_arg` (body, boolean): Restrict to transactions where this account appeared in action arguments. - `is_any_signer` (body, boolean): Restrict to transactions where this account signed either the top-level transaction or a delegated action. - `is_delegated_signer` (body, boolean): Restrict to transactions where this account signed a delegated action. - `is_event_log` (body, boolean): Restrict to transactions where this account appeared in a JSON event log. - `is_explicit_refund_to` (body, boolean): Restrict to transactions where this account was the explicit `refund_to` target of an action receipt. - `is_function_call` (body, boolean): Restrict to transactions where this account was the target of a function-call action. - `is_predecessor` (body, boolean): Restrict to transactions where this account was the predecessor of a receipt. - `is_real_receiver` (body, boolean): Restrict to transactions where this account was the real receiver — excluding relayer receivers and gas refunds. - `is_real_signer` (body, boolean): Restrict to transactions where this account was the real signer — direct or delegated, excluding relayer signers. - `is_receiver` (body, boolean): Restrict to transactions where this account received a receipt. - `is_signer` (body, boolean): Restrict to transactions where this account signed the top-level transaction. - `is_success` (body, boolean): Restrict to transactions whose execution succeeded (true) or failed/pending (false). - `limit` (body, integer): Maximum rows to return in one page (1–200). - `resume_token` (body, string): Opaque pagination token returned on a prior page; omit for the first page. - `to_tx_block_height` (body, integer): Exclusive upper bound on the transaction's block height. ### Схема запроса ```json { "type": "object", "required": [ "account_id" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "NEAR account to query transactions for (may be a signer, predecessor, receiver, or related party)." } }, { "name": "desc", "required": false, "schema": { "type": "boolean", "description": "Sort newest-first when true; oldest-first when false or omitted." } }, { "name": "from_tx_block_height", "required": false, "schema": { "type": "integer", "description": "Inclusive lower bound on the transaction's block height.", "format": "uint64" } }, { "name": "is_action_arg", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account appeared in action arguments." } }, { "name": "is_any_signer", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account signed either the top-level transaction or a delegated action." } }, { "name": "is_delegated_signer", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account signed a delegated action." } }, { "name": "is_event_log", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account appeared in a JSON event log." } }, { "name": "is_explicit_refund_to", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account was the explicit `refund_to` target of an action receipt." } }, { "name": "is_function_call", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account was the target of a function-call action." } }, { "name": "is_predecessor", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account was the predecessor of a receipt." } }, { "name": "is_real_receiver", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account was the real receiver — excluding relayer receivers and gas refunds." } }, { "name": "is_real_signer", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account was the real signer — direct or delegated, excluding relayer signers." } }, { "name": "is_receiver", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account received a receipt." } }, { "name": "is_signer", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions where this account signed the top-level transaction." } }, { "name": "is_success", "required": false, "schema": { "type": "boolean", "description": "Restrict to transactions whose execution succeeded (true) or failed/pending (false)." } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum rows to return in one page (1–200).", "format": "uint" } }, { "name": "resume_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination token returned on a prior page; omit for the first page.", "default": null } }, { "name": "to_tx_block_height", "required": false, "schema": { "type": "integer", "description": "Exclusive upper bound on the transaction's block height.", "format": "uint64" } } ], "refName": "AccountInput" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Набор результатов по истории аккаунта ### Схема ответа ```json { "type": "object", "required": [ "account_txs", "resume_token", "txs_count" ], "additionalProperties": false, "properties": [ { "name": "account_txs", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "account_id", "transaction_hash", "tx_block_height", "tx_block_timestamp", "tx_index", "is_signer", "is_delegated_signer", "is_real_signer", "is_any_signer", "is_predecessor", "is_explicit_refund_to", "is_receiver", "is_real_receiver", "is_function_call", "is_action_arg", "is_event_log", "is_success" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "is_action_arg", "required": true, "schema": { "type": "boolean" } }, { "name": "is_any_signer", "required": true, "schema": { "type": "boolean" } }, { "name": "is_delegated_signer", "required": true, "schema": { "type": "boolean" } }, { "name": "is_event_log", "required": true, "schema": { "type": "boolean" } }, { "name": "is_explicit_refund_to", "required": true, "schema": { "type": "boolean" } }, { "name": "is_function_call", "required": true, "schema": { "type": "boolean" } }, { "name": "is_predecessor", "required": true, "schema": { "type": "boolean" } }, { "name": "is_real_receiver", "required": true, "schema": { "type": "boolean" } }, { "name": "is_real_signer", "required": true, "schema": { "type": "boolean" } }, { "name": "is_receiver", "required": true, "schema": { "type": "boolean" } }, { "name": "is_signer", "required": true, "schema": { "type": "boolean" } }, { "name": "is_success", "required": true, "schema": { "type": "boolean" } }, { "name": "transaction_hash", "required": true, "schema": { "type": "string" } }, { "name": "tx_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "tx_index", "required": true, "schema": { "type": "integer", "format": "uint32" } } ], "refName": "AccountTxRow" } } }, { "name": "resume_token", "required": true, "schema": { "type": "string" } }, { "name": "txs_count", "required": true, "schema": { "type": "integer", "format": "uint64" } } ], "refName": "AccountResponse" } ``` --- ## Транзакции API - Поиск блока - HTML-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/block - Markdown-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/block.md # Транзакции API - Поиск блока Получить блок по высоте или хешу Получите строку блока по высоте или хешу и при необходимости разверните связанные транзакции и квитанции. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/transactions/v0/block - https://docs.fastnear.com/ru/apis/transactions/openapi/blocks/get_block ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/block` - Исходная спецификация: `apis/transactions/v0/block.yaml` ## Сети - Mainnet: https://tx.main.fastnear.com/ - Testnet: https://tx.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://tx.main.fastnear.com/v0/block - Активный пример: Mainnet ### Тело запроса ```json { "block_id": 193916411, "with_receipts": true, "with_transactions": true } ``` ## Справка по запросу ### Активный пример ```json { "body": { "block_id": 193916411, "with_receipts": true, "with_transactions": true }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `block_id` (body, обязательный, integer | string): Block height (integer) or base58-encoded block hash (string) to fetch. - `with_receipts` (body, boolean): Include the block's receipts in the response when true. - `with_transactions` (body, boolean): Include the block's transactions in the response when true. ### Схема запроса ```json { "type": "object", "required": [ "block_id" ], "additionalProperties": false, "properties": [ { "name": "block_id", "required": true, "schema": { "description": "Block height (integer) or base58-encoded block hash (string) to fetch.", "oneOf": [ { "type": "integer" }, { "type": "string" } ] } }, { "name": "with_receipts", "required": false, "schema": { "type": "boolean", "description": "Include the block's receipts in the response when true." } }, { "name": "with_transactions", "required": false, "schema": { "type": "boolean", "description": "Include the block's transactions in the response when true." } } ], "refName": "BlockInput" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Результат поиска блока ### Схема ответа ```json { "type": "object", "required": [ "блок", "block_txs", "block_receipts" ], "additionalProperties": false, "properties": [ { "name": "блок", "required": true, "schema": { "type": "object", "required": [ "block_height", "block_hash", "prev_block_hash", "block_timestamp", "epoch_id", "next_epoch_id", "chunks_included", "author_id", "protocol_version", "gas_price", "total_supply", "num_transactions", "num_receipts", "gas_burnt", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "author_id", "required": true, "schema": { "type": "string" } }, { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_ordinal", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "chunks_included", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "string" } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "next_epoch_id", "required": true, "schema": { "type": "string" } }, { "name": "num_receipts", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "num_transactions", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "prev_block_hash", "required": true, "schema": { "type": "string" } }, { "name": "prev_block_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "protocol_version", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } }, { "name": "total_supply", "required": true, "schema": { "type": "string" } } ] } }, { "name": "block_receipts", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "receipt_id", "block_height", "block_timestamp", "receipt_index", "appear_block_height", "appear_receipt_index", "transaction_hash", "tx_block_height", "tx_block_timestamp", "tx_index", "predecessor_id", "receiver_id", "receipt_type", "priority", "shard_id", "is_success" ], "additionalProperties": false, "properties": [ { "name": "appear_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "appear_receipt_index", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "is_success", "required": true, "schema": { "type": "boolean" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_index", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "receipt_type", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "transaction_hash", "required": true, "schema": { "type": "string" } }, { "name": "tx_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "tx_index", "required": true, "schema": { "type": "integer", "format": "uint32" } } ], "refName": "ReceiptTxRow" } } }, { "name": "block_txs", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "transaction_hash", "signer_id", "tx_block_height", "tx_index", "tx_block_hash", "tx_block_timestamp", "last_block_height", "is_completed", "shard_id", "receiver_id", "signer_public_key", "priority_fee", "nonce", "is_relayed", "real_signer_id", "real_receiver_id", "is_success", "gas_burnt", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "gas_burnt", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "is_completed", "required": true, "schema": { "type": "boolean" } }, { "name": "is_relayed", "required": true, "schema": { "type": "boolean" } }, { "name": "is_success", "required": true, "schema": { "type": "boolean" } }, { "name": "last_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "nonce", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "priority_fee", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "real_receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "real_signer_id", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_public_key", "required": true, "schema": { "type": "string" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } }, { "name": "transaction_hash", "required": true, "schema": { "type": "string" } }, { "name": "tx_block_hash", "required": true, "schema": { "type": "string" } }, { "name": "tx_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "tx_index", "required": true, "schema": { "type": "integer", "format": "uint32" } } ], "refName": "BlockTxRow" } } } ], "refName": "BlockResponse" } ``` --- ## Транзакции API - Диапазон блоков - HTML-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/blocks - Markdown-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/blocks.md # Транзакции API - Диапазон блоков Получить список блоков Получите ограниченный список индексированных блоков, отсортированный по возрастанию или убыванию. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/transactions/v0/blocks - https://docs.fastnear.com/ru/apis/transactions/openapi/blocks/get_blocks ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/blocks` - Исходная спецификация: `apis/transactions/v0/blocks.yaml` ## Сети - Mainnet: https://tx.main.fastnear.com/ - Testnet: https://tx.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://tx.main.fastnear.com/v0/blocks - Активный пример: Mainnet ### Тело запроса ```json { "desc": false, "from_block_height": 193916402, "limit": 10, "to_block_height": 193916411 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "desc": false, "from_block_height": 193916402, "limit": 10, "to_block_height": 193916411 }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `desc` (body, boolean): Sort newest-first when true; oldest-first when false or omitted. - `from_block_height` (body, integer): Inclusive lower bound on block height. - `limit` (body, integer): Maximum blocks to return in one page (1–100). - `to_block_height` (body, integer): Exclusive upper bound on block height. ### Схема запроса ```json { "type": "object", "additionalProperties": false, "properties": [ { "name": "desc", "required": false, "schema": { "type": "boolean", "description": "Sort newest-first when true; oldest-first when false or omitted." } }, { "name": "from_block_height", "required": false, "schema": { "type": "integer", "description": "Inclusive lower bound on block height.", "format": "uint64" } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum blocks to return in one page (1–100).", "format": "uint" } }, { "name": "to_block_height", "required": false, "schema": { "type": "integer", "description": "Exclusive upper bound on block height.", "format": "uint64" } } ], "refName": "BlocksInput" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Строки блоков ### Схема ответа ```json { "type": "object", "required": [ "блоки" ], "additionalProperties": false, "properties": [ { "name": "блоки", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "block_height", "block_hash", "prev_block_hash", "block_timestamp", "epoch_id", "next_epoch_id", "chunks_included", "author_id", "protocol_version", "gas_price", "total_supply", "num_transactions", "num_receipts", "gas_burnt", "tokens_burnt" ], "additionalProperties": false, "properties": [ { "name": "author_id", "required": true, "schema": { "type": "string" } }, { "name": "block_hash", "required": true, "schema": { "type": "string" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_ordinal", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "chunks_included", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "epoch_id", "required": true, "schema": { "type": "string" } }, { "name": "gas_burnt", "required": true, "schema": { "type": "string" } }, { "name": "gas_price", "required": true, "schema": { "type": "string" } }, { "name": "next_epoch_id", "required": true, "schema": { "type": "string" } }, { "name": "num_receipts", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "num_transactions", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "prev_block_hash", "required": true, "schema": { "type": "string" } }, { "name": "prev_block_height", "required": false, "schema": { "type": "integer", "format": "uint64" } }, { "name": "protocol_version", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "tokens_burnt", "required": true, "schema": { "type": "string" } }, { "name": "total_supply", "required": true, "schema": { "type": "string" } } ], "refName": "BlockRow" } } } ], "refName": "BlocksResponse" } ``` --- ## Транзакции API - Поиск квитанции - HTML-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/receipt - Markdown-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/receipt.md # Транзакции API - Поиск квитанции Получить квитанцию по ID Получите квитанцию по ID вместе с транзакцией, её создавшей. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/transactions/v0/receipt - https://docs.fastnear.com/ru/apis/transactions/openapi/receipts/get_receipt ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/receipt` - Исходная спецификация: `apis/transactions/v0/receipt.yaml` ## Сети - Mainnet: https://tx.main.fastnear.com/ - Testnet: https://tx.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://tx.main.fastnear.com/v0/receipt - Активный пример: Mainnet ### Тело запроса ```json { "receipt_id": "gzqDSvd3ZMcVUWzBMP7j9KMWz89iZMkkEvW9g8QZjUP" } ``` ## Справка по запросу ### Активный пример ```json { "body": { "receipt_id": "gzqDSvd3ZMcVUWzBMP7j9KMWz89iZMkkEvW9g8QZjUP" }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `receipt_id` (body, обязательный, string): Base58-encoded receipt ID to look up. ### Схема запроса ```json { "type": "object", "required": [ "receipt_id" ], "additionalProperties": false, "properties": [ { "name": "receipt_id", "required": true, "schema": { "type": "string", "description": "Base58-encoded receipt ID to look up." } } ], "refName": "ReceiptInput" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Результат поиска квитанции ### Схема ответа ```json { "type": "object", "required": [ "квитанция", "транзакция" ], "additionalProperties": false, "properties": [ { "name": "квитанция", "required": true, "schema": { "type": "object", "required": [ "receipt_id", "block_height", "block_timestamp", "receipt_index", "appear_block_height", "appear_receipt_index", "transaction_hash", "tx_block_height", "tx_block_timestamp", "tx_index", "predecessor_id", "receiver_id", "receipt_type", "priority", "shard_id", "is_success" ], "additionalProperties": false, "properties": [ { "name": "appear_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "appear_receipt_index", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "is_success", "required": true, "schema": { "type": "boolean" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "priority", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_index", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "receipt_type", "required": true, "schema": { "type": "string" } }, { "name": "receiver_id", "required": true, "schema": { "type": "string" } }, { "name": "shard_id", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "transaction_hash", "required": true, "schema": { "type": "string" } }, { "name": "tx_block_height", "required": true, "schema": { "type": "integer", "format": "uint64" } }, { "name": "tx_block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "tx_index", "required": true, "schema": { "type": "integer", "format": "uint32" } } ] } }, { "name": "транзакция", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "refName": "ReceiptResponse" } ``` --- ## Транзакции API - Транзакции по хешу - HTML-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/transactions - Markdown-маршрут: https://docs.fastnear.com/ru/apis/transactions/v0/transactions.md # Транзакции API - Транзакции по хешу Получить транзакции по хешу Получите до 20 индексированных транзакций по хешу в одном запросе. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/transactions/v0/transactions - https://docs.fastnear.com/ru/apis/transactions/openapi/transactions/get_transactions ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/transactions` - Исходная спецификация: `apis/transactions/v0/transactions.yaml` ## Сети - Mainnet: https://tx.main.fastnear.com/ - Testnet: https://tx.test.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://tx.main.fastnear.com/v0/transactions - Активный пример: Mainnet ### Тело запроса ```json { "tx_hashes": [ "FDrh13CdfGPXsmwUpZLfkZCoXWfpQmaFGj4zYWc1qfh", "Eq1a46bynaBAjoSxd2XGWdCxkZdrMvN9jMZVdZfPSjM5" ] } ``` ## Справка по запросу ### Активный пример ```json { "body": { "tx_hashes": [ "FDrh13CdfGPXsmwUpZLfkZCoXWfpQmaFGj4zYWc1qfh", "Eq1a46bynaBAjoSxd2XGWdCxkZdrMvN9jMZVdZfPSjM5" ] }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `tx_hashes` (body, обязательный, array): Up to 20 base58-encoded transaction hashes to fetch in one request. ### Схема запроса ```json { "type": "object", "required": [ "tx_hashes" ], "additionalProperties": false, "properties": [ { "name": "tx_hashes", "required": true, "schema": { "type": "array", "description": "Up to 20 base58-encoded transaction hashes to fetch in one request.", "items": { "type": "string" } } } ], "refName": "TxInput" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Найденные транзакции ### Схема ответа ```json { "type": "object", "required": [ "транзакции" ], "additionalProperties": false, "properties": [ { "name": "транзакции", "required": true, "schema": { "type": "array", "items": { "type": "object", "additionalProperties": true } } } ], "refName": "TransactionsResponse" } ``` --- ## API переводов: запрос переводов - HTML-маршрут: https://docs.fastnear.com/ru/apis/transfers/v0/transfers - Markdown-маршрут: https://docs.fastnear.com/ru/apis/transfers/v0/transfers.md # API переводов: запрос переводов Запросить переводы аккаунта Получите строки переводов для одного аккаунта с необязательными фильтрами по направлению, активу, сумме и времени. ## Ссылки на источник - https://docs.fastnear.com/ru/apis/transfers/v0/transfers - https://docs.fastnear.com/ru/apis/transfers/openapi/transfers/get_transfers_by_account ## Операция - Транспорт: http - Метод: POST - Путь: `/v0/transfers` - Исходная спецификация: `apis/transfers/v0/transfers.yaml` ## Сети - Mainnet: https://transfers.main.fastnear.com/ ## Авторизация - Авторизация не требуется ## Текущий запрос - Сеть: Mainnet - Метод: POST - URL: https://transfers.main.fastnear.com/v0/transfers - Активный пример: Недавние входящие переводы NEAR ### Тело запроса ```json { "account_id": "root.near", "desc": true, "limit": 10 } ``` ## Справка по запросу ### Активный пример ```json { "body": { "account_id": "intents.near", "asset_id": "native:near", "desc": true, "direction": "receiver", "limit": 10, "min_amount": "1000000000000000000000000" }, "headers": {}, "path": {}, "query": {} } ``` ### Входные данные - `account_id` (body, обязательный, string): Идентификатор аккаунта NEAR, для которого нужно получить переводы. - `asset_id` (body, string): Необязательный идентификатор актива, например `near` или ID FT-контракта. - `desc` (body, boolean): Если `true`, сначала возвращаются более новые переводы. - `direction` (body, обязательный, string): Какие переводы вернуть: исходящие (`sender`) или входящие (`receiver`). - `from_timestamp_ms` (body, integer): Нижняя граница времени в миллисекундах UNIX. - `ignore_system` (body, boolean): Если `true`, исключает системные переводы. - `limit` (body, integer): Максимальное количество строк в ответе. - `min_amount` (body, string): Минимальная сумма в базовых единицах актива. - `min_human_amount` (body, number): Минимальная сумма в человекочитаемом виде. - `min_usd_amount` (body, number): Минимальная сумма в долларах США. - `resume_token` (body, string): Непрозрачный токен продолжения из предыдущего ответа. - `to_timestamp_ms` (body, integer): Верхняя граница времени в миллисекундах UNIX. ### Схема запроса ```json { "type": "object", "required": [ "account_id", "direction" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string", "description": "NEAR account to query transfers for (the signer or receiver, depending on `direction`)." } }, { "name": "asset_id", "required": false, "schema": { "type": "string", "description": "Asset identifier such as `native:near` for NEAR or `` for fungible tokens." } }, { "name": "desc", "required": false, "schema": { "type": "boolean", "description": "When true, sort newest-first; when false or omitted, sort oldest-first." } }, { "name": "direction", "required": true, "schema": { "type": "string", "description": "Restrict to transfers where the account acts as `sender` or `receiver`; omit for both sides.", "enum": [ "sender", "receiver" ] } }, { "name": "from_timestamp_ms", "required": false, "schema": { "type": "integer", "description": "Inclusive lower bound on block timestamp in milliseconds since the Unix epoch.", "format": "uint64" } }, { "name": "ignore_system", "required": false, "schema": { "type": "boolean", "description": "When true, hide system transfers (validator rewards, implicit account creation, refunds)." } }, { "name": "limit", "required": false, "schema": { "type": "integer", "description": "Maximum number of transfer rows to return in one page (1–100).", "format": "uint" } }, { "name": "min_amount", "required": false, "schema": { "type": "string", "description": "Minimum absolute transfer amount in the asset's base units (e.g. yoctoNEAR), stringified u128.", "default": null } }, { "name": "min_human_amount", "required": false, "schema": { "type": "number", "description": "Minimum transfer amount in human-readable units (decimals already applied).", "format": "double" } }, { "name": "min_usd_amount", "required": false, "schema": { "type": "number", "description": "Minimum transfer amount in USD-equivalent at time of transfer.", "format": "double" } }, { "name": "resume_token", "required": false, "schema": { "type": "string", "description": "Opaque pagination token returned as `resume_token` on a prior page; omit for the first page.", "default": null } }, { "name": "to_timestamp_ms", "required": false, "schema": { "type": "integer", "description": "Exclusive upper bound on block timestamp in milliseconds since the Unix epoch.", "format": "uint64" } } ], "refName": "TransfersInput" } ``` ## Справка по ответу - Статус: 200 - Тип данных: application/json - Краткое описание: Строки переводов для указанного аккаунта. ### Схема ответа ```json { "type": "object", "required": [ "transfers", "resume_token" ], "additionalProperties": false, "properties": [ { "name": "resume_token", "required": true, "schema": { "type": "string" } }, { "name": "transfers", "required": true, "schema": { "type": "array", "items": { "type": "object", "required": [ "block_height", "block_timestamp", "receipt_id", "transfer_index", "signer_id", "predecessor_id", "receipt_account_id", "account_id", "asset_id", "asset_type", "amount", "transfer_type" ], "additionalProperties": false, "properties": [ { "name": "account_id", "required": true, "schema": { "type": "string" } }, { "name": "action_index", "required": false, "schema": { "type": "integer", "format": "uint16" } }, { "name": "amount", "required": true, "schema": { "type": "string" } }, { "name": "asset_id", "required": true, "schema": { "type": "string" } }, { "name": "asset_type", "required": true, "schema": { "type": "string" } }, { "name": "block_height", "required": true, "schema": { "type": "string" } }, { "name": "block_timestamp", "required": true, "schema": { "type": "string" } }, { "name": "end_of_block_balance", "required": false, "schema": { "type": "string" } }, { "name": "human_amount", "required": false, "schema": { "type": "number", "format": "double" } }, { "name": "log_index", "required": false, "schema": { "type": "integer", "format": "uint16" } }, { "name": "method_name", "required": false, "schema": { "type": "string" } }, { "name": "other_account_id", "required": false, "schema": { "type": "string" } }, { "name": "predecessor_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_account_id", "required": true, "schema": { "type": "string" } }, { "name": "receipt_id", "required": true, "schema": { "type": "string" } }, { "name": "signer_id", "required": true, "schema": { "type": "string" } }, { "name": "start_of_block_balance", "required": false, "schema": { "type": "string" } }, { "name": "transaction_id", "required": false, "schema": { "type": "string" } }, { "name": "transfer_index", "required": true, "schema": { "type": "integer", "format": "uint32" } }, { "name": "transfer_type", "required": true, "schema": { "type": "string" } }, { "name": "usd_amount", "required": false, "schema": { "type": "number", "format": "double" } } ], "refName": "TransferRow" } } } ], "refName": "TransfersResponse" } ```