Транзакция Pending — это состояние, при котором операция уже создана или отправлена в сеть, но ещё не получила окончательного результата, на который можно безопасно опираться. В одном кошельке слово Pending означает «хэш уже известен, но блока ещё нет», в другом — «запрос подписан и отправлен через RPC», а в третьем интерфейс продолжает показывать ожидание даже после того, как сеть уже изменила статус. Поэтому первое правило диагностики — не трактовать одну надпись как универсальный технический диагноз.
У разных блокчейнов жизненный цикл операции устроен по-разному. В Ethereum и совместимых сетях важны nonce, комиссия и замена транзакции; в Bitcoin — локальные mempool узлов, feerate, зависимости UTXO и правила replacement; в Solana — recent blockhash и срок его валидности; в TON — асинхронная цепочка сообщений и уровни finality. Из-за этих различий совет «просто подождать» иногда верен, а иногда скрывает уже истёкшую, вытесненную или заменённую операцию.
Практическая цель этой статьи — дать единый алгоритм: определить сеть, найти TxID или понять, почему его нет, проверить фактическое состояние в независимом источнике, установить причину задержки и только потом решать, ждать, повышать комиссию, заменять операцию или формировать новую. Для базового понимания идентификатора полезен материал OneMagic о том, что такое TxID транзакции, а для проверки конкретного хэша — пошаговая проверка транзакции по TxID.
Самая опасная реакция на Pending — повторно нажать Send, не выяснив судьбу первой операции. Повтор может создать второй перевод, альтернативную транзакцию с тем же nonce, новый конфликт UTXO или просто ещё одну запись, которую придётся диагностировать. Безопасный порядок обратный: сначала фиксируем исходную операцию и её параметры, затем принимаем решение. Такой подход снижает риск и технической ошибки, и паники из-за медленного интерфейса.
Что значит Pending: где заканчивается интерфейс и начинается блокчейн
Pending — это не единый протокольный статус для всех сетей
Слово Pending чаще всего является удобной меткой приложения. Она сообщает, что ожидаемое состояние ещё не достигнуто, но не объясняет, на каком именно этапе остановилась операция. Один клиент может пометить как Pending транзакцию, которая находится в публичном mempool, другой — локально подписанный объект, который ещё не распространился, третий — уже включённую операцию, пока его индексатор не обновил карточку. Для диагностики нужно выйти за пределы одной подписи в интерфейсе.
Правильный вопрос звучит не «почему висит Pending», а «какой артефакт существует прямо сейчас». Если есть сетевой hash, можно искать его в узлах и обозревателях. Если hash отображается только локально и нигде больше не найден, возможна проблема публикации. Если блок уже есть, но интерфейс отстаёт, повторная отправка ничего не исправит. Разделение этих состояний экономит время и предотвращает дублирование операции.
Подписание и публикация — разные этапы
Кошелёк сначала формирует данные, затем владелец подтверждает их ключом, после чего подписанный объект передаётся узлу. Успешная подпись доказывает авторизацию, но сама по себе не означает, что сеть увидела транзакцию. Ошибка RPC, потеря соединения или отказ узла принять параметры способны оставить пользователя с ощущением «я уже отправил», хотя публичного объекта ещё нет. Поэтому наличие подписи нельзя приравнивать к broadcast.
Если приложение показывает TxID, проверяйте его независимо. Если TxID отсутствует, изучайте историю активности и сообщения об ошибке. Для неизвестного хэша полезна отдельная диагностика OneMagic почему TxID не найден в блокчейне. Главное — не вводить seed-фразу в сторонние сервисы: для публичного поиска транзакции она не нужна.
Broadcast означает распространение, но не включение в блок
После отправки узел проверяет базовую валидность и при подходящих условиях передаёт объект дальше. Даже если несколько узлов знают транзакцию, она ещё не стала частью подтверждённого состояния. Блок-продюсер или валидатор должен включить её согласно правилам сети, доступному месту и экономическим условиям. Поэтому «видна в сети» и «подтверждена» — два разных уровня уверенности.
Это различие особенно важно при оплате или передаче ценности. Наличие hash позволяет наблюдать путь, но не гарантирует финальность. Получатель может заранее определить допустимый порог подтверждений. Пользователь со своей стороны должен понимать, что Pending — промежуточный этап, а не доказательство успешного завершения и не доказательство провала.
Confirmed и Finalized тоже не всегда одно и то же
Некоторые сети различают раннее подтверждение и более сильную финальность. Операция может считаться включённой, но ещё находиться в окне, где теоретически возможна реорганизация или смена канонического состояния. Интерфейсы часто упрощают это до одного слова Success, однако для крупной суммы важно знать, какой уровень подтверждения показывает источник.
Не переносите терминологию одной сети на другую. В Bitcoin обычно считают глубину подтверждений; Solana использует уровни commitment; TON потоковые данные могут двигаться от pending к confirmed и finalized. Цель пользователя не запомнить все названия, а понимать принцип: чем важнее необратимость, тем сильнее должен быть критерий завершения.
Failed — не Pending, даже если ожидаемое действие не произошло
В EVM-сети транзакция может попасть в блок и завершиться revert. Она уже не Pending: сеть обработала попытку, nonce обычно использован, а комиссия могла быть списана. Пользователь видит, что токен не переместился, и ошибочно решает «ещё ждёт». Такой диагноз ведёт к неправильным действиям, потому что повышать комиссию уже включённой failed-транзакции бессмысленно.
Всегда различайте отсутствие результата и отсутствие финального статуса. Failed требует изучения receipt и причины исполнения: недостаточный gas limit, условие контракта, pause, неверные параметры или другая логика. Pending требует анализа очереди и условий включения. Эти ветки начинаются одинаково с TxID, но дальше расходятся.
Queued — частный случай ожидания из-за порядка
Некоторые кошельки отдельно показывают Queued, когда транзакция с более высоким nonce не может быть обработана раньше операции с меньшим nonce. Она может иметь привлекательную комиссию и быть полностью валидной, но последовательность аккаунта блокирует её включение. В таком случае попытка ускорить только позднюю транзакцию не устраняет исходный барьер.
Для EVM сначала находят самый ранний неподтверждённый nonce. Именно он задаёт начало очереди. Если проблема в nonce-gap, диагностировать нужно предшественника, а не последнюю карточку. В UTXO-сетях аналогичный по смыслу эффект может создавать неподтверждённый родитель, от выхода которого зависит дочерняя транзакция, хотя механизм там другой.
| Надпись | Что можно заключить | Чего нельзя заключить |
|---|---|---|
| Signed | Ключ авторизовал данные | Что сеть получила объект |
| Broadcast | Узел принял/распространяет | Что операция войдёт в следующий блок |
| Pending | Финальный результат не достигнут | Причину ожидания |
| Confirmed | Есть подтверждённое включение | Что во всех сетях достигнута максимальная финальность |
| Failed | Исполнение завершилось ошибкой | Что операция ещё ждёт |
Почему транзакция становится Pending: основные причины
Комиссия слишком низкая относительно текущего спроса
Во многих сетях место в блоке является ограниченным ресурсом. Когда одновременно отправляется много операций, валидаторы или майнеры предпочитают более конкурентные предложения по комиссии в рамках правил протокола и локальной политики. Транзакция с низким fee может оставаться валидной, но ждать дольше. Это не обязательно сбой: пользователь выбрал цену, которая временно не соответствует рынку блока.
Диагностика начинается с сравнения вашей комиссии с текущими условиями именно в этой сети. В Bitcoin смотрят feerate в sat/vB, в EVM — max fee и priority fee относительно base fee и текущего спроса. Не используйте абстрактную фразу «комиссия высокая»: нужна сопоставимая единица и понимание, хватает ли параметров для включения.
Предыдущая операция блокирует nonce
Для обычных Ethereum-аккаунтов nonce идёт последовательно. Если транзакция с nonce 41 остаётся неподтверждённой, операции 42 и 43 не могут перескочить через неё в канонической последовательности аккаунта. Кошелёк может показывать несколько Pending сразу, хотя корневая причина одна. Повышение комиссии только у 43 не решит очередь.
Найдите минимальный pending nonce и сравните его с подтверждённым transaction count адреса. Затем решайте судьбу именно этой операции: ждать, заменить с тем же nonce и подходящими fee либо использовать поддерживаемый клиентом сценарий отмены. После включения или замены раннего nonce следующие операции смогут продвигаться.
Узел не распространил транзакцию широко
Публичная сеть состоит из множества узлов с разной связностью и локальной политикой. Ваш RPC мог принять запрос, вернуть hash и при этом не обеспечить устойчивое распространение. Возможен и обратный сценарий: один обозреватель ещё не индексировал объект, тогда как другие узлы его уже видят. Один источник недостаточен для вывода о сетевом статусе.
Сравните минимум два независимых источника и проверьте адрес отправителя. Если hash нигде не находится, но nonce адреса не изменился, вероятна проблема до включения. Если транзакция видна нескольким узлам, анализ смещается к fee, конфликтам и зависимостям. Не пытайтесь «чинить RPC» отправкой средств на новый адрес.
Транзакция вытеснена или забыта mempool
Mempool — не вечный глобальный архив. В Bitcoin каждый узел хранит собственный набор неподтверждённых операций в пределах своей политики и ресурсов. При длительном ожидании, недостаточном feerate или конфликтах объект может исчезнуть из части mempool. В EVM-клиентах также существуют правила удержания, replacement и очистки. Исчезновение из одного пула не равняется отмене в юридическом смысле и не гарантирует, что другой узел забыл транзакцию.
Перед повторной отправкой проверьте, не появилась ли альтернативная транзакция, использующая те же входы или nonce. Если старый объект действительно больше нигде не известен и условия сети допускают новую отправку, кошелёк может сформировать её заново. Но решение должно опираться на проверку, а не на отсутствие карточки в одном explorer.
Конфликт или replacement создал новый hash
В некоторых сетях ожидающая транзакция может быть заменена альтернативой. В EVM используется тот же nonce с более конкурентными fee; в Bitcoin возможны replacement-сценарии для подходящих транзакций. Старый hash тогда способен показываться как dropped, replaced или оставаться известным в историческом кеше, а фактическое состояние продолжает уже новый hash.
Диагностируйте по ресурсу, который не может быть использован дважды: nonce аккаунта или входы UTXO. Если существует новая подтверждённая операция с тем же логическим ресурсом, старая уже не станет независимым вторым результатом. Сохраняйте связь old hash → new hash, иначе история выглядит как необъяснимое исчезновение.
Интерфейс отстаёт от сети
Кошелёк часто получает историю не напрямую из полного узла, а через индексатор или собственный backend. Такой слой может кешировать статус, временно не видеть новый блок или ошибаться после переключения сети. В результате explorer уже показывает подтверждение, а приложение продолжает писать Pending. Это проблема отображения, а не состояния активов.
Если независимый источник показывает включённую транзакцию с правильными адресами и результатом, не создавайте повторную операцию из-за старой надписи. Обновите данные клиента, проверьте сеть и при необходимости подождите синхронизацию. Блокчейн-состояние имеет приоритет над устаревшей карточкой интерфейса.
| Причина | Главный признак | Первое действие |
|---|---|---|
| Низкая комиссия | Транзакция видна, но долго не включается | Сравнить fee с текущим рынком |
| Nonce-gap | Есть более ранний pending nonce | Разобрать самую раннюю операцию |
| Слабый broadcast | Hash видит один источник или никто | Проверить независимые узлы |
| Eviction/drop | Hash исчез из части mempool | Проверить конфликт/повтор |
| Replacement | Появился новый hash с тем же nonce/inputs | Следить за заменой |
| Лаг интерфейса | Explorer уже показывает блок | Не отправлять повторно |
Ethereum и EVM: как разбирать Pending по nonce и gas
Nonce определяет порядок исходящих транзакций аккаунта
У обычного EVM-аккаунта каждая исходящая транзакция имеет последовательный nonce. Подтверждённое состояние хранит следующий ожидаемый номер, а mempool может содержать будущие номера. Пока операция с меньшим nonce не будет включена или заменена, последующие транзакции останутся в ожидании. Поэтому список Pending нужно сортировать не по времени интерфейса, а по nonce.
Откройте explorer и сравните nonce каждой операции. Если видите цепочку 17, 18, 19, а 17 всё ещё Pending, корень проблемы находится там. Исправление 17 часто автоматически разблокирует следующие. Если же только одна транзакция ожидает и nonce соответствует текущему, переходите к анализу fee и распространения.
Base fee и priority fee влияют на пригодность к включению
Современная EVM-транзакция может задавать maxFeePerGas и maxPriorityFeePerGas. Фактическое включение зависит от base fee блока и чаевых валидатору в пределах лимитов. Если максимальная ставка не покрывает актуальную базовую стоимость, транзакция не сможет быть включена, пока base fee не снизится или пользователь не создаст подходящую замену.
Сравнивайте параметры самой транзакции с текущими блоками, а не только итоговую оценку в фиатной валюте. Кошелёк мог сформировать fee в момент низкой нагрузки, после чего рынок резко изменился. Технический диагноз «max fee недостаточен» намного полезнее общей фразы «сеть перегружена».
Speed Up обычно означает replacement с тем же nonce
Функция Speed Up не толкает старый объект специальной командой. Кошелёк создаёт альтернативную транзакцию, которая использует тот же nonce и более привлекательные условия комиссии. Если сеть принимает replacement, один из вариантов будет включён, а другой станет неактуальным. Поэтому после ускорения нормально увидеть новый hash.
Перед подтверждением проверьте, что получатель, value и data соответствуют ожидаемой операции. Не считайте любое окно Speed Up безопасным только из-за названия кнопки. Вредоносный интерфейс способен предложить другую транзакцию под тем же общим сценарием. После отправки отслеживайте hash замены и итоговый receipt.
Cancel в EVM — попытка заменить, а не удалить прошлую транзакцию
Классическая отмена формируется как новая транзакция с тем же nonce, часто на собственный адрес и с нулевой ценностью, но с более высокой комиссией. Если она будет включена первой, исходная операция уже не сможет использовать тот же nonce. Это соревнование альтернатив, а не команда блокчейну стереть подписанный объект.
Если исходная транзакция уже подтверждена, такой Cancel не откатывает её. Сначала проверяйте blockNumber и receipt. Не создавайте отмену по устаревшему Pending-статусу приложения. Для токеновых операций также учитывайте, что отдельный approve или permit мог уже создать право до попытки отменить следующую бизнес-операцию.
Failed транзакция потребляет nonce и обычно не блокирует очередь
Если EVM-вызов включён в блок и завершился revert, nonce уже использован. Следующие транзакции аккаунта могут продолжать подтверждаться. Пользователь может видеть отсутствие желаемого token transfer и считать, что очередь всё ещё заблокирована, хотя причина уже в failed execution.
Проверьте status receipt, gas used и logs. Если status failed, повышать fee этой уже включённой транзакции поздно. Нужно понять причину revert и при необходимости создать новую операцию с новым nonce. Это принципиально другой сценарий, чем Pending из-за недостаточной комиссии.
L2 использует похожие понятия, но имеет дополнительный уровень финальности
Во многих EVM-L2 пользователь видит быстрое локальное включение, после чего данные проходят дальнейшую публикацию и финализацию относительно базового слоя. Интерфейс может использовать слова Pending, Confirmed или Finalized по собственной модели. Поэтому не переносите ожидания mainnet Ethereum на конкретный rollup без понимания его статусов.
Для обычной диагностики сначала проверяют sequencer/L2 explorer и фактический receipt. Если операция включена на L2, но приложение ждёт более сильной финальности, повторная отправка не нужна. Если hash отсутствует на уровне L2, возвращайтесь к broadcast, nonce и RPC. Отдельно проверяйте состояние мостовых сообщений, потому что они могут иметь второй жизненный цикл.
| EVM-признак | Что означает | Решение |
|---|---|---|
| blockNumber = null | Объект известен, но не включён | Проверить nonce и fee |
| Есть более ранний nonce | Очередь заблокирована предшественником | Исправить ранний nonce |
| Новый hash, тот же nonce | Replacement | Следить за новой версией |
| Receipt status = 0 | Вызов включён и failed | Разобрать revert |
| Receipt status = 1 | Исполнение завершено | Не повторять из-за лага UI |
Bitcoin: Pending, mempool, feerate и зависимости UTXO
У Bitcoin нет одного глобального mempool
Каждый Bitcoin-узел хранит собственный набор неподтверждённых транзакций согласно ресурсам и политике. Большая часть популярных операций быстро распространяется и наборы похожи, но гарантированной идентичности нет. Один explorer способен видеть транзакцию, которую другой узел уже вытеснил или ещё не получил. Поэтому «в mempool» — наблюдение относительно конкретного узла или сети наблюдения.
Для практики это означает, что Pending в Bitcoin нужно проверять несколькими источниками, особенно после долгого ожидания. Если hash известен многим узлам, анализируйте feerate и зависимости. Если объект исчез почти везде, проверьте replacement, конфликт inputs и возможность безопасного повторного broadcast через собственный кошелёк.
Feerate в sat/vB важнее абсолютной комиссии
Майнер сравнивает транзакции по экономике занимаемого блока, поэтому абсолютная комиссия без размера мало что говорит. Большая транзакция может заплатить больше sat суммарно и при этом иметь низкий sat/vB. Именно feerate позволяет сопоставить операцию с текущим рынком комиссии. Для оценки до отправки используйте материал OneMagic о комиссии Bitcoin в sat/vB.
Если feerate ниже диапазона, который реально попадает в блоки, ожидание может затянуться. Нельзя обещать точное время только по одному числу: спрос меняется, а майнеры используют собственные шаблоны. Диагноз должен быть вероятностным — насколько конкурентна транзакция сейчас и есть ли технический способ повысить экономический стимул.
Неподтверждённый родитель способен удерживать ребёнка
Bitcoin-транзакция расходует UTXO. Если новый перевод использует выход предыдущей неподтверждённой операции, возникает цепочка parent-child. Дочерняя транзакция не может получить независимое подтверждение без родителя, потому что её вход ещё не существует в подтверждённом UTXO-наборе. Wallet может показывать только последнюю операцию, скрывая корневую зависимость.
Постройте ancestry в explorer: какие входы использованы и подтверждены ли транзакции, создавшие эти outputs. Иногда пользователь повышает fee дочерней операции и не понимает, почему ситуация почти не меняется. Экономика пакета и правила mempool важнее одной карточки.
RBF позволяет заменить подходящую транзакцию
Replace-By-Fee даёт способ предложить альтернативную версию неподтверждённой транзакции с более привлекательной комиссией при соблюдении действующих правил. Это не универсальная кнопка для любой исторической операции. Возможность зависит от кошелька, политики и структуры транзакции. После replacement старый TxID может быть помечен как replaced или conflicted.
Не используйте случайные «ускорители», которые требуют seed или private key. Для подробного сценария OneMagic уже имеет отдельный материал о RBF и CPFP для зависшего Bitcoin-перевода. Текущая статья ограничивается диагностикой того, когда такое вмешательство вообще уместно.
CPFP меняет экономику пакета через дочернюю транзакцию
Child Pays For Parent работает иначе: вместо замены родителя создаётся дочерняя транзакция с достаточной комиссией, чтобы пакет parent+child стал привлекательнее для включения. Метод требует контролируемого выхода, который можно потратить, и экономически осмысленного результата. Он не отменяет исходную транзакцию и не создаёт магическую приоритетную очередь.
Перед CPFP посчитайте суммарный размер и fee пакета. Если выбранный кошелёк автоматически управляет этим механизмом, всё равно проверьте итоговые параметры. Для небольшой суммы чрезмерное повышение комиссии может оказаться хуже ожидания, особенно если срочность не критична.
Zero confirmations — видимость без финальной защиты блока
Транзакция может широко находиться в mempool и показываться как 0 confirmations. Это полезный сигнал, что сеть её знает, но подтверждённого блока ещё нет. Для мелких низкорисковых случаев некоторые системы принимают такую вероятность, однако её нельзя путать с окончательной необратимостью.
Чем выше стоимость необратимого действия получателя, тем важнее заранее определить порог подтверждений. Пользователю не нужно гадать «сколько всегда достаточно»: критерий зависит от риска. Для технической проверки конкретного Bitcoin TxID используйте отдельное руководство по Bitcoin-транзакции.
| Bitcoin-ситуация | Что проверить | Типичный следующий шаг |
|---|---|---|
| Низкий sat/vB | Рынок комиссии и размер vB | Ждать или штатно повысить fee |
| Есть parent | Подтверждения входов | Оценить пакет/CPFP |
| RBF replacement | Новый TxID и inputs | Следить за заменой |
| Исчез из одного mempool | Другие узлы и конфликты | Не считать отменённой автоматически |
| 0 confirmations | Наличие без блока | Ждать требуемую глубину |
Solana: Pending, recent blockhash и истечение транзакции
Solana-транзакция содержит recent blockhash
В Solana recent blockhash участвует в защите от повторного воспроизведения и задаёт ограниченное окно валидности обычной транзакции. Это фундаментальное отличие от сценария, где один и тот же подписанный объект можно держать в очереди сколь угодно долго. Если транзакция не попала в блок до истечения допустимого окна, старую подпись нельзя считать вечной ожидающей операцией.
Поэтому надпись Pending в Solana обязательно сопоставляют с lastValidBlockHeight или аналогичными данными, которые получил клиент. Если окно уже прошло, задача меняется: нужно подтвердить, что старая транзакция не была включена, и затем сформировать новую с актуальным blockhash. Слепой бесконечный rebroadcast старого объекта не исправляет его срок действия.
Processed, confirmed и finalized отражают разные уровни
Solana RPC позволяет запрашивать состояние с разным commitment. Ранний processed означает, что узел видел операцию в своей текущей обработке; confirmed даёт более сильную уверенность; finalized относится к более устойчивому каноническому результату. Wallet может выбрать один уровень для отображения Success, а приложение-получатель — другой.
Если интерфейсы расходятся, сравните, какой commitment использует каждый источник. Не отправляйте перевод заново только потому, что один сервис ждёт finalized. Сначала найдите signature, блок и фактический status. Разница в требуемом уровне подтверждения — нормальная часть архитектуры, а не обязательно потеря операции.
Blockhash может истечь раньше, чем пользователь ожидает
Recent blockhash хранится в ограниченной очереди, и runtime принимает только достаточно свежие значения. При задержке подписи, плохой связи или повторной отправке через несинхронизированный RPC транзакция способна достигнуть границы валидности. Тогда она не станет подтверждённой позднее просто от ожидания.
Клиенту полезно сохранять lastValidBlockHeight и сравнивать его с текущей высотой. Если высота превысила предел и signature нигде не подтверждена, старая транзакция считается истёкшей. Новая отправка должна заново получить blockhash и подпись, потому что изменяется сообщение транзакции.
RPC может ошибочно создавать впечатление, что транзакция пропала
Разные RPC-узлы могут находиться на разных слотах, иметь разную нагрузку и по-разному ретранслировать запросы. Один узел может не видеть signature, которую другой уже передал валидатору. Кроме того, preflight и отправка при несогласованных commitment способны давать странные ошибки blockhash not found.
Проверяйте signature в независимом RPC или explorer и сравнивайте текущий block height. Если операция ещё в валидном окне, имеет смысл дать клиенту продолжить штатный retry. Если окно истекло, формируйте новый объект. Разделение этих случаев предотвращает хаотические повторные подписи.
Priority fee влияет на шанс включения в период нагрузки
Solana позволяет добавлять приоритетную комиссию через compute budget. В периоды высокой конкуренции транзакция с низким стимулом может не попасть в блок до истечения recent blockhash. Это отличается от бесконечного Pending: итогом становится expiry, после которого нужна новая транзакция.
Не повышайте fee без анализа причины. Simulation может показать ошибку инструкции, недостаток баланса или конфликт account locks — в таком случае дополнительная плата не исправит логику. Сначала отделите экономическую конкуренцию от технического отказа.
После истечения новая транзакция должна быть проверена как отдельная
Когда старая Solana-транзакция точно не была включена и recent blockhash истёк, пользователь формирует новую. Несмотря на одинаковую бизнес-цель, это новый подписанный объект и обычно новая signature. Перед подтверждением снова сверяют destination, amount, mint, instructions и fee.
Не используйте память о прошлой карточке как доказательство правильности новой. Интерфейс мог изменить route или параметры. Архивируйте обе signature с пометкой expired/new, чтобы позже не считать их двумя независимыми успешными переводами.
| Solana-состояние | Диагноз | Что делать |
|---|---|---|
| Signature найдена, valid window не истёк | Ожидание/распространение | Проверять status и block height |
| Blockhash expired, включения нет | Старая транзакция больше невалидна | Сформировать новую |
| Processed | Ранний уровень | Не путать с максимальной финальностью |
| Confirmed | Более сильное подтверждение | Сверить требования получателя |
| Finalized | Устойчивое завершение | Не повторять |
TON: почему Pending нужно читать через сообщения, trace и finality
TON использует асинхронную модель сообщений
В TON взаимодействие нескольких контрактов не обязано происходить внутри одной атомарной транзакции. Один аккаунт обрабатывает входящее сообщение, создаёт исходящие сообщения, а они приводят к следующим транзакциям на других аккаунтах. Поэтому пользовательская операция может состоять из trace, растянутого на несколько шагов и блоков. Одна ранняя запись не всегда означает завершение всей бизнес-логики.
Если интерфейс показывает Pending после появления первой транзакции, проверьте trace: какие сообщения уже обработаны, какие выходы созданы и дошло ли действие до конечного адреса или контракта. Не пытайтесь судить о TON только по привычной EVM-модели «один hash = вся операция». Асинхронность здесь является нормой.
External message сначала является намерением
Кошелёк отправляет внешнее сообщение, которое должно быть принято соответствующим аккаунтом. До появления on-chain транзакции пользователь может видеть локальное ожидание. Документация TON Connect рекомендует после отправки искать соответствующую транзакцию по нормализованному hash внешнего сообщения, а не считать сам факт отправки доказательством включения.
Если операция только что отправлена, небольшая задержка между отправкой и появлением on-chain нормальна. Но длительное отсутствие требует проверки адреса назначения, seqno/состояния кошелька и доступности узлов. Не создавайте десятки одинаковых сообщений, не понимая, был ли принят первый запрос.
Trace finality может двигаться от pending к confirmed и finalized
Современные потоковые API TON различают pending, confirmed и finalized для trace-based событий. Pending может отражать эмуляцию или спекулятивный результат, который ещё способен быть инвалидирован. Confirmed означает включение в кандидатный shard block, finalized — закрепление через masterchain. Поэтому слово Pending здесь действительно может быть отдельным уровнем finality, а не только UI-ярлыком.
Для важной операции проверяйте, какой finality вернул источник. Если приложение показывает только ранний уровень, дождитесь требуемого состояния. Повторять сообщение из-за того, что оно ещё не finalized, опасно: первое действие может уже находиться в trace и продолжать обработку.
Внутренние сообщения могут продолжаться после первого успеха
Смарт-контракт способен принять сообщение, изменить своё состояние и отправить дальнейшие сообщения. Пользователь видит успешную транзакцию на первом аккаунте, но конечный token transfer или callback ещё не завершён. Такой промежуток нельзя диагностировать как «деньги зависли» без анализа всей цепочки сообщений.
Откройте trace и найдите конечное действие. Если следующий контракт ещё не обработал сообщение, ждите дальнейшего исполнения и проверяйте состояние. Если сообщение bounced или action phase завершилась ошибкой, причина уже не Pending в общем смысле, а конкретный сбой асинхронного шага.
Bounce и aborted требуют отдельного анализа
TON-транзакция может иметь признаки aborted, bounce и коды фаз исполнения. Интерфейс, который упрощённо показывает «не завершено», скрывает важную семантику. Если compute или action phase неуспешна, простое ожидание не изменит уже зафиксированный результат соответствующего шага.
Разделяйте «trace ещё продолжается» и «шаг завершён с ошибкой». В первом случае наблюдают следующие сообщения; во втором изучают exit code, destination, value и bounce. Это позволяет избежать повторной отправки в контракт, который системно отвергает тот же payload.
Одинаковая бизнес-операция может иметь несколько технических идентификаторов
Поскольку trace включает дерево сообщений и транзакций, пользователь иногда пытается найти один универсальный TxID и путается. Для аудита полезно сохранить исходный external message hash или trace id, а также ключевые transaction hashes внутри цепочки. Тогда можно восстановить всю последовательность.
Такая дисциплина особенно важна для сложных контрактных действий. В собственном журнале операций фиксируйте сеть, время, исходный hash, конечный результат и важные промежуточные идентификаторы. Общую методику ведения доказуемой истории раскрывает материал OneMagic о журнале криптотранзакций.
| TON-признак | Что он может означать | Что проверить |
|---|---|---|
| External message sent | Запрос отправлен клиентом | Появилась ли on-chain transaction |
| Pending finality | Ранний/speculative trace | Не инвалидирован ли trace |
| Confirmed | Есть candidate shard block | Нужен ли finalized |
| Finalized | Trace закреплён | Проверить конечное действие |
| Aborted/Bounced | Шаг завершился ошибкой/возвратом | Коды фаз и destination |
Универсальный алгоритм: что делать, если транзакция Pending
Шаг 1. Зафиксируйте сеть, актив и адрес отправителя
До поиска причины запишите, в какой сети создавалась операция. Одинаковый формат адреса может встречаться в нескольких EVM-сетях, а один токен существует в разных блокчейнах. Проверка не того chain полностью искажает диагноз: пользователь ищет hash в Ethereum, хотя отправил в Base, или смотрит адрес токена вместо адреса владельца.
Скопируйте network name, chain ID при наличии, sender и asset identifier. Для переводов токенов отдельно сохраните contract/mint/master. Если сомневаетесь в сети USDT, используйте инструкцию по проверке сети перед переводом. Не выполняйте новые операции, пока базовые реквизиты не установлены.
Шаг 2. Найдите TxID, signature или исходный message hash
Главный технический артефакт зависит от сети. EVM и Bitcoin используют transaction hash; Solana — signature; TON может требовать отслеживания external message и trace. Если идентификатор существует, он позволяет уйти от субъективной карточки кошелька к публичным данным. Если его нет, это само по себе важный диагностический сигнал.
Копируйте идентификатор текстом из истории, а не перепечатывайте со скриншота. Сравните длину и начало/конец. Если приложение показывает internal request ID, не принимайте его за сетевой hash. При отсутствии TxID выясняйте, был ли вообще broadcast.
Шаг 3. Проверьте минимум два независимых источника
Один explorer или RPC может отставать, иметь кеш или временную ошибку. Для спорного Pending сравните другой обозреватель либо прямой RPC. Важна согласованность: существует ли объект, есть ли block/slot, какой статус и сколько подтверждений. Несовпадение источников помогает локализовать проблему инфраструктуры.
Не подключайте кошелёк и не подписывайте сообщения ради публичного чтения. Адрес и hash достаточны. Сервис, который просит seed-фразу «для синхронизации транзакции», создаёт критический риск и не нужен для диагностики.
Шаг 4. Проверьте порядок и зависимости
В EVM найдите nonce и более ранние pending-операции. В Bitcoin раскройте inputs и неподтверждённых родителей. В Solana сравните lastValidBlockHeight. В TON изучите trace сообщений. Это превращает абстрактное «зависло» в конкретную модель: очередь nonce, зависимость UTXO, expiry или незавершённая асинхронная цепочка.
Не пытайтесь применять один рецепт к разным причинам. Повышение gas не исправляет истёкший Solana blockhash, а повторный broadcast не устраняет EVM nonce-gap. Правильный механизм выбирается только после классификации состояния.
Шаг 5. Сравните fee с текущими условиями
Если транзакция валидна и ждёт включения, оцените экономический стимул. Для EVM это параметры gas относительно текущего base fee и спроса; для Bitcoin — sat/vB и пакетные зависимости; для Solana — условия приоритетной комиссии в момент отправки. Сравнивайте данные той же сети и той же единицы.
Не ориентируйтесь на «комиссию в долларах» без контекста. Цена актива меняется, а валидаторы принимают решение на протокольных параметрах. Цель — понять, является ли ожидание рациональным результатом низкой ставки или признаком другой проблемы.
Шаг 6. Решите: ждать, заменить, пересоздать или расследовать ошибку
После классификации выбор становится ограниченным. Ждать уместно, когда транзакция остаётся валидной и шансы включения приемлемы. Replacement подходит поддерживаемым сценариям EVM или Bitcoin. Пересоздание требуется после Solana expiry. Failed/aborted требуют исправления логики, а лаг интерфейса — только синхронизации.
Перед любым новым подписанием повторно сверяйте destination и amount. Не доверяйте автоматической кнопке только потому, что она называется Speed Up или Retry. Новая подпись — новый авторизованный объект, и её параметры нужно проверять заново.
| Этап | Артефакт | Критерий |
|---|---|---|
| Сеть | chain/network | Точно установлен |
| Идентификатор | TxID/signature/trace | Скопирован текстом |
| Состояние | 2 независимых источника | Статусы сопоставлены |
| Порядок | nonce/UTXO/blockhash/trace | Причина очереди понятна |
| Fee | протокольная единица | Сопоставлен с текущими условиями |
| Действие | wait/replace/recreate/investigate | Выбрано по причине |
Когда ждать, когда ускорять и когда не трогать транзакцию
Ожидание разумно, если операция валидна и риск времени низкий
Если транзакция широко видна, не конфликтует, комиссия близка к рабочему диапазону, а срочность невысока, вмешательство может быть не нужно. Любая replacement-операция добавляет комиссию и усложняет историю. В Bitcoin рынок комиссии способен снизиться, в EVM base fee меняется от блоков к блокам. Иногда ожидание — экономически лучший вариант.
Определите предел заранее: сколько времени вы готовы ждать и при каком изменении условий пересмотрите решение. Это лучше, чем каждые пять минут бессистемно повышать fee. Для важной оплаты сообщите второй стороне TxID и согласованный критерий завершения, не выдавая Pending за подтверждение.
Ускорение имеет смысл только при поддерживаемом механизме
EVM Speed Up и Bitcoin fee-bump работают по конкретным правилам. Они не являются универсальным ускорителем любого блокчейна. Перед использованием проверьте, позволяет ли исходная операция replacement и как кошелёк формирует новую версию. Сохраняйте old/new hash и итоговые комиссии.
Если приложение предлагает сторонний сайт, который просит приватный ключ, остановитесь. Легитимное повышение комиссии выполняется через ваш signer и публичные параметры. Никому не нужен секрет для того, чтобы увидеть Pending или рассчитать fee.
После Confirmed ускорять уже нечего
Когда транзакция включена и имеет достаточный статус, старый Pending в интерфейсе является проблемой отображения. Создание новой операции способно повторить перевод. Сначала обновите клиент и сравните баланс получателя. Особенно опасно нажимать Retry после push-уведомления об ошибке, не сверив блокчейн.
Если операция confirmed, но ожидаемое приложение не показывает результат, ищите проблему следующего слоя: индексатор, token display, контрактная логика или обработка получателя. Сетевая повторная отправка не является универсальным лекарством.
После Failed нужно исправить причину, а не повышать fee старой операции
Failed/revert означает завершённую попытку. В EVM nonce потреблён, в других сетях аналогично существует конкретный зафиксированный результат. Повтор с теми же ошибочными параметрами лишь создаст ещё одну неудачу. Читайте error/receipt и моделируйте новый вызов.
Если ошибка относится к gas limit, исправьте limit; если к balance — пополните нужный ресурс; если к contract condition — проверьте состояние приложения. Не подписывайте новый вызов, пока не можете объяснить, чем он отличается от failed-предшественника.
После expiry нужно убедиться в отсутствии включения до новой отправки
В сетях с ограниченным сроком валидности, например Solana, истечение recent blockhash меняет сценарий. Старый объект больше не может быть обработан при обычных правилах, однако пользователь всё равно обязан сначала убедиться, что он не был включён до expiry. Только затем безопасно формировать новую транзакцию.
Сохраните старую signature и пометьте её expired. Новая транзакция должна иметь актуальный blockhash и новую подпись. Такое документирование защищает от путаницы, когда кошелёк позже показывает обе записи в истории.
Никогда не отправляйте секреты «службе ускорения»
TxID, адреса, fee и публичный mempool достаточно для анализа. Seed-фраза, private key и код восстановления не помогают честному сервису ускорить сеть. Запрос таких данных означает попытку получить контроль над кошельком. Также опасны требования установить удалённый доступ или подписать неизвестное сообщение «для синхронизации».
Используйте штатные функции собственного кошелька и независимые explorers. Если требуется помощь, передавайте только публичные данные и обезличенные скриншоты без секретов. Для общего усиления защиты полезен материал как защитить криптокошелёк от взлома и ошибок.
| Ситуация | Что делать | Чего не делать |
|---|---|---|
| Валидна, fee приемлем | Ждать и наблюдать | Не дублировать перевод |
| EVM nonce stuck | Штатный replacement при необходимости | Не менять nonce наугад |
| Bitcoin low feerate | RBF/CPFP если применимо | Не отдавать seed ускорителю |
| Solana expired | Проверить отсутствие inclusion и пересоздать | Не rebroadcast старый blockhash |
| Confirmed, UI Pending | Обновить/проверить backend | Не отправлять заново |
| Failed | Исправить причину | Не повышать fee старой записи |
Статусы, которые часто путают с Pending: Dropped, Replaced, Expired и другие
Submitted без сетевого hash — это ещё не полноценный Pending
Некоторые приложения сначала создают внутреннюю запись Submitted и только затем отправляют подписанные данные в RPC. Если сеть отвергла запрос до broadcast, пользователь может видеть «ожидание» внутри приложения, хотя публичной транзакции нет. Такой случай диагностируется иначе, чем настоящий mempool Pending: сначала выясняют, существует ли сетевой идентификатор и видит ли его хотя бы один независимый узел.
Если hash не появился, изучите локальную ошибку: RPC timeout, invalid parameters, insufficient funds for fee, outdated blockhash, неверный chain ID. Не отправляйте повторно автоматически, если приложение могло успеть broadcast перед потерей ответа. Сначала проверьте историю sender и ожидаемый nonce или signature. Сетевое состояние важнее того, получил ли клиент красивое подтверждение от backend.
Rejected означает, что узел не принял объект в свою очередь
Транзакция может быть отклонена ещё до включения в mempool. Причины зависят от сети: невалидная подпись, неправильный nonce, недостаточный баланс для максимальной комиссии, устаревший blockhash, нарушение локальной policy или некорректный формат. Rejected не следует лечить ожиданием: если объект не принят, время само по себе не сделает его валидным.
Прочитайте точный RPC error и свяжите его с параметром. В EVM «nonce too low» может означать, что этот nonce уже использован; «replacement underpriced» — что новая версия недостаточно превосходит старую по fee; в Solana blockhash not found указывает на проблему свежести или выбранного состояния. Исправляйте причину, а не повторяйте идентичный запрос.
Dropped обычно означает исчезновение из наблюдаемой очереди
Когда explorer пишет Dropped, он сообщает, что больше не наблюдает транзакцию в используемых им источниках mempool. Это не всегда глобальное утверждение. Другой узел может всё ещё хранить объект, а старый hash может позднее оказаться связанным с replacement. Поэтому Dropped требует проверки состояния sender и конфликтующих операций.
Для EVM смотрят, какой nonce уже подтверждён и существует ли альтернативная транзакция с тем же nonce. Для Bitcoin проверяют, были ли потрачены те же inputs. Если конфликтующий вариант подтверждён, судьба старого объекта понятна. Если нет, решают, нужен ли rebroadcast или новая версия. Нельзя считать Dropped гарантией безопасной повторной оплаты без этой проверки.
Replaced — старая версия уступила место новой
Replacement создаёт важный эффект для пользователя: бизнес-намерение одно, а hash становится два или больше. Старый explorer-link перестаёт быть главным источником результата. В EVM логическая связь строится через sender и nonce; в Bitcoin — через конфликтующие inputs и правила replacement. Историю нужно читать как цепочку версий, а не как независимые переводы.
Сохраняйте old hash и new hash рядом. Если support или бухгалтерия увидит только старый Dropped, может возникнуть ложный вывод, что операция не состоялась. Фактический итог определяется той версией, которая попала в подтверждённое состояние. Для крупных переводов полезно фиксировать причину replacement и итоговую комиссию, чтобы позже восстановить ход решения.
Cancelled в кошельке часто технически является replacement
Кнопка Cancel создаёт психологическое ощущение, будто блокчейн получил команду удалить старую транзакцию. В EVM обычно происходит другое: пользователь подписывает альтернативный объект с тем же nonce, который должен быть включён раньше исходного. Если исходная версия успевает подтвердиться первой, попытка cancel уже не отменит совершившийся перевод.
Поэтому после нажатия Cancel следят за двумя hash и подтверждают победившую версию. Не закрывайте вопрос по локальной надписи «Cancelled». Если explorer показывает исходную транзакцию Success, результат уже произошёл. Если подтверждена нулевая self-transfer с тем же nonce, исходная версия потеряла возможность исполнения в обычной последовательности.
Expired принципиально отличается от низкоприоритетного ожидания
Expiry означает, что сама транзакция больше не удовлетворяет временному условию валидности. Наиболее очевидный пример — recent blockhash Solana: после превышения допустимого окна старая подпись не ждёт более удачного момента, а перестаёт быть пригодной к обработке. Аналогичные дедлайны могут существовать и внутри смарт-контрактных вызовов или подписанных разрешений.
Сначала установите, какой срок истёк: протокольный срок самой транзакции или бизнес-параметр внутри вызова. В первом случае нужен новый объект; во втором старая транзакция может попасть в блок, но закончиться ошибкой исполнения. Это разные риски. Никогда не называйте всё «просрочкой сети» без чтения конкретного параметра.
Queued означает ожидание другого события, а не только низкой комиссии
Queued чаще показывает структурную зависимость. В EVM это может быть более ранний nonce; в Bitcoin — неподтверждённый parent; в приложении — операция, которая ещё не отправлена из локальной очереди. Повышение fee текущей записи бессмысленно, если блокирующее условие находится до неё. Нужно определить первый незавершённый элемент цепочки.
Постройте последовательность от подтверждённого состояния к ожидаемому. Для EVM выпишите nonce по порядку. Для UTXO раскройте inputs до подтверждённых outputs. Для локального batch проверьте, какие операции приложение отправляет последовательно. Такой граф причин даёт больше пользы, чем попытка «ускорить всё» одновременно.
Stale — устаревшие данные интерфейса, а не состояние сети
Кеш кошелька или индексатора может хранить старую карточку Pending после подтверждения, replacement или failure. Это особенно вероятно после переключения RPC, восстановления приложения, временного сбоя backend или задержки push-событий. Пользователь видит красную или жёлтую метку и начинает менять on-chain состояние, хотя проблема существует только в представлении.
Проверяйте блокчейн независимо. Если правильный explorer показывает окончательный результат, обновляйте данные клиента, а не транзакцию. При необходимости очистите локальный кеш штатным способом или переключите доверенный RPC. Никогда не переустанавливайте кошелёк до проверки recovery, потому что попытка исправить UI может превратиться в проблему доступа.
Unconfirmed balance не равен доступному подтверждённому балансу
UTXO-кошелёк может показывать входящую неподтверждённую сумму в общем балансе, но способность потратить её зависит от политики клиента и дальнейших подтверждений. В account-based сетях интерфейс тоже способен предварительно отражать ожидаемое изменение. Пользователь видит деньги и предполагает, что операция завершена, хотя исходная транзакция всё ещё может быть заменена или исключена.
Для расчёта доступных средств смотрите подтверждённый state и правила конкретного кошелька. Не стройте цепочку срочных переводов на неподтверждённых поступлениях без понимания зависимостей. Чем больше последующих операций зависят от одного Pending, тем сложнее будет восстановление при replacement или expiry.
Pending token transfer может быть частью уже подтверждённого contract call
В EVM пользователь иногда видит успешную транзакцию, но ожидаемый токеновый эффект отсутствует. Это не всегда сетевой Pending. Вызов контракта мог завершиться без нужного Transfer event, вернуть другой результат или изменить состояние, которое интерфейс обрабатывает позже. Наличие blockNumber переводит диагностику из mempool в исполнение контракта.
Проверьте receipt, logs и фактический token balance. Если верхнеуровневый вызов Success, но event отсутствует, изучайте calldata и логику контракта. Если status Failed, причина в revert. Повторная отправка с большей комиссией не гарантирует токеновый результат, потому что проблема может находиться в условиях функции, а не во включении в блок.
Pending bridge-message — отдельный жизненный цикл после исходной транзакции
При межсетевой передаче исходная транзакция может быть подтверждена, а сообщение для целевой сети всё ещё ожидать доказательства, relay или финальности. Пользователь видит «Pending» на странице приложения и ошибочно считает, что первая сеть не обработала перевод. На самом деле on-chain шаг A завершён, а шаг B имеет собственный статус.
Разложите маршрут на этапы: source transaction, message/proof, destination execution. Проверяйте идентификатор каждого уровня. Нельзя отменить уже подтверждённый source-step простой заменой старого hash. Если destination задерживается, повтор исходной операции способен создать второй межсетевой маршрут. Сначала найдите message id и состояние целевого исполнения.
RPC timeout не доказывает, что sendTransaction не сработал
Клиент может отправить signed transaction, узел принять и распространить её, а HTTP/WebSocket соединение оборвётся до возврата ответа. Пользователь получает timeout и считает запрос неуспешным. Повторная отправка в этот момент опасна: первая транзакция уже может существовать в сети. Этот класс ошибок особенно коварен тем, что UI и блокчейн расходятся с первых секунд.
После timeout ищите транзакцию по заранее известному hash, sender+nonce или signature. Хороший кошелёк способен вычислить hash подписанного EVM/Bitcoin объекта до broadcast и сохранить его. Если идентификатора нет, изучайте sender history. Повтор выполняют только после того, как исключено существование первой версии.
Hardware signer подтверждает подпись, но не гарантирует broadcast
Аппаратное устройство защищает ключ и подтверждает конкретные данные, однако отправку в сеть обычно выполняет приложение-хост. Можно успешно нажать Confirm на устройстве и затем потерять связь с RPC. Пользователь ошибочно думает, что hardware wallet «отправил деньги», хотя signer лишь создал подпись.
После подписи проверяйте transaction hash в сетевом источнике. Если host показывает ошибку, не импортируйте seed аппаратного устройства в горячее приложение ради повторной попытки. Исправьте соединение или используйте доверенный совместимый клиент, сохраняя модель изолированной подписи.
Nonce too low часто означает, что состояние уже ушло вперёд
EVM RPC возвращает nonce too low, когда отправляемый nonce меньше ожидаемого для текущего состояния узла. Частая причина — транзакция с этим nonce уже подтверждена или заменена. Пользователь может продолжать смотреть старую Pending-карточку и пытаться отправлять её заново, хотя сеть уже использовала последовательный номер.
Проверьте transaction count адреса и найдите транзакцию, которая заняла nonce. Если это ваш replacement, следите за его hash. Если обнаружена неизвестная операция, это уже вопрос безопасности аккаунта. Не увеличивайте nonce вручную, пока не понимаете, какая история привела state к текущему значению.
Nonce too high сигнализирует о разрыве последовательности
Обратная ситуация возникает, когда транзакция использует nonce выше следующего ожидаемого. Она способна находиться в queued-состоянии, ожидая заполнения пропуска. Если приложение потеряло локальную транзакцию с промежуточным nonce, пользователь видит странную вечную очередь у более поздних операций.
Сравните pending transaction count и confirmed count, затем найдите недостающий номер. Восстановление последовательности должно опираться на реальную историю адреса. Не создавайте случайные self-transfers для «проталкивания» без понимания, какой nonce они займут и какие операции уже существуют в mempool.
Insufficient funds — это отказ формирования или приёма, а не Pending
Если у аккаунта не хватает нативной монеты для максимальной требуемой комиссии и отправляемой ценности, узел может отвергнуть транзакцию. Для токенов баланс самого токена не оплачивает gas автоматически. Пользователь видит 1000 USDT и считает кошелёк платёжеспособным, но нативный баланс сети равен нулю, поэтому on-chain действие не может быть опубликовано штатно.
Проверьте именно нативный asset комиссии и расчёт max cost. Не отправляйте seed-фразу сервису, обещающему «разблокировать газ». После пополнения комиссии формируйте новую транзакцию и ещё раз сверяйте параметры, потому что старая rejected-запись могла не существовать в сети.
Preflight failure и on-chain failure — разные точки диагностики
Некоторые клиенты симулируют вызов перед отправкой. Если simulation предсказывает revert, приложение способно остановить транзакцию до broadcast. Это полезно, но не равно фактическому on-chain Failed: блок не создан, nonce не обязательно использован, а комиссия за исполнение не списана. Пользователь должен знать, где именно остановился процесс.
Сохраните текст simulation error и проверьте состояние контракта. Если вы сознательно обходите preflight, понимая причину, транзакция всё равно может закончиться on-chain revert. Для обычного пользователя безопаснее сначала исправить параметры, чем принудительно отправлять объект, который уже прогнозируется как неуспешный.
| Статус | Смысл | Ключевая проверка |
|---|---|---|
| Rejected | Не принят узлом | RPC error и параметры |
| Dropped | Не наблюдается в части mempool | Конфликт и состояние sender |
| Replaced | Есть альтернативная версия | Тот же nonce/inputs |
| Expired | Истёк срок валидности | last valid height/deadline |
| Queued | Ждёт предшественника | nonce/parent dependency |
| Stale UI | Интерфейс отстаёт | Независимый explorer |
| Failed | Включён, но execution error | Receipt/exit code |
Как читать explorer при Pending: поля, которые дают настоящий диагноз
Block или Slot показывает, произошло ли включение
Самый быстрый разделитель между настоящим Pending и устаревшим интерфейсом — наличие номера блока или slot. Если транзакция уже привязана к подтверждённому блоку, она вышла из mempool-стадии. Дальше анализируют execution status и finality. Если block отсутствует, объект может оставаться ожидающим, быть только локально известным или уже исчезнуть из очереди конкретного источника.
Не ограничивайтесь зелёной или жёлтой иконкой. Скопируйте block number, timestamp и hash блока, затем при необходимости откройте сам блок. Это помогает понять, когда сеть фактически обработала операцию. Если приложение пишет Pending спустя минуты после появления блока, проблема почти наверняка находится в синхронизации интерфейса, а не в необходимости нового перевода.
Timestamp помогает отличить старую проблему от текущей нагрузки
Время создания карточки в кошельке и время блока могут различаться. Для Pending важно знать момент первоначального broadcast и сколько условий сети успело измениться с тех пор. Транзакция, отправленная несколько минут назад в период нагрузки, и объект, висящий несколько суток, требуют разной глубины диагностики. Старый Pending повышает вероятность eviction, replacement или того, что интерфейс давно не обновлялся.
Сохраняйте время в UTC или явно указывайте часовой пояс. При разборе с нескольких устройств локальные часы могут создавать ложную последовательность событий. Особенно это полезно, когда пользователь делал Speed Up: старый и новый hash имеют разные моменты отправки, а подтверждиться могла версия, созданная позже.
From подтверждает, какой адрес действительно подписал операцию
В кошельке с несколькими accounts пользователь легко открывает не тот адрес и ищет Pending в чужой истории. Поле From показывает sender на сетевом уровне. Для EVM именно его nonce формирует последовательность; для Bitcoin аналогом служит набор контролируемых inputs, а не единый sender field. Сверка источника должна происходить до любых попыток replacement.
Если From неожиданно другой, остановитесь и восстановите контекст: какой account был активен, какой signer подключён, не переключился ли hardware account или derivation path. Не создавайте «исправляющий» перевод с другого адреса, потому что он не заменит nonce первой транзакции и лишь добавит ещё одну операцию.
To нужно читать вместе с типом адреса и calldata
Поле To не всегда означает конечного получателя денег. В contract call оно может быть адресом router, vault или другого контракта, а реальный destination закодирован в calldata и событиях. Пользователь видит незнакомый To и решает, что перевод ушёл не туда, хотя это нормальный промежуточный контракт. Обратная ситуация тоже возможна: знакомый контракт получает опасный вызов.
Для обычного native transfer To часто достаточно, но для токенов и dApp читайте метод, decoded input и logs. Pending-диагностика не должна превращаться в догадку по одному полю. Если вызов уже confirmed, ожидаемый token outcome проверяется по событиям и balances, а не по названию To в верхней строке.
Value не показывает токены ERC-20 и другие контрактные активы
EVM explorer может показывать Value = 0 ETH, хотя транзакция перемещает крупный токеновый баланс. Токен передаётся через calldata и Transfer event. Новичок видит ноль и считает, что Pending безопасен или «ничего не отправляет». На самом деле контрактный вызов может иметь существенный экономический эффект.
При Pending это важно для решения о replacement или cancel: прежде чем заменять, поймите, что делала исходная операция. Если это approve, swap, stake или token transfer, новый вызов с тем же nonce может изменить бизнес-результат. Декодируйте метод и суммы до подписи альтернативной версии.
Nonce связывает все версии одной EVM-позиции в очереди
Nonce — одно из самых ценных полей при EVM Pending. Он позволяет найти предшественников и replacement независимо от того, какие hash показывает кошелёк. Две альтернативные транзакции с одинаковым sender и nonce претендуют на одну позицию последовательности. Как только одна подтверждена, другая не сможет стать отдельной последующей транзакцией с тем же nonce.
Составьте маленькую таблицу: nonce, hash, fee, destination, status. Такой журнал мгновенно показывает, какая версия исходная, какая Speed Up и какая Cancel. Без него пользователь может смотреть старый hash и не замечать, что сеть уже включила новую версию. Это особенно полезно после нескольких попыток ускорения.
Fee fields нужно сравнивать с параметрами текущего блока
Explorer показывает gas price или EIP-1559 поля, а Bitcoin — fee и virtual size. Сырые числа нужно привести к сопоставимой метрике. В EVM смотрят, покрывает ли max fee актуальный base fee и какую priority fee предлагает транзакция; в Bitcoin считают sat/vB. Абсолютная сумма комиссии без размера или структуры часто вводит в заблуждение.
Снимок текущих условий нужен именно для решения сегодня. То, что fee был «рекомендованным» час назад, не гарантирует конкурентность сейчас. И наоборот, ранее низкая ставка может стать достаточной после разгрузки mempool. Решение wait/replace должно опираться на актуальные блоки, а не на эмоциональную оценку стоимости.
Confirmations отвечают на вопрос глубины после включения
После появления блока Pending обычно сменяется подтверждённым состоянием, но для риск-менеджмента важна глубина. Bitcoin explorer показывает число confirmations; другие сети используют свои уровни finality. Чем больше последующих блоков или сильнее commitment, тем меньше вероятность изменения канонической истории в обычных условиях.
Не путайте «есть одно подтверждение» и «получатель уже считает операцию окончательной». У разных задач разные критерии. Для личного перевода внутри собственного контура можно ждать меньше, для необратимой выдачи ценности — больше. Сам пользователь должен заранее понимать, какой порог означает завершение именно его операции.
Logs и Events показывают, произошло ли ожидаемое контрактное действие
Для подтверждённого EVM-вызова logs дают доказательство событий, которые контракт эмитировал. Если ожидался ERC-20 transfer, ищут Transfer event с нужными from, to и value. Если ожидался approval, смотрят Approval и текущее allowance. Отсутствие ожидаемого события при Success заставляет анализировать фактическую функцию и внутреннюю логику.
Это помогает не путать Pending приложения с завершённым on-chain вызовом. Приложение может ожидать конкретный event и не обновить UI из-за индексатора, хотя сеть уже записала его. Или наоборот, transaction Success не породила бизнес-событие, на которое рассчитывал пользователь. Вторая отправка без чтения logs способна повторить нежелательное действие.
Inputs и родители в Bitcoin объясняют скрытую зависимость
Bitcoin explorer позволяет раскрыть каждый input и увидеть транзакцию, создавшую расходуемый output. Если один из родителей не подтверждён, текущий Pending является частью цепочки. Даже хороший собственный feerate дочерней транзакции нельзя анализировать в отрыве от package economics и политики майнеров. Иногда источник проблемы находится на один или несколько уровней выше.
Составьте дерево зависимостей до первого подтверждённого UTXO. Затем оцените общий fee и возможность RBF/CPFP. Такой подход особенно полезен после консолидации, change output или серии переводов, где кошелёк автоматически использовал неподтверждённую сдачу. Пользователь мог даже не знать, что создал цепочку.
Replacement clues нужно искать не только в старой карточке
Некоторые explorers явно показывают Replaced By, другие — только конфликт или исчезновение hash. Поэтому при подозрении на replacement ищите по sender+nonce или inputs. Для EVM история адреса часто обнаруживает новый hash с тем же nonce; для Bitcoin конфликтующая транзакция расходует те же UTXO. Это более надёжный метод, чем ожидать специальной надписи.
Когда новая версия найдена, сверяйте её payload. Speed Up обычно сохраняет смысл, Cancel — меняет его, а ручной replacement может иметь другие To, Value и Data. Не считайте две операции эквивалентными только из-за одного nonce. Финальный экономический результат определяется содержимым версии, попавшей в блок.
Explorer — наблюдатель, а не владелец ваших средств
Для чтения публичной транзакции не требуется импортировать кошелёк, подключать WalletConnect или вводить recovery phrase. Любой сервис, который просит секрет ради просмотра Pending, выходит за рамки нормальной диагностики. Explorer получает данные от узлов и индексаторов; он не должен подписывать транзакции от имени пользователя.
Используйте read-only режим. Если нужно проверить несколько источников, копируйте только публичный address и TxID. Секреты держите отдельно от журнала операций. Такое разделение одновременно повышает безопасность и делает доказательства удобнее: публичные данные можно передать техническому специалисту без риска предоставить контроль над активами.
Method name не заменяет чтение параметров
Explorer может распознать функцию как transfer, approve, execute, multicall или swap, но одно название метода не раскрывает весь эффект. Вызов multicall способен содержать несколько действий, а proxy-контракт — делегировать исполнение другой implementation. При Pending пользователь должен понимать, что именно он пытается ускорить или заменить, иначе новая версия может закрепить нежелательную операцию быстрее старой.
Откройте decoded input и перечислите критичные поля: destination, amount, spender, deadline, route. Если декодирование отсутствует, не компенсируйте непонимание повышением комиссии. Сначала установите смысл calldata. Это особенно важно для незнакомых dApp и сложных batch-вызовов.
Баланс до и после помогает проверить экономический результат
После подтверждения сравните фактические balances, а не только статус транзакции. Для native transfer это sender и recipient с учётом fee; для токена — token balance и events; для контрактного действия — состояние, которое должно было измениться. Иногда UI продолжает показывать Pending, хотя баланс уже изменён, и пользователь рискует повторить операцию.
Снимок состояния полезно делать по публичным данным: block number, balance, token contract и relevant logs. Такой набор помогает доказать, что сеть завершила действие даже при неисправном приложении. Если баланс не изменился при Success, анализируйте контрактную логику, а не создавайте копию операции вслепую.
Reorg или invalidation — редкий, но реальный источник смены статуса
Ранние уровни подтверждения в некоторых сетях допускают изменение канонического результата. Транзакция, которую источник показывал как раннеподтверждённую, может временно исчезнуть или получить другой контекст после reorganize/invalidation. Для обычного пользователя это редкость, но именно поэтому существуют уровни finality и рекомендации ждать больше одного раннего сигнала для критичных действий.
Если статус неожиданно откатился, не спешите повторять перевод. Проверьте текущую каноническую цепочку, finality и состояние nonce/inputs. Возможно, исходная транзакция снова стала кандидатом на включение или была заменена. Решение принимают по актуальному state, а не по скриншоту предыдущего подтверждения.
Мобильное уведомление не является доказательством сетевого статуса
Push может прийти раньше explorer, позже блока или вообще ошибочно из-за backend-кеша. Надпись «transaction failed» в уведомлении не должна автоматически запускать повторный Send, так же как «sent» не означает подтверждение. Уведомление — навигационный сигнал, а не источник технической истины.
Откройте операцию, скопируйте hash и проверьте сеть независимо. Если push и explorer расходятся, ориентируйтесь на канонический state и receipt. Сохранять скрин уведомления можно как часть истории инцидента, но финальный вывод должен опираться на блокчейн-данные.
Поддержка может помочь интерпретировать интерфейс, но не переписать подтверждённый блок
Если проблема относится к кошельку или RPC, разработчик приложения может объяснить кеш, retry или отображение replacement. Но после подтверждения транзакции никто не может просто «снять Pending» и отменить блокчейн-результат административной кнопкой. Разделяйте помощь с интерфейсом и возможности протокола.
При обращении передавайте публичный TxID, версию приложения, сеть и описание экрана. Не передавайте seed-фразу, private key и коды восстановления. Если собеседник требует их для «синхронизации», прекращайте контакт. Публичных данных достаточно, чтобы инженер проверить сетевой статус и backend.
| Поле explorer | Что отвечает | Типичная ошибка |
|---|---|---|
| Block/slot | Есть ли включение | Верить старому Pending в UI |
| Timestamp | Когда сеть увидела результат | Путать локальные часовые пояса |
| From/Inputs | Источник операции | Искать историю не того account |
| To + Data | Что вызывается | Считать контракт конечным получателем |
| Nonce | Порядок/замены EVM | Игнорировать ранний nonce |
| Fee/feerate | Экономика включения | Сравнивать только фиатную сумму |
| Logs | Контрактный результат | Считать Success нужным эффектом |
| Confirmations/finality | Сила завершения | Считать первый статус универсальным финалом |
Практические сценарии и FAQ о Pending-транзакциях
Сценарий: Ethereum-перевод висит, а следующие операции тоже Pending
Адрес отправил три транзакции с nonce 120, 121 и 122. Первая имеет слишком низкие fee, две следующие — выше. Explorer показывает все три, но blockNumber отсутствует. Правильный диагноз — nonce queue: более поздние операции не могут подтвердиться раньше 120. Пользователь анализирует именно 120 и при необходимости создаёт replacement с тем же nonce.
После включения замены nonce 120 сеть сможет обработать 121 и 122. Отправка четвёртой транзакции с nonce 123 не помогает. В журнале сохраняют старый и новый hash, потому что explorer может по-разному отображать replacement.
Сценарий: Bitcoin виден в одном explorer, но исчез в другом
Транзакция долго ждала с низким sat/vB. Один источник ещё показывает её в mempool, другой пишет not found. Это не доказательство ни подтверждения, ни окончательной отмены. Пользователь проверяет дополнительные узлы, inputs и наличие conflicting/replacement транзакции. Если replacement существует, следит за ним; если нет — оценивает rebroadcast или штатный fee bump.
Нельзя выводить судьбу операции по одному сайту. Local mempool различаются. Ключевой факт — был ли какой-либо вариант этих inputs включён в блок и какое состояние видит сеть сейчас.
Сценарий: Solana signature долго не подтверждается и blockhash истёк
Клиент сохранил lastValidBlockHeight, а текущая высота уже выше. Signature нигде не подтверждена. В отличие от обычного длительного Pending, старая транзакция больше не имеет действующего recent blockhash. Пользователь формирует новую транзакцию с актуальными параметрами и снова сверяет destination и amount перед подписью.
Старую signature сохраняют как expired, чтобы не спутать её с успешной. Если позже обнаружится, что первая всё-таки была включена до истечения, повторная отправка станет отдельной операцией, поэтому проверка отсутствия inclusion обязательна до пересоздания.
Сценарий: TON показывает первую транзакцию, но конечное действие ещё не видно
Пользователь видит transaction на кошельке-источнике и считает, что всё завершено. Однако действие включает внутренние сообщения к другому контракту. Trace ещё имеет pending/confirmed этапы, а конечный account пока не обработал сообщение. Здесь повторный внешний запрос способен запустить второй trace.
Правильная тактика — раскрыть trace и дождаться конечного состояния. Если появляется bounce или aborted-фаза, изучается конкретная ошибка. Асинхронность не означает, что сеть «зависла»; это нормальная модель исполнения TON.
Сценарий: кошелёк пишет Pending, а explorer уже показывает Success
Это типичный лаг индексации. Сетевые данные показывают блок, правильного получателя и успешный статус, но приложение не обновило карточку. Пользователь не должен повторять операцию. Он проверяет фактический баланс и обновляет интерфейс. При необходимости переключает RPC или ждёт синхронизацию истории.
Если токен не отображается, проверяют его contract и сеть, а не делают новый перевод. Источник технической истины — состояние блокчейна, а не цвет иконки в локальном приложении.
Сценарий: TxID вообще нигде не найден
Кошелёк мог показать локальный hash после подписи, но broadcast не состоялся, либо пользователь ищет не в той сети. Сначала проверяют chain, sender и nonce. Если nonce не использован, hash неизвестен независимым узлам и операция не появилась спустя разумный интервал, проблема находится до inclusion.
Не спешите заново подписывать тот же платеж, пока не исключён другой hash с тем же nonce или бизнес-смыслом. Сначала восстановите полную картину истории адреса. Это особенно важно после нажатия Retry/Speed Up, которые могли создать альтернативную транзакцию.
Что означает Pending простыми словами?
Pending означает, что окончательный результат ещё не достигнут. Нужно определить, существует ли транзакция в сети, включена ли она в блок, не истекла ли и не была ли заменена. Само слово не раскрывает причину.
Можно ли повторно отправить перевод, если он долго Pending?
Не сразу. Сначала найдите TxID, проверьте сеть, nonce или inputs и убедитесь, что первая операция не может подтвердиться позже. Иначе можно создать второй перевод или конфликтующую версию.
Сколько может висеть Pending-транзакция?
Универсального срока нет. Bitcoin и EVM зависят от комиссии, mempool и политики узлов; Solana имеет ограниченное окно recent blockhash; TON использует собственную асинхронную модель и finality. Оценивайте конкретную сеть.
Если TxID есть, деньги уже отправлены?
TxID показывает идентификатор объекта, но не гарантирует включение и успешное исполнение. Проверьте block/slot, status, адрес получателя и подтверждения.
Если комиссия низкая, транзакция обязательно пропадёт?
Нет. Она может дождаться снижения нагрузки и войти в блок, может быть вытеснена из части mempool или заменена. Вероятность зависит от сети и параметров.
Можно ли отменить Pending Ethereum-транзакцию?
До включения можно попытаться заменить её транзакцией с тем же nonce и более подходящей комиссией. Это replacement, а не удаление прошлого объекта. После подтверждения обычная cancel-операция не откатывает результат.
Что делать, если Bitcoin Pending?
Проверьте TxID, feerate в sat/vB, неподтверждённых родителей и возможность RBF/CPFP. Не передавайте секреты сторонним ускорителям.
Что делать, если Solana-транзакция истекла?
Убедитесь, что signature не была включена до истечения last valid block height. Затем сформируйте новую транзакцию с актуальным blockhash и новой подписью.
Почему кошелёк показывает Pending после подтверждения?
Чаще всего это задержка RPC, индексатора или локального кеша. Если независимый explorer показывает корректное подтверждение, повторная отправка не нужна.
Какие данные сохранить при долгом Pending?
Сеть, адрес отправителя и получателя, сумму, token contract при необходимости, TxID/signature, nonce или inputs, параметры комиссии, время и все replacement hashes. Секретные ключи в этот архив не включают.
| Вопрос | Короткая проверка |
|---|---|
| Что означает Pending простыми словами? | Pending означает, что окончательный результат ещё не достигнут. Нужно определить, существует ли транзакция в сети, включена ли она в блок, не истекла ли и не была ли заменена. Само слово не раскрывает причину. |
| Можно ли повторно отправить перевод, если он долго Pending? | Не сразу. Сначала найдите TxID, проверьте сеть, nonce или inputs и убедитесь, что первая операция не может подтвердиться позже. Иначе можно создать второй перевод или конфликтующую версию. |
| Сколько может висеть Pending-транзакция? | Универсального срока нет. Bitcoin и EVM зависят от комиссии, mempool и политики узлов; Solana имеет ограниченное окно recent blockhash; TON использует собственную асинхронную модель и finality. Оценивайте конкретную сеть. |
| Если TxID есть, деньги уже отправлены? | TxID показывает идентификатор объекта, но не гарантирует включение и успешное исполнение. Проверьте block/slot, status, адрес получателя и подтверждения. |
| Если комиссия низкая, транзакция обязательно пропадёт? | Нет. Она может дождаться снижения нагрузки и войти в блок, может быть вытеснена из части mempool или заменена. Вероятность зависит от сети и параметров. |
| Можно ли отменить Pending Ethereum-транзакцию? | До включения можно попытаться заменить её транзакцией с тем же nonce и более подходящей комиссией. Это replacement, а не удаление прошлого объекта. После подтверждения обычная cancel-операция не откатывает результат. |
Перед любой повторной отправкой полезно выполнить финальную проверку из четырёх пунктов: старая операция точно не подтверждена, её сетевой идентификатор и возможные replacement-версии найдены, причина Pending понятна, а новая транзакция отличается только теми параметрами, которые действительно нужно изменить. Такой контроль занимает меньше времени, чем последующее расследование двойного перевода. Если хотя бы один пункт остаётся неопределённым, безопаснее продолжить диагностику публичных данных и не создавать новую подпись. В спорных случаях сохраните текущие TxID, nonce или inputs и снимок состояния перед следующим действием — это позволит доказуемо восстановить последовательность событий.