| Поле | Что отвечает | Что не доказывает |
|---|---|---|
| schedule_id | Какое расписание исследуется | Что тело уже исполнено |
| transaction_body | Какое действие было запланировано | Что оно до сих пор желательно |
| signatures | Какие ключи уже представлены | Что все требования удовлетворены |
| executed_timestamp / deleted | Исполнено ли или удалено расписание | Успех внутреннего действия без record |
| expiration_time / wait_for_expiry | Когда и при каком режиме сеть пытается исполнить | Точный момент исполнения |
| scheduled_transaction_id | Как искать запись исполнения | Наличие самой записи |
- Поле
- schedule_id
- Что отвечает
- Какое расписание исследуется
- Что не доказывает
- Что тело уже исполнено
- Поле
- transaction_body
- Что отвечает
- Какое действие было запланировано
- Что не доказывает
- Что оно до сих пор желательно
- Поле
- signatures
- Что отвечает
- Какие ключи уже представлены
- Что не доказывает
- Что все требования удовлетворены
- Поле
- executed_timestamp / deleted
- Что отвечает
- Исполнено ли или удалено расписание
- Что не доказывает
- Успех внутреннего действия без record
- Поле
- expiration_time / wait_for_expiry
- Что отвечает
- Когда и при каком режиме сеть пытается исполнить
- Что не доказывает
- Точный момент исполнения
- Поле
- scheduled_transaction_id
- Что отвечает
- Как искать запись исполнения
- Что не доказывает
- Наличие самой записи
Не смешивайте две схемы. Native ScheduleInfo возвращает scheduledTransactionBody, primitive signers, execution_time либо deletion_time и scheduledTransactionID. Mirror REST называет близкие поля transaction_body, signatures, executed_timestamp и deleted, но его schedule endpoint не возвращает scheduled_transaction_id. Берите этот ID из receipt ScheduleCreate или native ScheduleInfo, а затем ищите Mirror transaction с фильтром scheduled=true.
Создание Schedule и исполнение тела — разные события
ScheduleCreate записывает расписание и возвращает schedule ID. Успех этой транзакции подтверждает создание объекта, а не перевод, token operation или contract call внутри него. Для запланированного тела сеть формирует отдельный scheduled transaction ID; именно по нему затем ищут record исполнения.
Сохраните schedule ID, scheduled transaction ID и transaction_body в одном расследовании. Если интерфейс показывает только «scheduled», этого недостаточно: из decoded body проверьте получателя, сумму, токен или contract call, а payer_account_id сверяйте отдельным полем ScheduleInfo.
ScheduleSign активирует ключи для неизменяемого body
После создания нельзя заменить тело внутри существующего Schedule. ScheduleSign ссылается на schedule ID, а сеть активирует соответствующие primitive keys для связанного с ним неизменяемого scheduled body. Перед подписью декодируйте body и сравните его с согласованным действием. При наличии admin key неверный Schedule можно удалить; без него отменить объект нельзя.
Список signatories не равен готовому счётчику недостающих подписей
Native ScheduleInfo возвращает активные primitive signers, а Mirror — наблюдённые signatures. ScheduleInfo может не включить подпись, которую сеть сочла маловероятно нужной. Ни один ответ не выдаёт готовый список недостающих требований: сопоставьте body с ключами аккаунтов, токенов, контрактов и других затронутых сущностей. Threshold key допускает разные комбинации, поэтому простой подсчёт даёт ложный ответ.
| Код | Что он доказывает | Чего из него не следует |
|---|---|---|
| 201 INVALID_SCHEDULE_ID | Объект не найден, expired, deleted или executed | Какой именно финал произошёл |
| 202 SCHEDULE_IS_IMMUTABLE | Admin key не задан | Что Schedule не сможет исполниться |
| 205 NO_NEW_VALID_SIGNATURES | Этот вызов не добавил новую валидную подпись required signer | Что все подписи уже собраны |
| 206 / 208 | Required signers не разрешаются либо часть signatures невалидна | Что повтор без исправления безопасен |
| 212 / 213 | Schedule уже deleted либо executed | Успех scheduled body без отдельного record |
| 314 SCHEDULE_PENDING_EXPIRATION | Expiry пройден, но execution-if-needed и удаление ещё обрабатываются | Что можно создавать замену |
- Код
- 201 INVALID_SCHEDULE_ID
- Что он доказывает
- Объект не найден, expired, deleted или executed
- Чего из него не следует
- Какой именно финал произошёл
- Код
- 202 SCHEDULE_IS_IMMUTABLE
- Что он доказывает
- Admin key не задан
- Чего из него не следует
- Что Schedule не сможет исполниться
- Код
- 205 NO_NEW_VALID_SIGNATURES
- Что он доказывает
- Этот вызов не добавил новую валидную подпись required signer
- Чего из него не следует
- Что все подписи уже собраны
- Код
- 206 / 208
- Что он доказывает
- Required signers не разрешаются либо часть signatures невалидна
- Чего из него не следует
- Что повтор без исправления безопасен
- Код
- 212 / 213
- Что он доказывает
- Schedule уже deleted либо executed
- Чего из него не следует
- Успех scheduled body без отдельного record
- Код
- 314 SCHEDULE_PENDING_EXPIRATION
- Что он доказывает
- Expiry пройден, но execution-if-needed и удаление ещё обрабатываются
- Чего из него не следует
- Что можно создавать замену
Как проверить готовность без догадок
- 1Зафиксируйте тело
Декодируйте неизменяемый transaction_body и перечислите затрагиваемые сущности.
- 2Соберите текущие key structures
Читайте ключи и threshold-условия из актуального network state, а не из старой заявки.
- 3Сопоставьте signatories
Отметьте, какие из допустимых ветвей ключей уже представлены в ScheduleInfo.
- 4Проверьте lifecycle
Перед новой подписью снова прочитайте deleted, executed_timestamp и expiration_time.
wait_for_expiry меняет момент попытки исполнения
| Наблюдение | Что это значит | Следующее действие |
|---|---|---|
| executed_timestamp заполнен | Сеть выполнила scheduled transaction | Найти record и проверить его result/state |
| deleted = true | Расписание удалено | Не собирать подписи; выяснить основание удаления |
| До expiry, wait_for_expiry = false | Исполнение возможно после достаточной авторизации | Проверить недостающие требования и payer |
| До expiry, wait_for_expiry = true | Даже достаточные подписи ждут expiry | Не обещать немедленное исполнение |
| Expiry прошёл, executed_timestamp пуст | Статус ещё не финален: возможен SCHEDULE_PENDING_EXPIRATION и lag Mirror | Не создавать замену; дождаться expiry-processing и догоняющей индексации, затем проверить историю Schedule и scheduled record |
- Наблюдение
- executed_timestamp заполнен
- Что это значит
- Сеть выполнила scheduled transaction
- Следующее действие
- Найти record и проверить его result/state
- Наблюдение
- deleted = true
- Что это значит
- Расписание удалено
- Следующее действие
- Не собирать подписи; выяснить основание удаления
- Наблюдение
- До expiry, wait_for_expiry = false
- Что это значит
- Исполнение возможно после достаточной авторизации
- Следующее действие
- Проверить недостающие требования и payer
- Наблюдение
- До expiry, wait_for_expiry = true
- Что это значит
- Даже достаточные подписи ждут expiry
- Следующее действие
- Не обещать немедленное исполнение
- Наблюдение
- Expiry прошёл, executed_timestamp пуст
- Что это значит
- Статус ещё не финален: возможен SCHEDULE_PENDING_EXPIRATION и lag Mirror
- Следующее действие
- Не создавать замену; дождаться expiry-processing и догоняющей индексации, затем проверить историю Schedule и scheduled record
При wait_for_expiry = false сеть передаёт scheduled transaction на исполнение, когда авторизация достаточна; успех самого действия всё равно определяет его record. При wait_for_expiry = true оценка откладывается до срока, а исполнение происходит в ближайшее доступное consensus time на best-effort основе. Throttling, доступность fee payer и проверки самой операции не позволяют обещать бизнес-результат в ту же секунду, когда появилась последняя подпись.
Executed timestamp открывает проверку, а не закрывает её
Найдите scheduled transaction по scheduled_transaction_id, запросив transaction endpoint с фильтром scheduled=true, и прочитайте consensus result. Требуйте result SUCCESS, затем проверьте наблюдаемый эффект тела: новый token balance, owner, allowance, contract event или другое ожидаемое состояние. Успешная ScheduleSign сообщает только о принятой подписи; она не заменяет record внутренней транзакции.
| Состояние | Безопасное действие | Доказательство завершения |
|---|---|---|
| Не хватает допустимой подписи | Подписать после повторной проверки body | Signatory появился, затем найден execution record |
| Неверное тело, есть admin key | Удалить Schedule и создать новый | deleted = true у старого, новый ID отделён |
| Неверное тело, admin key нет | Не добавлять свою подпись, предупредить участников и мониторить; удалить Schedule нельзя | Только отсутствие execution record после окончательной обработки expiry доказывает, что тело не исполнилось |
| Executed, но effect не виден | Прочитать result и дочерние данные record | Result и network state объясняют исход |
| Deleted или expiry окончательно обработан | Не отправлять подписи повторно | История Mirror догнала consensus, а scheduled record и executed_timestamp проверены отдельно |
- Состояние
- Не хватает допустимой подписи
- Безопасное действие
- Подписать после повторной проверки body
- Доказательство завершения
- Signatory появился, затем найден execution record
- Состояние
- Неверное тело, есть admin key
- Безопасное действие
- Удалить Schedule и создать новый
- Доказательство завершения
- deleted = true у старого, новый ID отделён
- Состояние
- Неверное тело, admin key нет
- Безопасное действие
- Не добавлять свою подпись, предупредить участников и мониторить; удалить Schedule нельзя
- Доказательство завершения
- Только отсутствие execution record после окончательной обработки expiry доказывает, что тело не исполнилось
- Состояние
- Executed, но effect не виден
- Безопасное действие
- Прочитать result и дочерние данные record
- Доказательство завершения
- Result и network state объясняют исход
- Состояние
- Deleted или expiry окончательно обработан
- Безопасное действие
- Не отправлять подписи повторно
- Доказательство завершения
- История Mirror догнала consensus, а scheduled record и executed_timestamp проверены отдельно
Если тело содержит token transfer, отдельно проверьте ассоциацию и требуемую подпись получателя. Общий разбор подписи помогает не подтвердить другое действие, а модель multisig полезна для организационных ролей — но Schedule остаётся отдельным on-chain объектом со своим lifecycle.
Финальную запись проверяйте тем же способом, что обычный перевод: идентификатор, consensus result и изменение состояния должны указывать на одно действие.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Hedera Docs — Scheduled Transactions Hedera · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Hedera Mirror Node REST API — Get Schedule by ID Hedera · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Hedera Mirror Node REST API — Get Transaction by ID Hedera · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Hedera protobuf — ScheduleInfo Hedera · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Hedera Mirror Node — OpenAPI v1 Hedera · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Hedera protobuf — ResponseCodeEnum Hedera · Проверено 30 августа 2026 г. в 16:16 GMT+5
