Hashcash to system obliczeniowych znaczków oparty na Proof of Work, czyli dowodzie wykonanej pracy. Znaczek pokazuje, że znaleziono wynik spełniający określony warunek. Sam nie jest bitcoinem ani saldem rachunku, które można przelać.
Anna chce wysłać Pawłowi e-mail. Wysłanie kolejnej kopii prawie nic jej nie kosztuje, ale tę samą przewagę ma nadawca milionów reklam. Hashcash dodaje małą przeszkodę: komputer nadawcy najpierw tworzy obliczeniowy znaczek. Kosztem są czas i energia, nie zapłata poczcie. Adam Back ogłosił swoją implementację 28 marca 1997 roku, a w 2002 roku opublikował opis techniczny. Podobny pomysł badali już w 1992 roku Cynthia Dwork i Moni Naor. Hashcash należy do historii prób ograniczania nadużyć w sieci. [1] [12]
Hash to odcisk o stałej długości, obliczany z danych. Program Anny zmienia próbną wartość w znaczku i oblicza odcisk ponownie, aż wynik zacznie się od wymaganej liczby zerowych bitów. Bit to cyfra dwójkowa: zero albo jeden. Przy wymaganiu b zer szansa powodzenia pojedynczej próby wynosi około 2^-b, a średnia liczba prób to 2^b. Dla b = 20 daje to średnio 1048576 obliczeń, nie obowiązkową dokładną liczbę. Czasem program szybko ma szczęście, czasem szuka dłużej. Paweł sprawdza gotowy znaczek jednym obliczeniem hasha, ale musi też zweryfikować jego dane i zasady przyjęcia. [10] [11]
Gdyby Anna mogła dołączyć jeden znaczek do miliona wiadomości, przeszkoda straciłaby sens. Dlatego znaczek wskazuje konkretnego odbiorcę lub usługę oraz datę. Odbiorca sprawdza ważność i zapisuje przyjęte znaczki, aby odrzucać ponowne użycie, czyli replay. Sama data ani powiązanie z treścią nie powstrzymają ponownego wysłania tej samej wiadomości. Hashcash nie ma wspólnego globalnego rejestru wydatków: kontrolę zapewnia usługa odbierająca. Poprawny hash nie oznacza więc, że znaczek wolno przyjąć ponownie. [11] [12]
Wymaganą trudność ustala usługa odbierająca. Każdy dodatkowy bit zerowy mniej więcej podwaja średnią pracę. Słaby wymóg prawie nie spowalnia spamera, mocny obciąża również zwykłych ludzi. Liczba 20 jest zatem przykładem, nie ponadczasowym standardem bezpieczeństwa. Wykonanie tej samej liczby prób zajmuje też inny czas na starym telefonie niż na szybkim komputerze. Usługa musi uwzględnić wydajność urządzeń, okres ważności i własne możliwości. Hashcash nie narzuca wszystkim uniwersalnej liczby sekund. [10] [11]
Praca obliczeniowa nie odróżnia uczciwej osoby od napastnika. Spamer z wieloma komputerami albo botnetem, siecią przejętych urządzeń, może rozdzielić pracę i przerzucić część kosztu na innych. Tymczasem zwykłemu użytkownikowi ubywa energii w baterii. Hashcash ma zmieniać ekonomię ataku, a nie gwarantować zniknięcie spamu. Znaczek nie szyfruje też wiadomości, nie potwierdza rzeczywistej tożsamości i nie gwarantuje doręczenia. Jest jednym z warunków przyjęcia, który usługa może łączyć z innymi zabezpieczeniami. [10]
Wersja 1 ma format 1:bits:date:resource:ext:rand:counter. Pola oznaczają wersję, deklarowaną trudność, datę, odbiorcę lub usługę, rozszerzenia, losową wartość i zmieniany licznik. Pole bits określa, ile początkowych bitów zerowych ma według nadawcy odcisk, a nie ile prób rzeczywiście wykonał komputer. Te nazwy należą do formatu technicznego i nie są tłumaczone. Klasyczna implementacja oblicza SHA-1 dla całego ciągu. Warunek musi spełniać rzeczywisty odcisk, nie tylko liczba wpisana w bits. To opis historycznego formatu, a nie zalecenie używania SHA-1 w nowych rozwiązaniach bezpieczeństwa. Bitcoin stosuje inny format danych i inną funkcję hashującą. [11] [13]
Szukamy tu danych wejściowych, których odcisk ma z góry określony początek. Takie dane wejściowe nazywa się partial preimage: ich odcisk spełnia wymóg dotyczący określonej części, a pozostała część może być dowolna. Kolizja zachodzi natomiast wtedy, gdy dwa różne wejścia dają ten sam odcisk. Niektóre historyczne teksty używają luźniejszego określenia partial collision, lecz dla zrozumienia pracy ta różnica jest istotna. Atak znajdujący kolizje SHA-1 nie rozwiązuje automatycznie szukania wymaganego początku. Nie czyni to jednak SHA-1 właściwym ogólnym wyborem dla współczesnego bezpieczeństwa. [10] [11] [13]
W 2004 roku Hal Finney przedstawił RPOW, Reusable Proofs of Work. Użytkownik mógł oddać dowód pracy i otrzymać nowy token; przy kolejnym przekazaniu stary unieważniano i zastępowano nowym. Ponowne użycie nie oznaczało dowolnego kopiowania tego samego znaczka. System opierał się na serwerze z bezpiecznym modułem IBM 4758 i zdalnym sprawdzaniu uruchomionego programu. Ograniczało to zaufanie do operatora, ale pozostawiało założenia dotyczące sprzętu i producenta. RPOW był eksperymentalnym poprzednikiem, nie zdecentralizowanym konsensusem Bitcoina. [7] [15]
Bitcoin Whitepaper wprost cytuje Hashcash Backa. Satoshi wykorzystał tę samą asymetrię: znalezienie wyniku wymaga prób, inni łatwo go sprawdzają. Górnicy Bitcoina szukają prawidłowego nagłówka bloku, który podsumowuje blok transakcji i odsyła do poprzedniego bloku. Stosują double SHA-256, czyli dwie następujące po sobie operacje SHA-256, i porównują wynik z limitem liczbowym zwanym target. Nie jest to e-mailowy znaczek SHA-1 włożony do portfela. Wspólna jest zasada, nie cały system. [8] [14]
Opłata pocztowa ustala koszt pojedynczego żądania. Pieniądz potrzebuje także odpowiedzi, który z dwóch sprzecznych przelewów jest ważny. Bitcoin łączy bloki, a jego węzły wybierają spośród prawidłowych gałęzi łańcuch z największą skumulowaną pracą. Węzły, czyli komputery sprawdzające reguły, weryfikują też transakcje i dozwoloną emisję. Nawet ogromna praca nie uczyni nieprawidłowej transakcji prawidłową. Hashcash dostarczył ważny element; dopiero połączenie go z innymi zasadami umożliwiło wspólną historię pieniądza bez centralnego zarządcy. [8] [9]
Pełniejszy obraz uzyskasz, czytając to hasło razem z Proof of Work, Cypherpunks, Adam Back, Bitcoin Whitepaper, Bitcoin, Hash. Do tego hasła prowadzą również odsyłacze z Cypherpunks, b-money, Bit Gold, Reusable Proofs of Work.