Що таке подвійні витрати?

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

Коли мова заходить про цифрову готівку, забезпечення того, що конкретні одиниці не можна дублювати, є надзвичайно важливим. Вся система була б підірвана, якби Аліса могла отримати 10 одиниць, скопіювати та вставити їх 10 разів і виявити, що вона володіє 100 одиницями. Аналогічно, така схема не може працювати, якщо вона може надіслати однакові 10 одиниць Бобу та Керол одночасно. Отже, щоб цифрові гроші функціонували, повинні існувати механізми запобігання такій поведінці.


Як запобігти подвійним витратам?

Централізований підхід

Централізований маршрут значно легше реалізувати, ніж децентралізовані альтернативи. Зазвичай це включає одного наглядача, який керує системою та контролює випуск і розподіл одиниць. Гарним прикладом централізованого вирішення проблеми подвійних витрат є eCash Девіда Чаума.

Щоб видавати користувачам цифрові активи, що імітують готівку (з можливістю анонімного та однорангового обміну), банк може використовувати сліпі підписи, як детально описав криптограф Девід Чаум у своїй статті 1982 року «Сліпі підписи для невідстежуваних платежів».

У такому контексті, якщо користувач (назвемо його Ден) бажає отримати 100 доларів США цифровою готівкою, він повинен спочатку повідомити про це банк. За умови, що на його рахунку є залишок, він згенерує випадкове число (або багато, для менших номіналів). Припустімо, він створює п’ять чисел, кожному з яких має бути присвоєно значення 20 доларів. Щоб запобігти відстеженню банком конкретних одиниць, Ден маскує випадкові числа, додаючи коефіцієнт засліплення до кожного з них.

Потім він передає ці дані банку, який списує з його рахунку 100 доларів і підписує повідомлення, які підтверджують, що кожну з п’яти частин інформації можна обміняти на 20 доларів. Ден тепер може витрачати кошти, видані банком. Він йде до ресторану Ерін і купує їжу, яка коштує йому 40 доларів.

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

Використані банкноти тепер практично спалені, і їх потрібно випустити більше, якщо Ерін хоче витратити свій новий баланс таким же чином.

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


Децентралізований підхід

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

Найбільшим нововведенням, представленим у документі про біткойн, було вирішення проблеми подвійних витрат. Хоча це не згадується як таке, Сатоші запропонував структуру даних, широко відому як блокчейн.

Блокчейн – це просто база даних з деякими унікальними властивостями. Учасники мережі (іменовані вузлами) запускають спеціалізоване програмне забезпечення, яке дозволяє їм синхронізувати свою копію бази даних зі своїми однолітками. Результатом є те, що вся мережа може перевіряти історію транзакцій, починаючи з блоку генезису. Завдяки тому, що блокчейн доступний для загального перегляду, можна легко виявити та запобігти шахрайству, наприклад транзакціям, які намагаються подвоїти витрати.

Коли користувач транслює транзакцію, вона не відразу додається до блокчейну – її потрібно спочатку включити в блок за допомогою майнінгу. Таким чином, одержувач повинен вважати транзакцію дійсною лише після того, як її блок додано до ланцюжка. В іншому випадку вони ризикують втратити кошти, оскільки відправник може витратити ті самі монети в іншому місці.

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

Давайте повернемося до ресторанного сценарію. Ден повертається до ресторану й цього разу помічає на вітрині наклейку з біткойнами. Йому сподобалася їжа, яку він їв минулого разу, тому замовляє її знову. Це коштує йому 0,005 BTC.

Ерін показує йому публічну адресу, на яку він має надіслати кошти. Ден транслює трансакцію, яка, по суті, є підписаним повідомленням про те, що 0,005 BTC, які були у Дена, тепер у Ерін. Не вдаючись у подробиці, будь-хто, кому надано підписану трансакцію Дена, може підтвердити, що він справді володів монетами, а отже, мав повноваження їх надсилати.

Однак, як згадувалося, транзакція дійсна, лише якщо включена в блок, який підтверджується. Прийняття непідтверджених транзакцій схоже на прийняття 40 доларів електронної готівки з попереднього прикладу без негайного переведення їх у готівку в банку – це дозволяє відправнику витратити їх деінде. Тому радимо, щоб Ерін зачекала принаймні 6 підтверджень блокування (приблизно одну годину), перш ніж прийняти платіж Дена.


Подвійні витрати в біткойнах

Біткойн ретельно розроблений для запобігання атакам подвійних витрат, принаймні, коли протокол використовується належним чином. Тобто, якщо люди чекають підтвердження транзакцій у блоці, для відправника немає простого способу скасувати це. Щоб зробити це, їм потрібно буде «перевернути» блокчейн, що вимагає нереалістичної кількості хеш-потужності.

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

Існує три популярних методи подвійних витрат:

  • Атаки 51 %: коли одній особі чи організації вдається контролювати понад 50 % швидкості хешування, що дозволяє їм виключити або змінити порядок транзакцій. Така атака на біткойн малоймовірна, але траплялася в інших мережах.

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

  • Атаки Finney: зловмисник попередньо збирає одну транзакцію в блок, не передаючи її в мережу негайно. Замість цього він витрачає ті самі монети на іншу транзакцію і лише потім транслює свій раніше видобутий блок, що може зробити платіж недійсним. Атаки Finney вимагають певної послідовності подій, а також залежать від прийняття одержувачем непідтверджених транзакцій.

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


Закриття думок

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

Однак, на щастя, використання сліпих підписів запропонувало цікаве рішення для централізованих фінансових схем. Пізніше створення механізмів Proof of Work і технології блокчейн породило біткойн як потужну форму децентралізованих грошей, що, у свою чергу, надихнуло тисячі інших криптовалютних проектів.