Непідтверджена транзакція, або Повертаємо криптовалюту з небуття

Непідтверджена транзакція, або Повертаємо криптовалюту з небуття

Грабовий
хв

Волею доль довелося мати справу з криптовалютами. Не те що щільно працюю з ними, але іноді то відправлю монетки, то отримаю. Скажімо, потроху промацую нову сферу зсередини.

І ось одного разу лихо сталося. Відіслав я криптомонетки, а до отримувача вони не дійшли. Власне, пост про те, як кошти поверталися. Ну і роздуми і поради щодо ситуації на десерт. Відразу зазначу, що сказане нижче застосовується не до якоїсь конкретної валюти, а до більшості форків (якщо не до всіх).

Почну з того, що пост місцями пронизаний здогадами щодо того, що відбувається. Десь я можу помилятися. Об'єктивні поправки та доповнення лише вітаються.

Трохи про термінологію.

  • Гаманцем називатиму файл wallet.dat.
  • Публічний ключ (адреса, на яку перераховуються кошти, наприклад) часом теж зручніше назвати гаманцем, але, щоб уникнути плутанини, нехай він буде просто номером рахунку.
  • Комісія - Transaction Fee. Називати цю штуку комісією, я вважаю, не зовсім правильно, але це найзвичніший і не ріжучий слух варіант, тому нехай буде комісією.
  • Розмір транзакції — розмір блоку даних, у якому міститься інформація про транзакції.

До всієї цієї криптовалютної кухні я спочатку підійшов як типовий користувач - не особливо вникаючи в систему. Встановив, запустив, працює — і добре. Іноді при спробі надіслати кудись кошти клієнт видавав повідомлення на кшталт « Розмір транзакції занадто великий, не можна просто взяти і надіслати її. Але ви можете додати комісію у розмірі N, і тоді все буде добре » – я погоджувався з додаванням комісії, і все справді було добре.

Здавалося б, якщо мене просять додатково заплатити, коли це потрібно, значить я і платитиму, коли попросять (якщо комісія влаштовуватиме). Це було головною помилкою.

Роблю черговий переказ на суму значно більшу, ніж зазвичай. Кошти з рахунку йдуть, пропозиції заплатити комісію не було... Нічого. До одержувача кошти не доходять, статус транзакції "0/Не підтверджено". І таку картину я спостерігав більше тижня, принагідно перегугуючи та перечитуючи інтернети у пошуках інформації щодо вирішення подібної проблеми. Причому шукав і для конкретної криптовалюти, і в цілому для всіх проблем купа, рішення немає.

А що ж це за комісія? Ідея в тому, що транзакції можуть відбуватися без комісії, але лише у разі дотримання деяких умов:

  • Розмір транзакції повинен бути не більшим за певну величину.
  • Сума, що перекладається, повинна бути більшою за якийсь поріг.
  • Транзакція повинна мати достатній пріоритет.

Якщо перші два пункти більш-менш зрозумілі (конкретні величини наводити не став, гадаю, вони можуть змінюватись від форка до форка), то в третьому вся загвоздка. Грубо кажучи, транзакції під час створення потрапляють у чергу, відсортовані за пріоритетом. При генерації чергового блоку до нього включаються транзакції з комісією (яка йде в нагороду тому, хто знайшов блок), а також транзакції без комісії з найвищим пріоритетом.

Сам пріоритет прямо залежить від обсягу коштів, що переказуються, і від числа їх підтверджень (що довше саме ці гроші лежали у вас на рахунку, тим більше повинен бути пріоритет, по суті) і назад залежить від розміру транзакції. Таким чином, при невдалому збігу обставин транзакція без комісії може опинитися в непідтвердженому стані, з яким я і зіткнувся.

Пошуки рішення показали, що це порівняно часта для криптовалют проблема. На жаль, всі поради зводилися до нижчепереліченого і часто не допомагали:

  • Зачекайте добу-дві, вашу транзакцію включать до чергового блоку.
  • Зачекайте добу-дві, програмі-клієнту набридне чекати, і вона сама скасує транзакцію.
  • Завантажте знову весь ланцюжок блоків.
  • Запустіть клієнт з якимсь чарівним ключем (-rescan/-reindex/-salvagewallet).

Чекав я більше тижня. У жодний блок транзакцію не включили. Навіть після повторних відправлень через sendrawtransaction. Блокчейн говорив, що про ту транзакцію нічого не знає, і на рахунку лежать ті самі гроші, нікуди вони не пішли. І тільки клієнт стояв на своєму: «Я транзакцію відправив далі як хочеш. Вже витраченими грошима розпоряджатися не дозволю».

Отже, у чому суть проблеми? Транзакція не потрапила до блоку і вже не потрапить. У гаманці зберігається інформація про те, що транзакція взагалі була, тому кошти, які мали з нею вирушити, недоступні для використання. Можливо, ще через якийсь час транзакція буде скасована, з цього приводу у мене кілька припущень:

  • Залежить від валюти, десь швидко скасовується, десь треба чекати довго.
  • Баг конкретного клиента.
  • Інформація про скасування неправильна.

У будь-якому випадку тиждень — це досить великий термін. Якщо за цей час не пройшло саме, то є підстави вважати, що й не минеться.

Як нормальна людина, після того, як усе вже зламалося, я нарешті пішов читати мануали. Спроба повторити транзакцію із включенням до неї комісії зазнала фіаско. Зате нескінченні стрибки за посиланнями між форумами (у видачі гугла нічого не знайшлося) довели мене до якогось посту, де і знайшлася слушна підказка. На жаль, тепер знайти цю посаду не вдається, навіть не знаю, що був за форум. Гадаю, якийсь околобиткойновий.

Рішення описуватиму на прикладі клієнта, найбільш поширеного для форків, відомого як Satoshi Client. Наскільки розумію, воно можна застосувати і до інших клієнтів, але, можливо, зі своїми нюансами.

Незважаючи на простоту та очевидність рішення, до нього мало хто приходить, судячи з багатосторінкових гілок форумів. Кошти на рахунку блокуються гаманцем, і все, що потрібно, це отримати доступ до рахунку поза гаманцем.

Отже, якщо транзакція зависла і не має підтверджень:

  1. Виявіть терпіння. Не піднімайте одразу паніку. Зачекайте кілька днів, раптом і справді саме пройде.
  2. Перевірте, чи транзакція зависла. Зайдіть в Block Explorer (зазвичай гуглиться за запитом «blockchain %назвакриптовалюти%») і перевірте, що про транзакцію, що зависла, там нічого не знають, а на рахунку гроші насправді є.
  3. Перейдіть до консолі налагодження (Допомога - Вікно налагодження - Консоль)
  4. Якщо гаманець зашифрований (він же зашифрований?), Для початку необхідно отримати доступ, використовуючи команду walletpassphrase <passphrase> .
  5. Тепер потрібно одержати приватний ключ від потрібного рахунку. dumpprivkey <address> . Замість <address> слід підставити публічний номер рахунку, у якому лежать заблоковані кошти. У відповідь отримайте приватний ключ цього рахунку. Його потрібно кудись скопіювати, він ще знадобиться. Якщо кошти для транзакції бралися з кількох рахунків, то й імпортувати потрібно їх усі. І так, ніколи не зберігайте приватні ключі у доступному для будь-кого місці. Знання ключа дає повний доступ до відповідного рахунку.
    Зверніть також увагу на те, що на кожну команду в консолі налагодження приходить відповідь. Він може бути порожнім, але є завжди. Пізніше буде зрозуміло, до чого це я.
  6. Закрийте клієнта і видаліть гаманець. Розташування гаманця (wallet.dat) залежить від конкретного клієнта та ОС. Звичайно, зовсім видаляти його не варто, краще перейменувати або перемістити на надійне місце.
  7. Запустіть клієнт знову. Створиться новий гаманець. У нього необхідно імпортувати отриманий ключ (ключі). Йдемо в консоль налагодження і пишемо importprivkey <privkey> . Імпорт може здійснюватись досить довго. Дозвольте йому завершитись — дочекайтеся отримання відповіді на команду.
  8. У новому гаманці має з'явитися рахунок із реальним його станом. Для надійності можна перезапустити клієнт із ключем -rescan, але, вважаю, це вже зайве. Раніше заблоковані кошти знову доступні для відправки, надсилайте їх заново, цього разу не забудьте включити комісію. є важливі доповнення з цього пункту в upd3 )
  9. Якщо на старому гаманці залишилися інші важливі рахунки, що використовуються, можна знову повернутися до нього.

Таким нехитрим чином вдалося повернути криптомонетки. Хоча я вже й почав думати, що вони зовсім втрачені. Загалом не сподівайтеся на диво, перед використанням нового клієнта переконайтеся, що комісія завжди включена. Рекомендований розмір комісії, гадаю, краще шукати на ресурсах, присвячених використаній криптовалюті.

Upd: Необхідність описаної операції залежить від клієнта, що використовується (а оскільки у багатьох криптовалют по одному клієнту, то і від використовуваної валюти). Схоже, у деяких випадках інформація про транзакцію записується не у файл гаманця, а лише в локальний ланцюжок блоків. При такому розкладі може допомогти видалити наявний ланцюжок або запустити клієнта з ключами.

Upd2: Значно спростити описаний процес перенесення рахунків новий гаманець може ключ -salwagewallet, вже згаданий раніше. При запуску клієнта з цим ключем створюється новий wallet.dat, в який імпортуються всі рахунки зі старого, а історія транзакцій до нього береться з ланцюжка блоків (за спасибі grich ). На жаль, запуск із цим ключем реалізований не у всіх клієнтах.

Upd3: Якщо після імпорту перерахувати не всю суму, що є на рахунку, то частина коштів (здача від виходів, що використовуються) буде перерахована на інший рахунок нового гаманця. Враховуйте це, якщо плануєте повернутися до старого гаманця:

  • Імпортувавши рахунок у новий гаманець, переведіть усі кошти з нього на інший власний рахунок, поверніться до старого гаманця і після цього вже розпоряджайте повернутими коштами.
  • Після транзакції з нового гаманця визначте, на який рахунок впала здача, і імпортуйте цей рахунок у старий гаманець.
Просмотры:

Коментарі

Популярні публікації