Czym jest podwójne wydatkowanie?
Podwójne wydatkowanie stanowi potencjalny problem w przypadku wszystkich cyfrowych systemów gotówkowych. Polega ono na tym, że te same środki zostają przeznaczone do płatności dwukrotnie. Bez odpowiedniej architektury systemowej, która chronić będzie protokół przed tym zagrożeniem, użytkownicy nie mają możliwości zweryfikowania czy otrzymane środki nie zostały już gdzieś wcześniej wydane.
W przypadku kryptowalut, niezwykle ważne jest zapewnienie, że określonych jednostek cyfrowych monet nie można powielić. Cały system byłby zagrożony, gdyby Alice mogła otrzymać 10 monet, skopiować je i powielić dziesięciokrotnie, stając się posiadaczem 100 jednostek kryptowaluty. Podobny problem pojawiłby się, jeśli Alice mogłaby wysłać te same 10 monet jednocześnie do Boba i Carol. Aby pieniądze cyfrowe mogły funkcjonować, muszą istnieć mechanizmy zapobiegające podwójnemu wydatkowaniu.
Jak można zapobiec podwójnemu wydatkowaniu?
Rozwiązanie scentralizowane
Scentralizowane rozwiązanie tego problemu jest znacznie łatwiejsze do wdrożenia niż zdecentralizowane alternatywy. W takim wypadku do systemu dodaje się jednego nadzorcę, który zarządza systemem oraz posiada prawo emisji jednostek cyfrowej gotówki. Dobrym przykładem scentralizowanego rozwiązania problemu podwójnego wydatkowania jest system zastosowany w eCash Davida Chauma.
Spójrzmy na prosty przykład. Jeśli użytkownik (nazwijmy go Dan) chce otrzymać 100 USD w gotówce cyfrowej, musi najpierw poinformować o tym bank. O ile posiada wystarczające środki na swoim koncie, może przystąpić do tego procesu. Wpierw wygeneruje on losową liczbę (lub wiele, dla mniejszych nominałów). Załóżmy, że losuje pięć liczb, z których każda ma przypisaną wartość 20 USD. Aby uniemożliwić bankowi śledzenie określonych jednostek, Dan zaciemnia losowe liczby, dodając do każdej z nich "blinding factor" .
Następnie przekazuje te dane bankowi, który pobiera 100 USD z jego konta, i podpisuje wiadomości potwierdzające, że każdą z pięciu "informacji" można wymienić za 20 USD. Dan może teraz wydawać środki wyemitowane przez bank. Idzie na przykład do restauracji Erin i kupuje obiad kosztujący 40 USD.
Dan może usunąć blinding factor, w celu odsłonięcia liczby losowanej związanej z każdym „rachunkiem” cyfrowej gotówki. Taka liczba służy jako unikalny identyfikator dla każdej jednostki monety cyfrowej (podobnie jak numer seryjny w pralce). Ujawnia dwie z nich Erin, a restauracja musi teraz natychmiast "odkupić" je od banku, aby uniemożliwić Danowi podwójne wydatkowanie - czyli wykorzystanie tych samych monet z przypisanymi liczbami losowanymi u innego sprzedawcy. Bank sprawdzi, czy podpisy są ważne, a jeśli wszystko będzie wyglądało poprawnie, doładuje konto Erin kwotą 40 USD.
Pierwotnie zastosowane rachunki są teraz zasadniczo "spalane" albo po prostu usuwane. Konieczne jest więc stworzenie nowych przez bank, jeśli Erin zdecyduje się na wydanie swoich pieniędzy cyfrowych. Przyznacie, że jest to mało ergonomiczne rozwiązanie.
ECash Chauma mógłby zadziałać w systemie ograniczonym do prywatnych transakcji. Ale nie jest on (system) odporny na ataki, ponieważ jeden bank sprawuje kontrolę. Wydany rachunek sam w sobie nie jest nic wart, ponieważ jego wartość wynika wyłącznie z gotowości banku do wymiany go na dolary. Klienci są więc na łasce banku i muszą polegać na jego dobrej woli, aby cyfrowe pieniądze działały. Problem ten został po raz pierwszy w pełni rozwiązany w Bitcoinie.
Rozwiązanie zdecentralizowane
Zapewnienie, że funduszy nie można wydać podwójnie w systemie monetarnym bez centralnego nadzorcy, jest sporym wyzwaniem. Uczestnicy sieci muszą koordynować zbiór zasad, które zapobiegają oszustwom i zachęcają wszystkich użytkowników do uczciwego działania w obrębie ekosystemu.
Powróćmy do scenariusza płatności w restauracji. Dan wraca do restauracji i tym razem zauważa na oknie naklejkę "Akceptujemy Bitcoina". Smakował mu ostatni posiłek, więc zamawia go ponownie. Kosztuje go to 0,005 BTC.
Jak już wspomniano, transakcja jest ważna tylko wtedy, gdy zostanie zawarta w bloku, a blok potwierdzony przez sieć (górników). Akceptowanie niepotwierdzonych transakcji przypomina przyjmowanie 40 USD w eCash z poprzedniego przykładu, bez natychmiastowej wypłaty otrzymanych pieniędzy w banku - pozwala to nadawcy wydać je gdzie indziej. Dlatego zaleca się, aby Erin czekała na co najmniej 6 potwierdzeń z sieci (co trwa około godziny) przed finalnym zaakceptowaniem płatności Dana.
Podwójne wydatkowanie w Bitcoinie
Bitcoin został starannie zaprojektowany, aby zapobiegać atakom związanym z podwójnym wydatkowaniem. Przynajmniej wtedy, gdy protokół jest używany zgodnie z założeniami. Oznacza to, że jeśli poszczególne osoby czekają na potwierdzenie transakcji w bloku, nadawca nie może cofnąć transakcji. Żeby to zrobić, musieliby „odwrócić” cały łańcuch bloków Bitcoina, co wymagałoby dostępu do absurdalnie wielkich pokładów mocy obliczeniowej i wiązałoby się z ogromnymi kosztami.
Istnieje jednak kilka ataków polegających na podwójnym wydatkowaniu, których celem są strony akceptujące niepotwierdzone transakcje. Na przykład w przypadku zakupów o niskiej wartości akceptant może nie chcieć czekać na włączenie transakcji do bloku. Restauracji typu fast food prawdopodobnie nie stać na czekanie na potwierdzenia z sieci. Jeśli więc firma umożliwia „natychmiastowe” płatności, otwiera się na atak z podwójnym wydatkowaniem. Ktoś może zamówić burgera, zapłacić za niego, a następnie natychmiast wysłać te same środki na swój adres. Przy wyższej opłacie ta nowa transakcja prawdopodobnie zostanie najpierw potwierdzona, a zatem unieważni poprzednią.
Istnieją trzy popularne metody przeprowadzania tych ataków:
- atak 51%: gdy jednostka lub organizacja przejmie ponad 51% mocy obliczeniowej sieci kryptowaluty, umożliwi jej to odwrócenie łańcucha bloków i podwójne wydatkowanie transakcji. Taki atak jest możliwy również w Bitconie, jednak na astronomiczne koszty z nim związane oraz problemy logistyczne - nigdy nie miał miejsca.
- Wyścig: nadawane są dwie transakcje z tymi samymi środkami, lecz tylko jedna z nich zostaje zaakceptowana. Celem atakującego jest unieważnienie jednej transakcji i doprowadzenie do zatwierdzenia tej, dzięki której zyska monety dla siebie (np. wysyłając kryptowaluty na adres, który kontroluje). Przeprowadzenie ataku "wyścigowego" wymaga, żeby odbiorca akceptował płatności z niepotwierdzonymi transakcjami (0-conf transactions).
- Atak Finney'a: atakujący przygotowuje jedną transakcję, bez natychmiastowego rozgłaszania jej do sieci. Następnie wydaje te same monety w ramach innej transakcji i dopiero wtedy rozsyła swój wcześniej wydobyty blok, który może później unieważnić płatność. Ataki Finney'a wymagają określonej sekwencji zdarzeń i dobrej koordynacji, a także uzależnione są od tego, czy odbiorca przyjmuje płatności 0-conf.
Jak możemy zauważyć, sprzedawca, który czeka na kilka potwierdzeń transakcji w sieci, znacznie zmniejsza ryzyko stania się ofiarą ataków polegających na podwójnym wydatkowaniu.
Wnioski
Podwójne wydatkowanie w monetarnych systemach cyfrowych pozwala atakującym na uzyskania korzyści finansowych, wykorzystując te same fundusze więcej niż raz. Tradycyjnie, brak odpowiednich rozwiązań problemu, przeszkadzał w dokonaniu postępu w tej dziedzinie.