Kryptografia Blockchain, czyli dlaczego nikt nie może ukraść moich pieniędzy – poradnik

10/27/20175 min czytania — w Programowanie, Blockchain

Wstęp

Cześć. Jest to kolejny post z serii o blockchain. Tym razem zajmiemy się zabezpieczeniami blockchain i w jak mogą być złamane. Opowiem też dlaczego nikt nie może wysłać z naszego adresu pieniędzy, mimo że każdy zna adres, z którego wysyłam transakcje.

Zapraszam Cię również do poprzednich postów:

Moja historia z bitcoinem, czyli początki fascynacji blockchain: https://blog.patys.pl/2017/09/16/historia-jak-poznalem-blockchain-i-bitcoin/

Implementacja najprostszego blockchain: https://blog.patys.pl/2017/09/29/wlasny-blockchain-implementacja-poradnik/

Matematyka użyta w blockchain: https://blog.patys.pl/2017/10/11/matematyka-tworzaca-blockchain-i-bitcoin-poradnik/

Pusty portfel czy pełny

Skąd się biorą pieniądze w portfelu i czemu nie można wysłać z pustego? To jest dosyć proste. Blockchain nie zawiera żadnych informacji o portfelach 🙂 Zna jedynie ich adresy. Jeśli wysyłamy coś to blockchain sprawdza po kolei wszystkie transakcje i liczy ile dostałeś i wydałeś na tym adresie. Jeśli nie otrzymałeś wystarczającej ilości na dany adres, blockchain odrzuci transakcję. ###Wysyłanie pieniędzy, czyli jak działają transakcje

Wszystko jest publiczne i każdy może zobaczyć co wysyłasz. To idea blockchain, żeby transakcje były dostępne i wszyscy mogli je weryfikować. Wiąże się z tym jednak parę kwestii dotyczących bezpieczeństwa.

Najprostsza transakcja może wyglądać w ten sposób:

Patryk wysłał 5 coin do Mateusza.

Jednak skąd blockchain może wiedzieć, że Patryk to na pewno jest prawdziwym właścicielem, a nie oszustem. Do takiej transakcji dorzucany jest podpis (digital signature). Służy do potwierdzenia tożsamości wysyłającego.

Digital Signature czyli podpis

Nasz portfel generujemy poprzez otrzymanie klucza publicznego i prywatnego. Oba posłużą nam do podpisania naszej transakcji.

Klucze to bardzo, ale to bardzo duże liczby (https://pl.wikipedia.org/wiki/RSA_(kryptografia)). Dzięki czemu możemy na nich wykonywać różne operacje, takie jak dodawanie czy mnożenie. Wyglądają często, jak zbiór liter i cyfr, jednak jest to tylko odpowiedni zapis wynikający z uproszczonego zapisu i algorytmu.

Skoro mamy klucz publiczny i prywatny musimy zdecydować co w transakcji podpisać. Najlepiej użyć hash’u. Jak wiemy zawiera on wszystkie informacje o transakcji i zapewnia, że jeśli nastąpi zmiana, drastycznie się on zmieni. Dodatkowo jest to bardzo duża, unikalna liczba, reprezentująca nasze dane.

Tak więc mamy trzy liczby. Klucz publiczny (p), prywatny (q) i hash transakcji. Musimy zawrzeć wszystkie informacje jednak nie możemy ujawnić klucza prywatnego.

Dlatego dokonajmy czegoś takiego: (p – klucz publiczny, q – klucz prywatny)

N = p * q

Powstanie nam nowa liczba, która będzie zawierać iloczyn klucza publicznego i prywatnego. Dlaczego jest to bezpieczne? Przecież prosta odwrotność tego działania pozwoli nam odgadnąć klucz prywatny. Wystarczy dokonać: q = N / p. Zgadza się. Jednak weź pod uwagę, że klucz publiczny i prywatny to naprawdę duże liczby, załóżmy że ponad 300 znaków, przez co nie jesteśmy w stanie tego jeszcze obliczyć. Dodatkowo, wykorzystywane są liczby pierwsze w krzywej eliptycznej, która tworzy te klucze. Obecnie nie ma chyba możliwości tego złamać, ze względu na brak wystarczającej mocy obliczeniowej.

Mamy teraz wszystkie informacje. Udało nam się zabezpieczyć klucz prywatny. Podsumujmy co przekażemy do sieci.

N, czyli ukryty klucz prywatny

p, czyli klucz publiczny

s, czyli nasz podpis

h, czyli hash transakcji

Liczymy

s = h * N

Podpis to nasz hash przemnożony przez ukryty klucz prywatny. Utworzyliśmy podpis, więc wysyłamy naszą transakcję do sieci.

{
from: '3', // nasz klucz publiczny
to: '2', // do kogo wysyłamy
amount: '2', // ile wysyłamy
N: '15', // nasz ukryty klucz prywatny
hash: '21', // hash transakcji
signature: '315' // nasz podpis
}

Użyłem bardzo małych liczb, żeby pokazać obliczenia służące weryfikacji. W rzeczywistości odpowiadają one setkom lub tysiącom cyfr. Jak widać w powyższym przykładzie używając liczb 15, 21 otrzymaliśmy podpis wynoszący 315. Trudność rozwiązania bardzo szybko się zwiększa.

Nasza sygnatura, czyli podpis wynosi 315.

N, czyli ukryty klucz prywatny wynosi 15.

Klucz publiczny, dzięki któremu ukryliśmy klucz prywatny to 3.

Przechodząc do wzorów:

s = h * q // typowy podpis wiadomości

s * p = h * N // podpis w blockchain

h * p * q = h * N // dowód

Jak widzimy jesteśmy w stanie udowodnić (za pomocą hashu i ukrytego klucza), że posiadamy klucz prywatny do danego adresu, ponieważ iloczyn N i hashu to iloczyn klucza prywatnego, publicznego i hashu. Spójrzmy na to inaczej: Dane publiczne:

hash, czyli h

N, czyli iloczyn kluczy

p, czyli klucz publiczny

h*N = 21 * 15 = 315

Dane prywatne:

klucz prywatny = 5 (czyli q)

h * p * q = 21 * 3 * 5 = 315

Jak widzimy oba obliczenia się zgadzają i pomimo, że nie udostępniliśmy klucza prywatnego nadal blockchain ma możliwość zweryfikowania, że go posiadamy.

Dlaczego nie można zgadnąć q? Jest to bardzo duża liczba. Odwrotności dzielenia nie wykonamy ze względu na czas, który by to zajęło, a zgadywanie każdej liczby po kolei ma złożoność silni, np dla klucza o 300 cyfrach wynosi 300! (trzysta silnia).

Kopanie i związane z nim problemy

Skoro rozwiązaliśmy problem transakcji, dochodzimy do momentu, w którym musimy zrozumieć kopanie. Co się stanie jeśli w tym samym czasie zostaną wykopane bloki? Co jeśli wyślę dwie transakcje równocześnie? Odejmie mi pieniądze podwójnie?

Równoczesne kopanie

Jak wiemy, w sieci jest wiele koparek. Wszystkie kopią te same bloki (zestaw niezatwierdzonych jeszcze transakcji) i liczy się, który pierwszy wykopie dany blok. Wtedy idzie to do blockchaina. Równoczesne wykopanie bloku jest prawie niemożliwe, jednak może wystąpić. Kwestia przypadku.

Wygląda to tak, że każdy ma swoją kopię blockchaina. Mogą się one różnić ilością bloków, czasem ich wykopania itd. Zasada wygląda tak, że wybieramy najdłuższy blockchain.

Załóżmy, że pojawiły się trzy ‚wersje’ blockchaina.

Nasz blockchain ma 45 bloków.

Pierwsza wersja idzie do bloku 52.

Druga wersja idzie do bloku 54.

Blockchain zostanie zamieniony na wersję z 54 blokami. On jest najdłuższy, więc posiada najwięcej zatwierdzonych transakcji. Ta wersja zostanie rozesłana do reszty, a inne zostaną odrzucone.

Zamawiaj za darmo

Prowadzi to do pewnego niuansu. Jeśli jeden blockchain jest odrzucany a drugi akceptowany, to mogę wysłać dwie transakcje, gdzie jedna z nich zostanie odrzucona.

Tutaj powstaje mityczne 51% mocy obliczeniowej sieci. Mówi się że pozwala ona przejąć kontrolę. Wygląda to tak, że mamy ponad 51% szansy na wykopanie bloku przed innymi. W bitcoinie się już to zdarzyło i jedna z kopalni wykopała 6 bloków z rzędu. Dlatego obecnie dla pewności czeka się do 6 potwierdzeń, czyli musi być jeszcze 6 bloków nad naszym.

Ale co z tego?

Wyobraźmy sobie że posiadamy te 51% mocy. Jesteśmy w stanie wygenerować 6 bloków przed innymi. Robimy transakcję, która jest zatwierdzona w innych blockchainach i ma 4 potwierdzenia. Sprzedawca widzi, że transakcja otrzymała 4 potwierdzenia, więc wysyła nam towar. W tym momencie następuje zamiana na dłuższy blockchain z naszymi 6 blokami gdzie ta transakcja nie istnieje. Towar już jest wysłany, a transakcja znikła.

To jest chyba największy problem sieci blockchain. Świeżo wykopane bloki nie są jeszcze bezpieczne. Im więcej bloków pojawia się nad, tym bezpieczniejszy staje się blockchain.

Powyższa sytuacja jest prawie niemożliwa do wykonania dla pojedynczej osoby. Jednak ogromne kopalnie są w stanie tak zrobić. Na poziomie zwykłego użytkownika jest to w sumie niezauważalne. Im bardziej zdecentralizowana jest sieć i moc jest rozdzielona pomiędzy jak największą liczbę osób, tym bezpieczniej jest używać blockchain.

Tak więc, musimy pamiętać, żeby poczekać aż transakcja otrzyma odpowiednią ilość potwierdzeń.

Podsumowanie

Blockchain jest najbezpieczniejszym, publicznym miejscem do składowania wszystkich informacji. Jego matematyczne podstawy są niepodważalne na ten moment. Co jeśli powstanie sposób na złamanie tych funkcji matematycznych? Skończy się era blockchain? Nie, po prostu nastąpi zmiana algorytmów od pewnego bloku i będą tylko one używane.

Niedługo kolejny post. Przygotują prostą implementację kopania i portfeli do naszego blockchaina. Skoro omówiliśmy jaka jest idea, jak działa matematyka i jak się go zabezpiecza, mogę opowiedzieć Wam resztę. Nie wiem jeszcze czy w jednym poście zamknę portfele i kopanie. Prawdopodobnie rozłożę to na dwa osobne teksty, ze względu na ilość wiedzy, którą należy przyswoić.

Jeśli macie jakiekolwiek pytania, piszcie do mnie śmiało, tutaj albo na e-mail kontakt@patys.pl

Zapraszam też na facebook: https://www.facebook.com/patysblog Tam pojawiają się informacje związane z moją aktywnością.

Patryk Szczygło
Programista w Netguru. Bloger od 2017 roku. Miłośnik podróży, książek i elektroniki. Stworzył własny blockchain w JavaScript. Marzy o automatyzacji i robotyce w życiu.