Какво е двойно харчене?
Двойното харчене е потенциален проблем в една цифрова парична система, при която едни и същи средства се изразходват към двама получатели едновременно. Без никакви адекватни мерки за противодействие, протокол, който не решава проблема, е фундаментално подкопан – потребителите нямат начин да проверят дали средствата, които са получили, вече не са похарчени другаде.
Когато става въпрос за цифрови пари, гарантирането, че определени единици не могат да бъдат дублирани, е от първостепенно значение. Цялата система би била подкопана, ако Алис можеше да получи 10 единици, да ги копира и постави 10 пъти и да се окаже, че притежава 100 единици. По същия начин, такава схема не може да работи, ако тя може да изпрати едни и същи 10 единици на Боб и Карол едновременно. Така че, за да функционират цифровите пари, трябва да има механизми за предотвратяване на това поведение.
Как може да се предотврати двойното харчене?
Централизираният подход
Централизираният маршрут е значително по-лесен за изпълнение от децентрализираните алтернативи. Това обикновено включва един надзирател, който управлява системата и контролира издаването и разпространението на единици. Добър пример за централизирано решение на проблема с двойното харчене е това на eCash на Дейвид Чаум.
В такъв контекст, ако потребител (да го наречем Дан) желае да получи $100 в цифрови пари, от него се изисква първо да информира банката. При условие че има баланс в сметката си, той ще генерира произволно число (или много, за по-малки купюри). Да предположим, че той произвежда пет числа, всяко от които ще получи стойност от $20. За да попречи на банката да проследява конкретни единици, Дан скрива произволните числа, като добавя заслепяващ фактор към всяко от тях.
След това той предава тези данни на банката, която дебитира сметката му за $100 и подписва съобщения, удостоверяващи, че всяка от петте части информация може да бъде изкупена за $20. Дан вече може да харчи средствата, издадени от банката. Той отива в ресторанта на Ерин и купува храна, която му струва $40.
Дан може да премахне заслепяващия фактор, за да разкрие произволното число, свързано с всяка цифрова парична „сметка“, която служи като уникален идентификатор за всяка единица (подобно на сериен номер). Той разкрива две от тях на Ерин, която сега трябва да ги изкупи незабавно в банката, за да попречи на Дан да ги похарчи при друг търговец. Банката ще провери дали подписите са валидни и ако всичко изглежда правилно, ще кредитира сметката на Ерин с $40.
Използваните сметки вече са по същество изгорени и трябва да бъдат издадени още, ако Ерин иска да похарчи новия си баланс по същия начин.
Настройката на eCash на Чаум може да бъде ценна за частни преводи. Но той се проваля в устойчивостта, защото банката е централна точка на провал. Една издадена сметка не струва нищо сама по себе си, тъй като нейната стойност се извлича единствено от желанието на банката да я размени за долари. Клиентите са оставени на милостта на банката и трябва да разчитат на нейната добра воля, за да функционират парите. Точно това е проблемът, който криптовалутата цели да реши.
Децентрализираният подход
По-трудно е да се гарантира, че средствата не могат да бъдат изразходвани двойно в екосистема без надзорник. Еднакво мощните участници трябва да се координират около набор от правила, които предотвратяват измами и стимулират всички потребители да действат честно.
Нека да разгледаме отново сценария за ресторанта. Дан се връща в ресторанта и този път забелязва на прозореца стикер „Тук се приема биткойн“. Храната, която е ял миналия път, му е харесала, така че си я поръчва отново. Сметката му е 0,005 BTC.
Както споменахме обаче, трансакцията е валидна само ако е включена в блок, който се потвърждава. Приемането на непотвърдени трансакции е подобно на приемането на $40 в eCash от предишния пример, без незабавно да ги осребрявате в банката – това позволява на подателя да ги похарчи другаде. Затова се препоръчва Ерин да изчака поне 6 потвърждения на блока (приблизително един час), преди да приеме плащането на Дан.
Двойно харчене в биткойн
Биткойнът е внимателно проектиран да предотвратява атаки на двойно харчене, поне когато протоколът се използва според очакванията. Тоест, ако хората чакат трансакциите да бъдат потвърдени в блок, няма лесен начин подателят да го отмени. За да се случи това, подателят трябва да „обърне“ блокчейна, което изисква нереалистично количество мощност за хеширане.
Има обаче няколко атаки с двойно харчене, насочени към страни, които приемат непотвърдени трансакции. За покупки на ниска стойност, например, търговецът може да не иска да чака трансакциите да бъдат включени в блок. Натоварен ресторант за бързо хранене вероятно не може да си позволи да чака, докато мрежата обработва всяка покупка. Така че, ако бизнесът позволява „незабавни“ плащания, той се отваря за двойни харчения. Някой може да поръча бургер, да го плати и веднага да изпрати същите средства на собствения си адрес. При по-висока такса тази нова трансакция вероятно ще бъде потвърдена първа и следователно ще анулира предишната.
Има три популярни метода за извършване на двойно харчене:
- 51% атаки: когато едно лице или организация успява да контролира повече от 50% от хешрейта, което позволява изключване или променяне на подредбата на трансакциите. Подобна атака е много малко вероятна за биткойн, но се е случвала в други мрежи.
- Атака тип „състезание“: две конфликтни трансакции се излъчват последователно, като се използват едни и същи средства – но само една трансакция се потвърждава. Целта на нападателя е да анулира плащането, като валидира само трансакцията, която е от полза за него (например, изпращане на същите средства на адрес, който той контролира). Атаки тип „състезание“ изискват получателят да приеме непотвърдена трансакция като плащане.
- Атаки Фини: нападателят предварително копае една трансакция в блок, без да я излъчва незабавно към мрежата. Вместо това той харчи същата криптовалута в друга трансакция и едва след това излъчва своя по-рано изкопан блок, което може да анулира плащането. Атаките Фини изискват специфична последователност от събития и също зависят от приемането на непотвърдени трансакции от получателя.
Както виждаме, търговец, който чака потвърждения за блок, значително намаля рисковете да стане жертва на двойно харчене.
Заключителни мисли
Двойното харчене позволява на потребителя да манипулира електронна парична система за финансова печалба, като използва едни и същи средства повече от веднъж. Традиционно липсата на адекватни решения на проблема е застанала на пътя на напредъка в областта.