Перейти к основному содержимому

Диагностировать застрявшую транзакцию

Незавершённый перевод оставляет средства либо зарезервированными переводом, который можно отменить, либо незрелыми, либо ожидающими подтверждения. Незавершённый перевод не расходует никакой ценности.

Сначала классифицируйте проблему

epic-wallet info

Сравните цифры. Разрыв между общим балансом и доступным к трате указывает, какой случай применим.

СимптомПричинаПерейти к
Доступно к трате меньше общего, после отправкиВыходы зарезервированы активным переводомCase 1
Доступно к трате меньше общего, после майнингаЗрелость CoinbaseCase 2
Отправка зависает на несколько минутОжидание подтверждения в мемпулеCase 3
Отправили, но получатель ничего не получилОшибка доставкиCase 4
Данные расходятся с цепочкойЛокальная база данных устарелаCase 5
Получили, но подтверждение так и не пришлоОжидание отправителяCase 6

Случай 1: выходы зарезервированы незавершённым переводом

epic-wallet txs

Ищите записи типа Sent (Created) с Confirmed? равным false, которые Owner API возвращает как tx_type: "TxSentCreated". Каждая такая запись удерживает входы (inputs). Недоступная сумма больше отправленной, потому что выход (output) сдачи тоже остаётся неподтверждённым до момента включения транзакции в блок.

Определите, ответит ли контрагент. Если он временно недоступен и ожидается его возвращение, правильным решением будет ожидание. Если перевод не будет завершён, отмените его:

epic-wallet cancel -i <id>

или по id слейта (slate):

epic-wallet cancel -t <slate_id>

Отмена возвращает зарезервированные входы в статус доступных к трате и удаляет неподтверждённый выход сдачи. Баланс обновляется немедленно.

У cancel есть предусловия, и транзакция, уже опубликованная в мемпул, их не выполняет. См. отмена имеет предусловия.

После отмены начните новую отправку, а не используйте старый слейт повторно.

Случай 2: зрелость coinbase

Добытые награды нельзя потратить до достижения глубины зрелости для сети, которая составляет 1,440 блоков на mainnet. См. тайминг эмиссии.

Сумма отображается как недоступная к трате до достижения этой глубины.

Случай 3: отправка зависает

После публикации транзакции кошелёк опрашивает мемпул узла раз в секунду в течение до four минут, чтобы подтвердить получение, не выводя ничего в этот период. Это 240 попыток с интервалом в одну секунду: в send (controller/src/command.rs:609), в finalize (controller/src/command.rs:779) и в собственном пути финализации слушателя epicbox (impls/src/adapters/epicbox.rs:582). Вызовы Owner API, стоящие за этими командами, блокируются на тот же период, поэтому бэкенд не должен выполнять их в потоке обработки запроса.

Дождитесь завершения. Если оно заканчивается Transaction with slate_id ... not found in mempool after waiting, публикация не достигла узла. Убедитесь, что узел запущен и синхронизирован, затем см. Случай 5.

Случай 4: получатель не получил перевод

Перевод завершился ошибкой при доставке. Что проверять — зависит от транспорта.

Через epicbox. Релей ставит слейт в очередь для получателя, который не подключён. Действуют два ограничения, и более короткое из них — не срок хранения. Сохранённый слейт удаляется через 7 дней независимо от состояния. Отдельно: получатель, который подключается многократно, не подтверждая предложенный ему слейт, получает полную очистку очереди ожидания после девяти попыток доставки, что при значении по умолчанию 60 секунд для интервала запроса составляет примерно девять минут. Отправитель не получает уведомления ни в том ни в другом случае, поэтому принятую отправку следует считать принятой к доставке, а не доставленной. См. доставка и её ограничения.

Попросите получателя запустить epic-wallet listen -m epicbox и оставить его работать. Если слейт ещё в очереди, он будет доставлен. Если он был удалён — отмените и отправьте снова.

Через HTTP. Очереди нет. Слушатель должен был быть доступен в момент отправки. Отмените и повторите попытку, когда он будет запущен.

В любом случае проверьте версии кошельков. Кошелёк версии 3.x и кошелёк версии 4.x могут расходиться в формате слейта.

Случай 5: локальная база данных устарела

Если данные кошелька расходятся с данными цепочки, пересоберите его представление:

epic-wallet scan

Это пересканирует цепочку по вашим ключам и восстанавливает набор выходов. Записи не удаляются.

Заблокированные выходы при этом не будут сброшены, поскольку блокировка — это локальная запись, о которой цепочка ничего не знает. Для этого используйте cancel.

Если пересканирование, по всей видимости, ничего не делает, сначала проверьте высоту блока узла. Когда узел сообщает высоту блока ниже последней подтверждённой высоты кошелька, обновление пропускается — именно это вы наблюдаете при работе с узлом, который ещё синхронизируется или был сброшен:

curl -s -u epic:$(cat ~/.epic/main/.api_secret) -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"get_status","params":[],"id":1}' \
http://127.0.0.1:3413/v2/owner

Учётные данные описаны в разделе учётные данные, которые кошелёк предъявляет узлу.

Случай 6: получено, но не подтверждено

Как получатель вы завершили свой этап и вернули слейт. Финализация и публикация — шаг отправителя, и вы не можете выполнить его за него, поскольку не располагаете его ключами.

epic-wallet txs

Запись Received со значением Confirmed? false означает именно это — tx_type: "TxReceived" через API. Свяжитесь с отправителем.

TxReceived сохраняет свой тип после подтверждения, поэтому единственное поле, которое даёт нужную информацию, — confirmed. fee пусто для полученных переводов, поскольку получатель его никогда не задаёт.

Чтобы отказаться от транзакции, cancel работает и для TxReceived, освобождая только то, что зарезервировала ваша сторона.

Если ни один случай не подходит

Соберите epic-wallet info, epic-wallet txs и get_status узла из Case 5. Также укажите версии кошелька и узла, используемый транспорт и наличие запущенного слушателя у контрагента.

Далее