Обяснение на двойното харчене
Начало
Статии
Обяснение на двойното харчене

Обяснение на двойното харчене

Напреднал
Публикувано Feb 17, 2020Актуализирано Jan 31, 2023
7m

Какво е двойно харчене?

Двойното харчене е потенциален проблем в една цифрова парична система, при която едни и същи средства се изразходват към двама получатели едновременно. Без никакви адекватни мерки за противодействие, протокол, който не решава проблема, е фундаментално подкопан – потребителите нямат начин да проверят дали средствата, които са получили, вече не са похарчени другаде.

Когато става въпрос за цифрови пари, гарантирането, че определени единици не могат да бъдат дублирани, е от първостепенно значение. Цялата система би била подкопана, ако Алис можеше да получи 10 единици, да ги копира и постави 10 пъти и да се окаже, че притежава 100 единици. По същия начин, такава схема не може да работи, ако тя може да изпрати едни и същи 10 единици на Боб и Карол едновременно. Така че, за да функционират цифровите пари, трябва да има механизми за предотвратяване на това поведение.


Как може да се предотврати двойното харчене?

Централизираният подход

Централизираният маршрут е значително по-лесен за изпълнение от децентрализираните алтернативи. Това обикновено включва един надзирател, който управлява системата и контролира издаването и разпространението на единици. Добър пример за централизирано решение на проблема с двойното харчене е това на eCash на Дейвид Чаум. 

За да издаде на потребителите дигитален актив, имитиращ пари в брой (с възможност за анонимен обмен peer-to-peer), банката може да използва слепи подписи – както е описано подробно от криптографа Дейвид Чаум в неговата публикация от 1982 г. „Слепи подписи за непроследими плащания“ .

В такъв контекст, ако потребител (да го наречем Дан) желае да получи $100 в цифрови пари, от него се изисква първо да информира банката. При условие че има баланс в сметката си, той ще генерира произволно число (или много, за по-малки купюри). Да предположим, че той произвежда пет числа, всяко от които ще получи стойност от $20. За да попречи на банката да проследява конкретни единици, Дан скрива произволните числа, като добавя заслепяващ фактор към всяко от тях.

След това той предава тези данни на банката, която дебитира сметката му за $100 и подписва съобщения, удостоверяващи, че всяка от петте части информация може да бъде изкупена за $20. Дан вече може да харчи средствата, издадени от банката. Той отива в ресторанта на Ерин и купува храна, която му струва $40. 

Дан може да премахне заслепяващия фактор, за да разкрие произволното число, свързано с всяка цифрова парична „сметка“, която служи като уникален идентификатор за всяка единица (подобно на сериен номер). Той разкрива две от тях на Ерин, която сега трябва да ги изкупи незабавно в банката, за да попречи на Дан да ги похарчи при друг търговец. Банката ще провери дали подписите са валидни и ако всичко изглежда правилно, ще кредитира сметката на Ерин с $40.

Използваните сметки вече са по същество изгорени и трябва да бъдат издадени още, ако Ерин иска да похарчи новия си баланс по същия начин.

Настройката на eCash на Чаум може да бъде ценна за частни преводи. Но той се проваля в устойчивостта, защото банката е централна точка на провал. Една издадена сметка не струва нищо сама по себе си, тъй като нейната стойност се извлича единствено от желанието на банката да я размени за долари. Клиентите са оставени на милостта на банката и трябва да разчитат на нейната добра воля, за да функционират парите. Точно това е проблемът, който криптовалутата цели да реши.


Децентрализираният подход

По-трудно е да се гарантира, че средствата не могат да бъдат изразходвани двойно в екосистема без надзорник. Еднакво мощните участници трябва да се координират около набор от правила, които предотвратяват измами и стимулират всички потребители да действат честно.

Най-голямата иновация, представена в бялата книга на биткойн, беше решение на проблема с двойното харчене. Въпреки че не се споменава като такава, Сатоши предложи структурата от данни, която сега е широко известна като блокчейн.
Блокчейн всъщност е просто база данни с някои уникални свойства. Участниците в мрежата (наричани възли) работят със специализиран софтуер, който им позволява да синхронизират своето копие на базата данни със своите колеги. Резултатът е, че цялата мрежа може да одитира хронологията на трансакциите, датиращи от генезисния блок. Като имате публично достъпен блокчейн, е лесно да се открие и предотврати измамна дейност, като трансакции, които се опитват да изразходват двойно.
Когато потребител излъчва трансакция, тя не се добавя веднага към блокчейна – първо трябва да бъде включена в блок чрез копаене. Като такъв, получателят трябва да счита трансакцията за валидна само след като нейният блок бъде добавен към веригата. В противен случай те рискуват да загубят средствата, тъй като подателят може да похарчи същите криптовалути другаде. 
След като трансакцията бъде потвърдена, криптовалутите не могат да бъдат похарчени два пъти, тъй като собствеността се възлага на нов потребител – и цялата мрежа може да провери това. Поради тази причина мнозина препоръчват да се изчаква многократно потвърждение, преди плащането да бъде прието като валидно. Всеки следващ блок драстично увеличава количеството усилия, необходими за модифициране или пренаписване на веригата (което може да се случи по време на 51% атака).

Нека да разгледаме отново сценария за ресторанта. Дан се връща в ресторанта и този път забелязва на прозореца стикер „Тук се приема биткойн“. Храната, която е ял миналия път, му е харесала, така че си я поръчва отново. Сметката му е 0,005 BTC. 

Ерин му представя публичен адрес, на който трябва да изпрати средствата. Дан излъчва трансакцията, представляваща подписано съобщение, в което се посочва, че 0,005 BTC, които са били притежание на Дан, сега са при Ерин. Без да навлизаме в твърде много подробности, всеки, на когото е представена подписаната трансакция на Дан, може да провери дали той наистина притежава криптовалутата и следователно дали е имал правомощието да я изпрати.

Както споменахме обаче, трансакцията е валидна само ако е включена в блок, който се потвърждава. Приемането на непотвърдени трансакции е подобно на приемането на $40 в eCash от предишния пример, без незабавно да ги осребрявате в банката – това позволява на подателя да ги похарчи другаде. Затова се препоръчва Ерин да изчака поне 6 потвърждения на блока (приблизително един час), преди да приеме плащането на Дан.


Двойно харчене в биткойн

Биткойнът е внимателно проектиран да предотвратява атаки на двойно харчене, поне когато протоколът се използва според очакванията. Тоест, ако хората чакат трансакциите да бъдат потвърдени в блок, няма лесен начин подателят да го отмени. За да се случи това, подателят трябва да „обърне“ блокчейна, което изисква нереалистично количество мощност за хеширане.

Има обаче няколко атаки с двойно харчене, насочени към страни, които приемат непотвърдени трансакции. За покупки на ниска стойност, например, търговецът може да не иска да чака трансакциите да бъдат включени в блок. Натоварен ресторант за бързо хранене вероятно не може да си позволи да чака, докато мрежата обработва всяка покупка. Така че, ако бизнесът позволява „незабавни“ плащания, той се отваря за двойни харчения. Някой може да поръча бургер, да го плати и веднага да изпрати същите средства на собствения си адрес. При по-висока такса тази нова трансакция вероятно ще бъде потвърдена първа и следователно ще анулира предишната.

Има три популярни метода за извършване на двойно харчене:

  • 51% атаки: когато едно лице или организация успява да контролира повече от 50% от хешрейта, което позволява изключване или променяне на подредбата на трансакциите. Подобна атака е много малко вероятна за биткойн, но се е случвала в други мрежи.
  • Атака тип „състезание“: две конфликтни трансакции се излъчват последователно, като се използват едни и същи средства – но само една трансакция се потвърждава. Целта на нападателя е да анулира плащането, като валидира само трансакцията, която е от полза за него (например, изпращане на същите средства на адрес, който той контролира). Атаки тип „състезание“ изискват получателят да приеме непотвърдена трансакция като плащане.
  • Атаки Фини: нападателят предварително копае една трансакция в блок, без да я излъчва незабавно към мрежата. Вместо това той харчи същата криптовалута в друга трансакция и едва след това излъчва своя по-рано изкопан блок, което може да анулира плащането. Атаките Фини изискват специфична последователност от събития и също зависят от приемането на непотвърдени трансакции от получателя.

Както виждаме, търговец, който чака потвърждения за блок, значително намаля рисковете да стане жертва на двойно харчене.


Заключителни мисли

Двойното харчене позволява на потребителя да манипулира електронна парична система за финансова печалба, като използва едни и същи средства повече от веднъж. Традиционно липсата на адекватни решения на проблема е застанала на пътя на напредъка в областта.

За щастие обаче използването на слепи подписи предложи интересно решение за централизирани финансови схеми. По-късно създаването на механизми за Доказателство на работа и блокчейн технология роди биткойн като мощна форма на децентрализирани пари – което от своя страна вдъхнови хиляди други проекти за криптовалута.