Що таке подвійні витрати?
Подвійні витрати – це потенційна проблема у системі цифрових грошей, коли одні й ті самі кошти витрачаються двома одержувачами одночасно. Без адекватних контрзаходів, протокол, який не зможе вирішити цю проблему, буде вразливий до подібного роду дій, у той час як користувачі не зможуть перевірити факт стороннього витрачання їхніх коштів.
Коли мова йде про цифрові гроші, першорядне значення має недопущення дублювання певних одиниць. Вся система зруйнувалася б, якби Аліса могла отримати 10 одиниць, а потім скопіювати і вставити їх 10 разів, щоб отримати 100 одиниць. Така сама схема не може працювати, якщо вона зможе відправити ті самі 10 одиниць Бобу і Керол одночасно. Отже, щоб цифрові гроші функціонували, мають існувати механізми, які запобігають такій поведінці.
Як можна запобігти подвійним витратам?
Централізований підхід
Централізований підхід реалізувати значно простіше, ніж децентралізовані альтернативи. Зазвичай це включає в себе одного наглядача, який управляє системою і контролює випуск та розповсюдження одиниць. Хорошим прикладом централізованого вирішення проблеми подвійних витрат є система eCash від David Chaum.
В такому випадку, якщо користувач (назвемо його Ден) бажає отримати 100$ у цифровій формі, він повинен спочатку повідомити про це банк. Якщо в нього є достатній балансу на рахунку він згенерує одне випадкове число або декілька чисел для менших номіналів. Припустимо, він створює п'ять чисел, кожному з яких буде присвоєно значення 20$. Щоб запобігти відстеження банком грошових одиниць, Ден приховує випадкові числа, додаючи фактор "сліпоти" до кожного з них.
Потім він передає дані в банк, який вносить дебет на його рахунок у розмірі 100$, після чого підписує повідомлення, що підтверджують, що кожна з п'яти частин інформації підлягає обміну на 20$. Тепер Ден може витрачати гроші, випущені банком. Він іде до ресторану Еріна та купує їжу, яка коштує йому 40$.
Ден може видалити фактор маскування, щоб виявити випадкове число, пов'язане з кожною "банкнотою" цифрових грошей, яке є унікальним ідентифікатором для кожної одиниці (подібно до серійного номера). Він показує два чеки Еріну, який тепер повинен негайно активувати їх у банку, щоб Ден не зміг витрати одні і ті ж гроші в іншого продавця. Банк перевірить, чи підписи дійсні, і якщо вся інформація правильна, він зарахує на рахунок Еріну 40$.
Після активації використані чеки спалюються, і якщо Ерін захоче витратити свій новий баланс ще раз, йому буде необхідно отримати нові чеки аналогічним чином.
"eCash" може бути корисним інструментом для приватних переказів. Але йому не вистачає стійкості, бо банк – це центральна точка відмови. Виданий чек сам по собі нічого не вартий, оскільки його вартість визначається виключно готовністю банку обміняти чек на долари. Клієнти перебувають під владою банку та мають покладатися на його репутацію, щоб гроші функціонували. Це якраз та проблема, яку криптовалюта прагне виправити.
Децентралізований підхід
Забезпечення того, щоб кошти не могли бути витрачені двічі в екосистемі без нагляду, є складнішим завданням. Впливові учасники повинні будуть узгоджувати певні правила, щоб запобігати шахрайству та стимулювати всіх користувачів діяти чесно.
Повернемося до сценарію з рестораном. Ден повертається до ресторану і цього разу помічає наклейку "тут приймається Bitcoin". Йому сподобалася їжа, яку він їв минулого разу, тому замовляє її знову. Це коштує йому 0,005 BTC.
Однак, як уже згадувалося, транзакція дійсна лише в тому випадку, якщо вона включена до блоку, який було підтверджено. Прийняття непідтверджених транзакцій багато в чому схоже на прийняття 40$ в eCash з попереднього прикладу, без негайного переведення чека у готівку у банку, що дозволяє відправнику витратити їх в іншому місці. Тому рекомендується, щоб Ерін почекав не менше 6 підтверджень блоку (приблизно одну годину), перш ніж прийняти платіж Дена.
Подвійні витрати у Bitcoin
Bitcoin ретельно розроблений для запобігання атакам з подвійною витратою, принаймні, коли протокол використовується належним чином. Тобто, якщо хтось чекає на підтвердження транзакцій у блоці, відправнику буде непросто скасувати їх. Для цього їм потрібно "перевернути" роботу блокчейну, що потребує нереалістичної потужності хешу.
Однак існує декілька атак з подвійною витратою, націлених на сторони, що приймають непідтверджені транзакції. Наприклад, для покупок на невелику суму продавець може не захотіти чекати, доки транзакції будуть включені до блоку. Популярний ресторан швидкого харчування, ймовірно, не може дозволити собі чекати, поки мережа обробляє кожну покупку. Таким чином, якщо бізнес допускає миттєві платежі, вони відкриваються для подвійних витрат. Хтось може замовити бургер, заплатити за нього, а потім одразу ж відправити ті самі гроші на свою адресу. За більш високої комісії ця нова транзакція, швидше за все, буде підтверджена першою і, отже, анулює попередню.
Є три популярні методи для реалізації подвійних витрат:
- Атаки 51%: коли окремому об'єкту чи організації вдається контролювати понад 50% хешрейту, що дозволяє виключати або змінювати порядок транзакцій. Така атака на Bitcoin є малоймовірною, але відбувалася в інших мережах.
- Атаки типу "гонки": коли дві конфліктуючі транзакції транслюються одночасно з використанням тих самих коштів, але підтверджується лише одна з них. Мета зловмисника полягає в тому, щоб анулювати валідацію, підтверджуючи лише потрібну йому транзакцію (наприклад, надсилаючи ті самі кошти на свою адресу). Умовою для такої атаки є дозвіл продавця оплачувати товар непідтвердженими транзакціями.
- Атаки Finney – коли зловмисник попередньо починає майнінг блоку зі своєю транзакцією, не транслюючи його відразу в мережу. Натомість він повторно витрачає монети, але вже в рамках іншої транзакції, і лише потім транслює попередній блок, скасовуючи переказ продавцю. Атаки Finney вимагають певної послідовності подій, а також залежать від готовності одержувача приймати непідтверджені транзакції.
Як бачимо, продавець, який очікує підтвердження блоку, значно знижує ризики стати жертвою подвійних витрат.
Заключні думки
Подвійні витрати дозволяють користувачеві використовувати систему електронних грошей для отримання фінансової вигоди, використовуючи одні й ті самі кошти більше одного разу. Традиційно, відсутність адекватних рішень проблеми перешкоджала прогресу у цій галузі.