Сначала определите слой отказа

Похожие сообщения относятся к разным слоям
НаблюдениеЧто не прошлоЧто проверять первым
TAPOS_ERRORПара полей опорного блока не совпала с недавним блоком узлаref_block_bytes, ref_block_hash и синхронизацию узла
TRANSACTION_EXPIRATION_ERRORИстёк жёсткий срок raw_data.expirationexpiration в миллисекундах и время блока
SIGERRORПодпись не соответствует raw_data или разрешению аккаунтаТочные байты подписываемых данных и разрешение подписанта
FAILED / OUT_OF_ENERGY в квитанцииТранзакция дошла до исполнения в цепочкеКвитанцию, результат и расход ресурсов
Похожие сообщения относятся к разным слоям
Наблюдение
TAPOS_ERROR
Что не прошло
Пара полей опорного блока не совпала с недавним блоком узла
Что проверять первым
ref_block_bytes, ref_block_hash и синхронизацию узла
Наблюдение
TRANSACTION_EXPIRATION_ERROR
Что не прошло
Истёк жёсткий срок raw_data.expiration
Что проверять первым
expiration в миллисекундах и время блока
Наблюдение
SIGERROR
Что не прошло
Подпись не соответствует raw_data или разрешению аккаунта
Что проверять первым
Точные байты подписываемых данных и разрешение подписанта
Наблюдение
FAILED / OUT_OF_ENERGY в квитанции
Что не прошло
Транзакция дошла до исполнения в цепочке
Что проверять первым
Квитанцию, результат и расход ресурсов

Reference block — это два фрагмента одного блока

В `raw_data` поле `ref_block_bytes` хранит двухбайтовый интервал [6, 8) номера опорного блока. Поле `ref_block_hash` хранит восьмибайтовый интервал [8, 16) идентификатора того же блока. Валидатор ищет запись по первому фрагменту в `RecentBlockStore`, а затем сравнивает второй. Если записи нет или хеш не совпал, `java-tron` выбрасывает `TaposException`. Самого совпадения двух байт номера недостаточно.

Двухбайтовое пространство охватывает 65 536 значений, поэтому TRON принимает только недавнюю ссылку, которую узел ещё хранит. Официальная документация рекомендует брать свежий подтверждённый блок со статусом `solidified`. Он немного старше вершины, зато уже относится к подтверждённому участку цепочки. Ссылка может перестать подходить после долгого офлайн-подписания, рассинхронизации узла или смены ветки.

Минимальный снимок исходной транзакции
ПолеКак зафиксироватьЧто доказывает
txID и сериализованные байтыСохранить до любых измененийКакой именно подписанный объект диагностируется
ref_block_bytesДва байта из raw_dataКлюч поиска недавнего номера, но не полный номер
ref_block_hashВосемь байт из raw_dataФрагмент идентификатора блока, который должен совпасть с найденным блоком
expirationМиллисекунды Unix из raw_dataДо какого момента транзакция может быть включена
Код и сообщение отправкиИсходный ответ конкретного узлаНа каком этапе предварительной проверки произошёл отказ
Минимальный снимок исходной транзакции
Поле
txID и сериализованные байты
Как зафиксировать
Сохранить до любых изменений
Что доказывает
Какой именно подписанный объект диагностируется
Поле
ref_block_bytes
Как зафиксировать
Два байта из raw_data
Что доказывает
Ключ поиска недавнего номера, но не полный номер
Поле
ref_block_hash
Как зафиксировать
Восемь байт из raw_data
Что доказывает
Фрагмент идентификатора блока, который должен совпасть с найденным блоком
Поле
expiration
Как зафиксировать
Миллисекунды Unix из raw_data
Что доказывает
До какого момента транзакция может быть включена
Поле
Код и сообщение отправки
Как зафиксировать
Исходный ответ конкретного узла
Что доказывает
На каком этапе предварительной проверки произошёл отказ

Проверка до новой подписи

Диагностический алгоритм

  1. 1
    Зафиксировать исходник

    Сохраните `raw_data`, подписи, `txID`, адрес узла и полный ответ на отправку. Снимок короткой ошибки не позволяет сравнить пару опорных полей.

  2. 2
    Проверить узел

    Сверьте его вершину и подтверждённое состояние с независимым синхронизированным источником. Сильно отставший или оказавшийся на другой ветке узел может отвергать набор данных, построенный для иной вершины.

  3. 3
    Восстановить reference block

    Найдите недавний блок с тем же интервалом номера и сравните байты [8, 16) его идентификатора с `ref_block_hash`. Не подставляйте похожую высоту без проверки хеша.

  4. 4
    Отделить срок

    Сравните `expiration` со временем цепочки. `Timestamp` — запись о сборке, а не разрешение на включение; его исправление без нового срока не оживляет транзакцию.

  5. 5
    Исключить уже состоявшийся перевод

    Поищите прежний `txID` и квитанцию через узел, который отдаёт подтверждённые данные. Это особенно нужно, если подписанный набор до ошибки отправлялся другому узлу.

Публичный хеш помогает установить наличие транзакции и квитанции, но не заменяет исходный ответ узла на отправку. Сначала примените общий порядок проверки транзакции, а затем разбирайте поля TRON.

Пересобрать можно только после проверки намерения

Решение по наблюдаемому состоянию
СостояниеБезопасное действиеКонтроль результата
Опорная пара не совпала; txID нигде не найденПолучить свежий подтверждённый блок, пересобрать raw_data и ещё раз проверить получателя и суммуНовая подпись, новый txID, успешная отправка и подтверждённая квитанция
Опорная пара совпадает, но expiration истёкНе отправлять старые байты; после проверки намерения собрать новый срок и опорную паруУбедиться, что прежний txID отсутствует, а новый включён
Исходный txID найденНе создавать заменуРазобрать квитанцию и подтверждение именно найденной транзакции
Узел заметно отстаёт или расходится с независимымНе доверять ему сборку и отправку до синхронизацииПовторить проверку опорных полей на исправном узле
Отправка принята, квитанции пока нетПока срок жив, можно повторно доставить только те же подписанные байтыНе пересобирать до истечения и подтверждённого отсутствия в цепочке
Решение по наблюдаемому состоянию
Состояние
Опорная пара не совпала; txID нигде не найден
Безопасное действие
Получить свежий подтверждённый блок, пересобрать raw_data и ещё раз проверить получателя и сумму
Контроль результата
Новая подпись, новый txID, успешная отправка и подтверждённая квитанция
Состояние
Опорная пара совпадает, но expiration истёк
Безопасное действие
Не отправлять старые байты; после проверки намерения собрать новый срок и опорную пару
Контроль результата
Убедиться, что прежний txID отсутствует, а новый включён
Состояние
Исходный txID найден
Безопасное действие
Не создавать замену
Контроль результата
Разобрать квитанцию и подтверждение именно найденной транзакции
Состояние
Узел заметно отстаёт или расходится с независимым
Безопасное действие
Не доверять ему сборку и отправку до синхронизации
Контроль результата
Повторить проверку опорных полей на исправном узле
Состояние
Отправка принята, квитанции пока нет
Безопасное действие
Пока срок жив, можно повторно доставить только те же подписанные байты
Контроль результата
Не пересобирать до истечения и подтверждённого отсутствия в цепочке

Перед новой подписью снова проверьте, что именно подписывает кошелёк: адрес получателя, сумму, данные вызова контракта и разрешения. Смена опорного блока не переносит старое доверие на изменённый набор данных. После включения TAPOS уже не объясняет итог исполнения. `FAILED` и `OUT_OF_ENERGY` разбирают по квитанции, а доставку подтверждают по хешу, статусу и подтверждённому блоку.

В журнале разбора должны остаться исходный и новый `txID`, обе опорные пары, `expiration`, состояние узла и подтверждённая квитанция. Если новой квитанции нет, зафиксируйте точную причину остановки и не пересобирайте транзакцию до следующей проверки.

Источники

Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.

  1. TRON Developers — Transactions and TAPOS TRON DAO · Проверено 28 августа 2026 г. в 00:04 GMT+5
  2. TRON Developers — Broadcast and RPC errors TRON DAO · Проверено 28 августа 2026 г. в 00:04 GMT+5
  3. java-tron — pinned TAPOS validation implementation TRON Protocol · Проверено 28 августа 2026 г. в 00:04 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.