Nota: 31 października 2008 roku Satoshi Nakamoto opublikował białą księgę Bitcoina na stronie P2P foundation (Bitcoin: system elektronicznego pieniądza peer-to-peer). Z okazji 16. rocznicy publikacji tej białej księgi, aby ponownie przeczytać ten klasyk, który na zawsze zmienił świat finansów, Złota Gospodarka ponownie publikuje chińską wersję białej księgi Bitcoina.
Autor: Satoshi Nakamoto; Tłumacz: Li Xiaolai
Streszczenie: czysta wersja systemu elektronicznego pieniądza peer-to-peer, która pozwoli na dokonywanie płatności online bezpośrednio z jednej strony do drugiej, bez potrzeby korzystania z instytucji finansowych. Podpisy cyfrowe, chociaż dostarczają częściowego rozwiązania, jeśli nadal wymagana jest zaufana strona trzecia w celu zapobieżenia podwójnemu wydaniu, to główna zaleta płatności elektronicznych zostaje osłabiona. Proponujemy rozwiązanie, które wykorzystuje sieć peer-to-peer do rozwiązania problemu podwójnego wydania. Sieć peer-to-peer oznaczy każdą transakcję znacznikiem czasowym, wprowadzając dane hashowe transakcji do ciągłego łańcucha pracy dowodowej opartego na hashu, tworząc zapis, który nie może zostać zmieniony bez całkowitego przetworzenia. Najdłuższy łańcuch służy zarówno do udowodnienia zdarzeń i ich kolejności, jak i do potwierdzenia, że pochodzi z największego zbioru mocy obliczeniowej CPU. Dopóki większość mocy obliczeniowej CPU jest kontrolowana przez uczciwe węzły - to znaczy, że nie współpracują z węzłami próbującymi zaatakować sieć - uczciwe węzły będą generować najdłuższy łańcuch i będą działać szybciej niż atakujący. Ta sieć sama w sobie potrzebuje minimalnej struktury. Informacje będą rozprzestrzeniane na zasadzie maksymalnego wysiłku, a węzły mogą się swobodnie poruszać; jednak przy dołączaniu zawsze muszą zaakceptować najdłuższy łańcuch dowodu pracy jako dowód tego, co miało miejsce w czasie, kiedy były nieaktywne.
1. Wprowadzenie (Introduction)
Handel w internecie w dużej mierze polega na instytucjach finansowych jako zaufanych stron trzecich do przetwarzania płatności elektronicznych. Choć dla większości transakcji ten system działa całkiem dobrze, nadal jest obciążony wrodzonymi wadami modelu zależnego od zaufania. Całkowicie nieodwracalne transakcje w rzeczywistości nie są możliwe, ponieważ instytucje finansowe nie mogą uniknąć arbitrażu sporów. Koszty arbitrażu zwiększają koszty transakcji, co ogranicza minimalną wielkość możliwej transakcji, a także całkowicie uniemożliwia wiele drobnych płatności. Oprócz tego istnieją znacznie większe koszty: system nie może zapewnić nieodwracalnych płatności za usługi, które nie mogą być odwrócone. Możliwość odwrócenia tworzy nieustanną potrzebę zaufania. Sprzedawcy muszą być czujni wobec swoich klientów, prosząc ich o dodatkowe informacje, które nie byłyby konieczne, gdyby zaufanie było obecne. Pewien odsetek oszustw uznawany jest za nieunikniony. Te koszty i niepewność płatności, chociaż można ich uniknąć, gdy płatności są dokonywane bezpośrednio między ludźmi za pomocą fizycznej waluty, nie ma żadnego mechanizmu, który mógłby umożliwić płatności przez kanały komunikacyjne, gdy jedna ze stron nie jest zaufana.
Potrzebujemy rzeczywiście systemu płatności elektronicznych opartego na dowodach kryptograficznych, a nie na zaufaniu, który pozwala dowolnym stronom handlować bez potrzeby zaufania do strony trzeciej. Niezmienność transakcji gwarantowane przez moc obliczeniową pomoże sprzedażom uniknąć oszustw, a mechanizm zabezpieczeń dla kupujących również jest łatwy do wdrożenia. W niniejszym dokumencie przedstawiamy rozwiązanie dotyczące podwójnego wydania, które wykorzystuje rozproszony serwer znaczników czasowych oparty na technologii peer-to-peer do generowania dowodów opartych na mocy obliczeniowej, rejestrując każdą transakcję w porządku czasowym. System ten jest bezpieczny, dopóki uczciwe węzły mają łącznie więcej mocy CPU niż współpracujący atakujący.
2. Transakcje (Transactions)
Definiujemy elektroniczną monetę jako łańcuch podpisów cyfrowych. Gdy właściciel przekazuje monetę innej osobie, musi dodać do końca tego łańcucha podpis cyfrowy: hash (suma kontrolna) poprzedniej transakcji oraz publiczny klucz nowego właściciela. Odbiorca może zweryfikować własność łańcucha podpisów cyfrowych, weryfikując podpis.
Problem z tą ścieżką polega na tym, że odbiorca nie może zweryfikować, czy żaden z wcześniejszych właścicieli nie dokonał podwójnego wydania. Powszechnym rozwiązaniem jest wprowadzenie zaufanego, scentralizowanego organu, znanego jako „mennica”, który sprawdza, czy każda transakcja nie zawiera podwójnego wydania. Po każdej transakcji moneta musi wrócić do mennicy, która następnie wydaje nową monetę. W ten sposób tylko monety wydawane bezpośrednio przez mennicy są zaufane i nie były podwójnie wydawane. Problem z tym rozwiązaniem polega na tym, że losy całego systemu walutowego zależą od firmy prowadzącej mennicy (jak bank), każda transakcja musi przechodzić przez nią.
Potrzebujemy sposobu, aby odbiorca mógł potwierdzić, że poprzedni właściciele nie podpisali żadnych wcześniejszych transakcji. Dla naszych celów tylko najwcześniejsza transakcja ma znaczenie, więc nie interesują nas późniejsze próby podwójnego wydania. Jedynym sposobem na potwierdzenie, że transakcja nie istnieje, jest poznanie wszystkich transakcji. W modelu mennicy, mennica zna wszystkie transakcje i może potwierdzić ich kolejność. Aby zrealizować powyższe zadanie bez udziału „zaufanej strony”, historia transakcji musi być publicznie ogłoszona, a zatem potrzebujemy systemu, który pozwoli uczestnikom uzgodnić tę samą, unikalną historię transakcji, którą otrzymali. Odbiorca musi udowodnić, że w momencie każdej transakcji większość węzłów mogła uznać ją za pierwszą odebraną.
3. Serwer znaczników czasowych (Timestamp Server)
To rozwiązanie zaczyna się od serwera znaczników czasowych. Serwer znaczników czasowych działa w ten sposób: nadaje znacznik czasowy dla hasha zbioru rekordów (items), a następnie rozgłasza hash, jakby to robiła gazeta, lub jak post w grupie dyskusyjnej. Oczywiście, znacznik czasowy może udowodnić, że dane istniały przed danym punktem czasowym, w przeciwnym razie ten hash nie mógłby zostać wygenerowany. Każdy znacznik czasowy zawiera w swoim hashu wcześniejsze znaczniki czasowe, tworząc łańcuch; każdy nowy znacznik czasowy jest dodawany po wcześniejszym znaczniku czasowym.
4. Dowód pracy (Proof-of-Work)
Aby zrealizować rozproszony serwer znaczników czasowych oparty na sieci peer-to-peer, musimy użyć systemu dowodu pracy podobnego do Hashcash Adama Baka, a nie czegoś w rodzaju gazet lub postów w grupach dyskusyjnych. Dowód pracy polega na poszukiwaniu wartości, która spełnia następujące warunki: po przetworzeniu na hash (na przykład przy użyciu SHA-256) ten hash musi zaczynać się od określonej liczby zer. Każdy dodatkowy wymóg zer znacząco zwiększa trudność pracy, a weryfikacja tej pracy wymaga jedynie obliczenia hasha.
W naszej sieci znaczników czasowych realizujemy dowód pracy w ten sposób: nieprzerwanie dodajemy losową liczbę (Nonce) w bloku, aż znajdziemy wartość spełniającą warunek; ten warunek to to, że hash bloku zaczyna się od określonej liczby zer. Gdy wynik uzyskany przez moc obliczeniową CPU spełnia dowód pracy, ten blok nie może być już zmieniony, chyba że wszystkie wcześniejsze wysiłki zostaną powtórzone. W miarę dodawania nowych bloków, zmiana aktualnego bloku oznaczałaby, że musimy powtórzyć wszystkie prace dla bloków po nim.
Dowód pracy jednocześnie rozwiązuje problem, jak określić, kto może reprezentować większość w podejmowaniu decyzji. Jeśli tak zwana „większość” jest określana na podstawie zasady „jeden adres IP, jeden głos”, wtedy każdy, kto może zarządzać wieloma adresami IP, może być uznawany za „większość”. Patrząc na to z perspektywy dowodu pracy, jest to zasadniczo zasada „jeden CPU, jeden głos”. Tak zwane „decyzje większości” są reprezentowane przez najdłuższy łańcuch, ponieważ łańcuch, w który włożono najwięcej pracy, to ten. Jeśli większość mocy obliczeniowej CPU jest kontrolowana przez uczciwe węzły, to uczciwy łańcuch rośnie najszybciej, jego tempo będzie znacznie szybsze niż innych konkurencyjnych łańcuchów. Aby zmienić już wygenerowany blok, atakujący musiałby ponownie wykonać dowód pracy dla tego bloku i wszystkich bloków po nim, a następnie dogonić i prześcignąć pracę uczciwych węzłów. Późniejsza część pracy pokaże, dlaczego możliwość atakującego, który jest opóźniony, aby dogonić, będzie malała eksponencjalnie w miarę wzrostu liczby bloków.
Aby poradzić sobie z rosnącą mocą obliczeniową sprzętu oraz zmieniającą się liczbą węzłów z czasem, trudność dowodu pracy jest określana na podstawie ruchomej średniej liczby wytworzonych bloków na godzinę. Jeśli bloki są generowane zbyt szybko, trudność wzrośnie.
5. Sieć (Network)
Kroki działania sieci są następujące:
Wszystkie nowe transakcje są nadawane do wszystkich węzłów;
Każdy węzeł pakuje nowe transakcje w blok;
Każdy węzeł zaczyna szukać dowodu pracy o określonym poziomie trudności dla tego bloku;
Gdy jakiś blok znajdzie swój dowód pracy, powinien go rozgłosić do wszystkich węzłów;
Wiele innych węzłów zaakceptuje ten blok tylko wtedy, gdy spełnione będą następujące warunki: wszystkie transakcje są ważne i nie były podwójnie wydane;
Wiele węzłów wyraża swoje akceptacje tego bloku w sieci poprzez użycie hasha zaakceptowanego bloku jako hasha bloku nowego, gdy tworzą kolejny blok.
Węzły zawsze uważają, że najdłuższy łańcuch jest tym prawidłowym i będą nieustannie dodawać do niego nowe dane. Jeśli dwa węzły jednocześnie ogłoszą do sieci dwie różne wersje „następnego bloku”, niektóre węzły otrzymają najpierw jeden z nich, a inne najpierw otrzymają drugi. W takim przypadku węzły będą kontynuować pracę nad tym blokiem, który otrzymały wcześniej, ale również zachowają drugą gałąź, na wypadek, gdyby ta stała się najdłuższym łańcuchem. Gdy znajdzie się kolejny dowód pracy, a jedna z gałęzi stanie się dłuższa, tymczasowa rozbieżność zostanie rozwiązana, a węzły pracujące nad drugą gałęzią przełączą się na dłuższy łańcuch.
Nowe transakcje nie muszą być transmitowane do wszystkich węzłów. Wystarczy, że dotrą do wystarczającej liczby węzłów, a wkrótce zostaną zapakowane w blok. Rozgłaszanie bloków pozwala również na odrzucenie niektórych wiadomości. Jeśli węzeł nie odebrał jakiegoś bloku, to przy odbieraniu następnego bloku zda sobie sprawę, że przegapił wcześniej blok, dlatego wyśle prośbę o uzupełnienie brakującego bloku.
6. Nagrody (Incentive)
Zgodnie z umową, pierwsza transakcja w każdym bloku jest specjalną transakcją, która generuje nową monetę, której własność przypada twórcy tego bloku. Dzięki temu węzły wspierające sieć otrzymują nagrody, a także zapewnia to sposób na wprowadzenie monet do obiegu - w tym systemie nie ma centralnej władzy do wydawania tych monet. Stabilny wzrost pewnej liczby nowych monet w obiegu jest jakby górnicy złota nieustannie zużywali swoje zasoby, aby zwiększyć ilość złota w obiegu. W naszym systemie zasoby zużywane to czas pracy CPU i energia, którą zużywają.
Nagrody mogą również pochodzić z opłat transakcyjnych. Jeśli wartość wyjścia danej transakcji jest mniejsza niż wartość jej wejścia, różnica ta stanowi opłatę za transakcję; ta opłata jest używana do nagradzania węzłów za pakowanie tej transakcji do bloku. Gdy ustalona liczba monet już weszła do obiegu, nagrody będą w całości pochodzić z opłat transakcyjnych, a inflacja nie wystąpi.
Mechanizm nagród może również zachęcać węzły do pozostania uczciwymi. Jeśli chciwy atakujący może zgromadzić więcej mocy CPU niż wszystkie uczciwe węzły razem, musi podjąć decyzję: czy wykorzystać tę moc do oszukania innych, poprzez odzyskiwanie własnych wydanych pieniędzy? Czy też użyć tej mocy do generowania nowych monet? Powinien zauważyć, że działanie zgodnie z zasadami jest korzystniejsze, ponieważ obecne zasady pozwalają mu zdobyć więcej monet niż wszyscy inni razem, co zdecydowanie jest bardziej opłacalne niż tajne niszczenie systemu i zamienienie swojego bogactwa w nicość.
7. Odbudowa miejsca na dysku (Reclaiming Disk Space)
Jeśli transakcja dotycząca monety miała miejsce w wystarczająco dużej liczbie bloków temu, to historia wydania tej monety może zostać odrzucona – celem zaoszczędzenia miejsca na dysku. Aby zrealizować tę funkcję bez łamania hasha bloku, hasz historii transakcji zostanie włączony do drzewa Merkle, a tylko korzeń drzewa zostanie uwzględniony w hashu bloku. Poprzez przycinanie gałęzi, stare bloki można skompresować. Wewnętrzny hash nie musi być przechowywany.
Blok nagłówka bez żadnych zapisów transakcji ma około 80 bajtów. Zakładając, że co dziesięć minut powstaje jeden blok, 80 bajtów pomnożone przez 6 razy 24 razy 365 równa się 4,2M rocznie. Do 2008 roku większość dostępnych komputerów miała 2GB pamięci, a według przewidywań prawa Moore'a, co roku zwiększa się o 1,2 GB, więc nawet przechowywanie nagłówków bloków w pamięci nie będzie problemem.
8. Uproszczone potwierdzenie płatności
Nawet bez uruchamiania pełnego węzła sieciowego możliwe jest potwierdzenie płatności. Użytkownik potrzebuje jedynie kopii nagłówka bloku najdłuższego łańcucha z dowodem pracy – może zweryfikować online, że posiada faktycznie pochodzący z najdłuższego łańcucha – a następnie uzyskać gałęzie drzewa Merkle, łącząc się z transakcją, która miała miejsce, gdy ten blok został oznaczony znacznikiem czasowym. Użytkownik nie może samodzielnie sprawdzić transakcji, ale łącząc się z jakimś miejscem w łańcuchu, może zobaczyć, że jakiś węzeł w sieci zaakceptował tę transakcję, a później dodane bloki dodatkowo potwierdzają, że sieć zaakceptowała tę transakcję.
Dopóki uczciwe węzły wciąż kontrolują sieć, weryfikacja jest wiarygodna. Jednakże, gdy sieć jest kontrolowana przez atakującego, weryfikacja nie jest aż tak wiarygodna. Chociaż węzły sieci mogą samodzielnie weryfikować zapisy transakcji, jeśli atakujący nadal kontroluje sieć, uproszczony sposób weryfikacji może być oszukany przez zafałszowane zapisy transakcji atakującego. Jedną z strategii zaradczych jest to, że oprogramowanie klienckie powinno akceptować ostrzeżenia od węzłów sieci. Gdy węzeł sieci wykryje nieprawidłowy blok, powinien wydać alarm, wysyłając powiadomienie do oprogramowania użytkownika, informując użytkownika o pobraniu pełnego bloku i ostrzegając go o weryfikacji spójności transakcji. Ci, którzy często przeprowadzają transakcje, powinni nadal dążyć do uruchomienia pełnego węzła, aby zapewnić sobie większe bezpieczeństwo i szybsze potwierdzenie transakcji.
9. Łączenie i dzielenie wartości
Chociaż możliwe jest przetwarzanie monet pojedynczo, ustalanie osobnego rekordu dla każdej monety jest bardzo niewygodne. Aby umożliwić podział i łączenie wartości, historia transakcji zawiera wiele wejść i wyjść. Zwykle jest to jedno wejście pochodzące z stosunkowo dużej poprzedniej transakcji lub wiele wejść pochodzących z mniejszych kwot; jednocześnie mogą być maksymalnie dwa wyjścia: jedno to płatność (do odbiorcy), a jeśli to konieczne, drugie to reszta (do płacącego).
Warto zauważyć, że „rozgałęzienie” nie stanowi tutaj problemu - rozgałęzienie odnosi się do sytuacji, gdy jedna transakcja zależy od kilku innych transakcji, a te z kolei zależą od jeszcze większej liczby transakcji. Nigdy nie było konieczności wyciągania pełnej, niezależnej historii jakiejkolwiek transakcji.
10. Prywatność (Privacy)
Tradycyjny model bankowy osiąga pewien poziom ochrony prywatności poprzez ograniczenie innym dostępu do informacji o transakcjach i zaufanych stron trzecich. W związku z potrzebą publicznego ujawnienia wszystkich zapisów transakcji, ta metoda została odrzucona. Jednakże, utrzymanie prywatności może być osiągnięte poprzez odcięcie przepływu informacji w innym miejscu - anonimowość klucza publicznego. Publiczność może zobaczyć, że ktoś przelał określoną kwotę komuś innemu, ale nie ma żadnych informacji wskazujących na konkretną osobę. Taki poziom ujawnienia informacji jest trochę podobny do handlu na giełdzie, gdzie tylko czas i kwoty poszczególnych transakcji są publikowane, ale nikt nie wie, kim są obie strony transakcji.
Istnieje jeszcze jedna warstwa zapory. Użytkownicy powinni aktywować nową parę kluczy publicznych i prywatnych dla każdej transakcji, aby inni nie mogli powiązać tych transakcji z tym samym właścicielem. Niektóre transakcje z wieloma wejściami nadal mogą być trudne do prześledzenia, ponieważ te wejścia muszą być zidentyfikowane jako pochodzące od tego samego właściciela. Niebezpieczeństwo polega na tym, że jeśli właściciel klucza publicznego zostanie ujawniony, wszystkie inne transakcje z nim związane również zostaną ujawnione.
11. Obliczenia (Calculations)
Załóżmy scenariusz, w którym atakujący próbuje wygenerować alternatywny łańcuch, który jest szybszy niż uczciwy łańcuch. Nawet jeśli mu się powiedzie, nie może dowolnie zmieniać systemu, to znaczy, nie może bezpodstawnie wytworzyć wartości ani uzyskać pieniędzy, które nigdy do niego nie należały. Węzły nie uznają nieprawidłowej transakcji jako płatności, a uczciwe węzły nigdy nie zaakceptują bloku zawierającego taką płatność. Atakujący może co najwyżej zmodyfikować tylko swoje własne transakcje, próbując odzyskać pieniądze, które już wydał.
Rywalizacja między uczciwym łańcuchem a atakującym można opisać jako losowy spacer dwumianowy. Sukces to moment, w którym uczciwy łańcuch właśnie dodał nowy blok, co zwiększa jego przewagę o 1; porażka to moment, kiedy łańcuch atakującego właśnie zyskał nowy blok, co zmniejsza przewagę uczciwego łańcucha o 1.
Prawdopodobieństwo, że atakujący może dogonić z opóźnioną sytuacją, jest podobne do problemu bankructwa hazardzisty. Załóżmy, że hazardzista z nieskończoną ilością żetonów zaczyna od straty i ma możliwość hazardowania nieskończoną ilość razy, jego celem jest wypełnienie istniejącej straty. Możemy obliczyć prawdopodobieństwo, że ostatecznie zdoła on pokryć straty, a zatem prawdopodobieństwo, że atakujący może dogonić uczciwy łańcuch, jest następujące:
Skoro założyliśmy, że p > q, ponieważ liczba bloków, które atakujący potrzebuje do dogonienia, stale rośnie, jego prawdopodobieństwo sukcesu maleje eksponencjalnie. Gdy sytuacja staje się niekorzystna, jeśli atakujący nie był w stanie wykonać szczęśliwego skoku do przodu na początku, jego szanse na wygraną znikną, gdy będzie jeszcze bardziej w tyle.
Teraz rozważmy, jak długo odbiorca nowej transakcji musi czekać, aby mieć pewność, że płacący nie może zmienić tej transakcji. Zakładamy, że płacący jest atakującym, który próbuje sprawić, by odbiorca uwierzył, że już zapłacił, a następnie zwrócił te pieniądze z powrotem do siebie. W takim przypadku odbiorca oczywiście dostanie ostrzeżenie, ale płacący ma nadzieję, że na tym etapie będzie za późno.
Odbiorca generuje nową parę kluczy publicznych i prywatnych, a następnie informuje płacącego o kluczu publicznym krótko przed podpisaniem. To zapobiega sytuacji, w której płacący mógłby wcześniej przygotować łańcuch bloków poprzez ciągłe obliczenia, a mając wystarczającą ilość szczęścia, mógłby być wystarczająco na przodzie, aż do momentu dokonania transakcji. Gdy płatność zostanie wysłana, nieuczciwy płacący zaczyna potajemnie pracować nad innym równoległym łańcuchem, próbując wprowadzić w nim odwrotną wersję transakcji.
Odbiorca czeka, aż ta transakcja zostanie zapakowana w blok i dodano z następne z bloków. Nie wie, jak postępuje atakujący, ale można założyć, że uczciwe bloki wymagają średniego czasu na wygenerowanie każdego bloku; potencjalny postęp atakującego jest zgodny z rozkładem Poissona, którego wartość oczekiwana wynosi:
Aby obliczyć prawdopodobieństwo, że atakujący nadal może dogonić, musimy pomnożyć gęstość prawdopodobieństwa rozkładu Poissona liczby bloków, które atakujący musi gonić, przez prawdopodobieństwo, że może dogonić przy tej liczbie bloków w tyle:
Konwertować na program w języku C...
Aby uzyskać częściowe wyniki, możemy zobaczyć, że prawdopodobieństwo maleje eksponencjalnie wraz ze wzrostem z:
Jeśli P jest mniejsze niż 0,1%...
12. Wnioski (Conclusions)
Przedstawiamy system elektronicznych transakcji, który nie musi polegać na zaufaniu; zaczyna się od zwykłego modelu monetarnego opartego na podpisach cyfrowych, który zapewnia solidną kontrolę własności, ale nie zapobiega podwójnemu wydaniu. Aby rozwiązać ten problem, proponujemy użycie mechanizmu dowodu pracy w sieci peer-to-peer, aby zarejestrować publiczną historię transakcji, pod warunkiem, że uczciwe węzły mogą kontrolować większość mocy obliczeniowej CPU, atakujący nie będzie mógł skutecznie zmienić systemu tylko pod względem mocy obliczeniowej. Solidność tej sieci opiera się na jej niestrukturalnej prostocie. Węzły mogą działać jednocześnie w minimalnej współpracy. Nie muszą być nawet identyfikowane, ponieważ ścieżka wiadomości nie zależy od konkretnego celu; wiadomości muszą być jedynie rozprzestrzeniane na zasadzie maksymalnego wysiłku. Węzły mogą się swobodnie poruszać, a po ponownym dołączeniu wystarczy, że zaakceptują łańcuch dowodu pracy jako dowód tego, co miało miejsce, gdy były offline. Głosują swoimi mocami CPU, ciągle dodając nowe, ważne bloki do łańcucha, odrzucając nieprawidłowe bloki, aby wyrazić swoje akceptacje lub odrzucenia ważnych transakcji. Wszelkie niezbędne zasady i nagrody mogą być egzekwowane przez ten mechanizm konsensusu.
Bibliografia (References)
b-money Dai Wei (1998-11-01) http://www.weidai.com/bmoney.txt
Projekt bezpiecznej usługi znaczników czasowych z minimalnymi wymaganiami zaufania Henri Massias, Xavier Serret-Avila, Jean-Jacques Quisquater 20. Sympozjum na temat teorii informacji w Beneluxie (1999-05) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.13.6228
Jak oznaczyć znacznik czasowy cyfrowego dokumentu Stuart Haber, W.Scott Stornetta Journal of Cryptology (1991) https://doi.org/cwwxd4 DOI: 10.1007/bf00196791
Poprawa efektywności i niezawodności znaczników czasowych cyfrowych Dave Bayer, Stuart Haber, W. Scott Stornetta Sequences II (1993) https://doi.org/bn4rpx DOI: 10.1007/978-1-4613-9323-8_24
Bezpieczne nazwy dla łańcuchów bitowych Stuart Haber, W. Scott Stornetta Materiały z 4. konferencji ACM na temat bezpieczeństwa komputerowego i komunikacji - CCS ’97(1997) https://doi.org/dtnrf6 DOI: 10.1145/266420.266430
Hashcash - środek przeciwdziałania atakom denial-of-service Adam Back (2002-08-01) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.15.8
Protokoły dla systemów kryptografii klucza publicznego Ralph C. Merkle 1980 IEEE Symposium on Security and Privacy (1980-04) https://doi.org/bmvbd6 DOI: 10.1109/sp.1980.10006
Wprowadzenie do teorii prawdopodobieństwa i jej zastosowań William Feller John Wiley & Sons (1957) https://archive.org/details/AnIntroductionToProbabilityTheoryAndItsApplicationsVolume1