Що таке подвійне витрачання?
Подвійне витрачання – це потенційна проблема цифрової грошової системи, коли одні й самі кошти можуть витрачатися двічі за один часовий інтервал. Без адекватних контрзаходів протокол, який не вирішує цю проблему, вразливий до подібних дій - користувачі не можуть просто не можуть бути впевнені, що їх кошти не витрачалися десь ще.
У криптопрості обмеження дублювання певних одиниць має першорядне значення. Якби Аліса могла отримати 10 одиниць, а потім скопіювати і вставити їх 10 разів, щоб отримати 100 одиниць, стався б крах усієї системи. Система також не працюватиме, якщо ті ж 10 одиниць будуть відправлені одночасно Борисові та Каті. Таким чином, для функціонування цифрових грошей мають бути створені механізми, що обмежують такі можливості.
Як можна запобігти подвійному витрачанню?
Централізований підхід
Централізований тип системи значно простіше у реалізації, на відміну децентралізованих альтернатив. В основному він передбачає наявність одного суб'єкта або організації, яка керує системою та контролює емісію та розподіл нових одиниць. Хороший приклад централізованого вирішення проблеми з подвійним витрачанням – eCash Девіда Чаума.
Щоб видати користувачам цифровий актив, що імітує готівку (здатні до анонімного та однорангового обміну), банк може використовувати сліпі підписи – як описано криптографом Девідом Чаумом у статті 1982 року «Сліпі підписи для невідслідковуваних платежів».
Наприклад, якщо користувач (назвемо його Денис) хоче отримати $100 у цифровій валюті, він має спочатку повідомити про це банку. За наявності балансу рахунку він генерує одне випадкове число чи кілька чисел для менших номіналів. Припустимо, він здійснює п'ять чисел, кожному з яких присвоюється значення $20. Щоб запобігти відстеженню банком грошових одиниць, Денис приховує випадкові числа, додаючи сліпучий фактор до кожного з них.
Потім він передає дані до банку, який вносить дебет на його рахунок у розмірі $100, після чого підписує повідомлення, що підтверджують, що кожна з п'яти частин інформації підлягає обміну на $20. Наразі Денис може витратити кошти, видані банком. Він іде в ресторан до Ірини та купує їжу, яка коштує $40.
Денис може прибрати сліпучий фактор, щоб використовувати випадкове число, пов'язане з цифровою валютою в чеку, яка буде унікальним ідентифікатором для кожної одиниці (подібно до серійного номера). Він розкриває два з них Ірині, яка тепер має негайно активувати їх у банку, щоб Денис не зміг витратити ті самі гроші в іншому місці. Банк перевірить підписи і, якщо все буде добре, зарахує на рахунок Ірини $40.
Після активації використовуються чеки спалюються, і, якщо Ерін захоче витратити свій новий баланс ще раз, їй буде необхідно отримати нові чеки аналогічним чином.
eCash Чаума може бути зручним для приватних фінансових операцій, але цей підхід не надто надійний, оскільки банк є центральною точкою відмови. Виданий чек сам по собі нічого не вартий, оскільки його вартість визначається виключно готовністю банку обміняти чек на долари. Водночас, клієнти перебувають у владі банку і повинні покладатися на нього, щоб мати можливість витратити гроші, а це саме та проблема, яку криптовалюта прагне виправити.
Децентралізований підхід
Забезпечення неможливості подвійного витрачання коштів в екосистемі без стороннього контролюючого органу є складнішим завданням. У цьому випадку не менш впливові учасники повинні погоджувати певні правила, щоб запобігати шахрайству та стимулювати всіх користувачів діяти чесно.
Найбільшим нововведенням, представленим у біломупапірі Біткоіна, було вирішення проблеми подвійного витрачання. І хоча вона не згадується як така, запропонована Сатоші структура даних тепер широко відома як блокчейн.
Блокчейн – це база даних із набором унікальних властивостей. Учасники мережі (називаються нодами) використовують спеціалізоване програмне забезпечення для синхронізації копії бази даних з іншими учасниками. У результаті всі учасники мережі можуть перевірити історію кожної транзакції, починаючи з генезис-блоку. Завдяки публічності блокчейна можна легко виявити та запобігти шахрайським діям, таким як подвійне витрачання транзакцій.
Коли користувач транслює транзакцію, вона не відразу додається до блокчейну: для початку потрібно включити її в блок за допомогою майнінгу. Отримувач вважатиме переклад дійсним лише після додавання блоку з транзакцією до ланцюга. В іншому випадку одержувач ризикує не отримати обіцяні кошти, оскільки відправник може витратити ці монети в іншому місці.
Після підтвердження транзакції монети не можна буде витратити двічі, оскільки право власності передається новому користувачеві і вся мережа може це верифікувати. Саме з цієї причини багато хто рекомендує дочекатися отримання кількох підтверджень, перш ніж приймати платіж. Кожен наступний блок збільшує кількість зусиль, необхідних зміни чи перезапису ланцюга (як за атаці 51%).
Давайте знову звернемося, наприклад, з рестораном. Денис повертається до ресторану та помічає оголошення про те, що в цьому закладі приймають оплату послуг у біткоїні. Йому сподобалися страви, які він їв минулого разу, тому він замовляє їх знову. Це коштуватиме 0,005 BTC.
Ірина надає свою публічну адресу, на яку він має відправити кошти. Денис транслює транзакцію, яка по суті є підписаним повідомленням про те, що 0,005 BTC Дениса тепер передаються Ірині. Будь-хто, кому пред'явлено підписану транзакцію Дениса, може переконатися в тому, що він справді був власником монет і, отже, мав право на їхнє відправлення.
Як ми вже говорили, транзакція дійсна лише у тому випадку, якщо вона включена до підтвердженого блоку. Прийняття непідтверджених транзакцій багато в чому схоже на отримання $40 у вигляді eCash з попереднього прикладу без своєчасного переведення в готівку чека в банку, що дозволяє відправнику витратити одну і ту ж суму в іншому місці. Тому Ірині варто дочекатися щонайменше шести підтверджень блоку (приблизно одну годину), перш ніж прийняти платіж Дениса.
Подвійне витрачання в мережі Біткоїна
Механізм Біткоіна дозволяє запобігти атакам з подвійним витрачанням, принаймні доти, доки протокол працює належним чином. Тобто, якщо хтось чекає на підтвердження транзакцій у блоці, відправнику буде непросто скасувати їх. Щоб це здійснити, необхідно реверсувати блокчейн, але для цього буде потрібно величезний обсяг потужності хешування.
Тим не менш, існує кілька атак з подвійним витрачанням, спрямованих на непідтверджені транзакції. Наприклад, при покупці за низькою ціною продавець може не захотіти чекати, поки транзакції будуть включені в блок. Завантажений замовленнями ресторан швидкого харчування також не зможе нормально функціонувати за такого тривалого часу обробки кожної покупки. Таким чином, якщо бізнес передбачає миттєві платежі, він стає вразливим до подвійного витрачання. Хтось може замовити гамбургер, заплатити за нього, а потім негайно відправити ті самі кошти на свою адресу. Нову транзакцію з вищою комісією швидше за все буде підтверджено першою і згодом перерве валідацію попередньої.
Існує три популярні методи для реалізації подвійного витрачання:
Атака 51% відбувається, коли об'єкту чи організації вдається взяти під контроль понад 50% всього хешрейту мережі, що дозволяє виключати транзакції або змінювати порядок. Така атака малоймовірна у випадку з Біткоїном, але може статися щодо інших блокчейн-мереж.
Атака типу «перегони» трапляється, коли дві конфліктуючі транзакції транслюються в один і той же час з використанням одних і тих самих засобів, але підтверджується лише одна з них. Мета зловмисника полягає в тому, щоб анулювати валідацію, підтверджуючи лише потрібну йому транзакцію (наприклад, надсилаючи ті самі кошти на свою адресу). Умовою подібної атаки є дозвіл продавця оплачувати товар непідтвердженими транзакціями.
Атаки Фінні відбуваються, коли зловмисник попередньо починає майнінг блоку зі своєю транзакцією, не транслюючи його одразу до мережі. Натомість він повторно витрачає монети, але вже в рамках іншої транзакції, і лише потім транслює попередній блок, скасовуючи переказ продавцю. Атаки Фінні вимагають певної послідовності подій, а також залежить від готовності одержувача приймати непідтверджені транзакції.
Як бачимо, продавець, який чекає підтвердження блоку, значно менше ризикує стати жертвою подвійного витрачання.
Резюме
Подвійне витрачання дозволяє використовувати цифрову грошову систему з метою отримання фінансової вигоди шляхом витрачання однієї і тієї ж суми більше одного разу. Відсутність адекватних рішень цієї проблеми перешкоджає подальшому прогресу у цій галузі.
На щастя, поява сліпих підписів вирішила багато проблем централізованих фінансових систем. А створення механізмів Proof of Work та технології блокчейну породило Біткоін – потужну форму децентралізованих грошей, що надихнула багатьох користувачів на створення тисяч інших криптовалютних проектів.
