Jeśli przyjrzymy się trendom z ostatnich kilku lat, to o blockchainie słyszeliśmy cały czas, ale niewiele o szczegółach.
Wszyscy zdajemy sobie sprawę, że kryptowaluty, takie jak Bitcoin, Ethereum, Dogecoin, Matic i inne, opierają się na technologii blockchain. Blockchain był liderem znaczących wydarzeń, które zrewolucjonizowały wiele branż w 2021 roku i utorowały drogę nowym osiągnięciom.
Blockchain to sposób przechowywania danych w sposób, który jest trudny lub niemożliwy do edycji, zhakowania lub oszustwa. Jest to cyfrowa księga transakcji, które są powielane i rozprowadzane w całej sieci systemów komputerowych łańcucha bloków.
Jest to przełomowa technologia baz danych, która napędza praktycznie wszystkie kryptowaluty. Blockchain sprawia, że niezwykle trudno jest zhakować lub oszukać system poprzez rozprzestrzenianie identycznych kopii bazy danych w całej sieci.
Chociaż Bitcoin jest obecnie najbardziej znanym zastosowaniem blockchain, technologia ta może służyć bardzo szerokiej gamie zastosowań.
Kryptowaluty i łańcuchy bloków cieszą się w ostatnich latach coraz większą popularnością i oczekuje się, że trend ten będzie się utrzymywał.
W tym samouczku stworzymy prosty łańcuch blokowy z JavaScriptem. Zapewni ci podstawowe zrozumienie działania łańcucha bloków.
Nazwijmy to MelodyCoin i od razu wkrocz do akcji!
Tworzenie Bloku
Na początek utworzymy nowy plik JavaScript, w którym umieścimy cały nasz kod.
Nazwijmy go main.js i zacznijmy od opisu jak powinien wyglądać blockchain i bloki.
Utwórz klasę Block i nadaj jej funkcję Object() { [kod natywny] } na początek.
Podczas tworzenia nowego bloku musisz podać datę i hash poprzedniego bloku:
Oto definicje każdej właściwości:
- Znacznik czasu wskazuje, kiedy blok został wykonany. Możesz użyć dowolnego wybranego formatu (w tym przypadku znacznika czasu UNIX).
- Dowolna forma danych, które chcesz połączyć z tym blokiem, może zostać uwzględniona w parametrze data. Jeśli chcesz stworzyć kryptowalutę, możesz przechowywać tutaj dane transakcji, takie jak nadawca/odbiorca i kwota przekazywanych pieniędzy.
- PoprzedniHash jest łańcuchem zawierającym hash poprzedniego bloku. To właśnie wygeneruje łańcuch bloków, który będzie miał kluczowe znaczenie dla późniejszego zapewnienia integralności naszego łańcucha bloków.
Tworzenie skrótów
Każdy blok łączy się z poprzednim blokiem (stąd właściwość previousHash). Oznacza to, że każdy blok wymaga skrótu. Hash jest podobny do odcisku palca. Jest odrębny dla każdego bloku.
Hash bloku można obliczyć, przepuszczając całą jego zawartość przez funkcję hashującą.
Zacznijmy więc od zaimplementowania funkcji, która oblicza skrót bieżącego bloku.
Tak więc w klasie Block definiujemy funkcję obliczeniowąHash:
Jednak skrót SHA256 nie jest obsługiwany przez JavaScript i musi zostać uzyskany z zewnętrznej biblioteki.
Crypto-js to fantastyczny pakiet, który zawiera bezpieczne implementacje kilku algorytmów mieszania.
Następnie możemy zaimportować go do naszego kodu main.js.
Teraz, gdy mamy już naszą funkcję obliczaniaHash(), użyjmy jej w funkcji naszego Bloku:
Po opisaniu, jak wygląda Blok, możemy zdefiniować, jak powinien wyglądać Blockchain. Stwórzmy więc nową klasę.
W tym scenariuszu łańcuch bloków jest bardzo prostym obiektem, który ma łańcuch właściwości. Jest to tablica zawierająca wszystkie bloki w łańcuchu.
Zanim będziemy mogli dodawać bloki, musimy najpierw utworzyć tak zwany „blok genezy”. Jest to pierwszy blok w łańcuchu i jest wyjątkowy, ponieważ nie może wskazywać na poprzedni blok (jest pierwszy!).
Tak więc, aby zbudować blok Genesis, dodam do naszej klasy funkcję o nazwie createGenesisBlock(). Z powrotem w funkcji Object() { [kod natywny] } naszej klasy Blockchain.
Możemy teraz dołączyć blok Genesis za każdym razem, gdy budujemy nową instancję Blockchain:
Metody Blockchain
Teraz dodajmy metody do naszej klasy Blockchain, które pozwolą nam robić takie rzeczy, jak dodawanie nowych bloków i pobieranie najnowszego bloku.
Funkcja getLatestBlock jest najbardziej podstawowa. Po prostu zwraca ostatni element tablicy łańcuchowej:
Technika addBlock jest nieco bardziej skomplikowana.
Zanim będziemy mogli dodać nowy blok do naszego łańcucha, musimy najpierw odpowiednio ustawić pole previousHash tego bloku.
Musi być ustawiony na hash ostatnio dodanego bloku do naszego łańcucha. Musimy również obliczyć hash nowego bloku:
Testowanie
Zobaczmy, jak wyszedł nasz MelodyCoin.
Utwórz instancję łańcucha bloków, aby to osiągnąć. Dodajmy jeszcze kilka bloków:
Zrobiliśmy tam dwa nowe bloki. Rzućmy okiem na to, jak obecnie wygląda nasz blockchain.
MelodyCoin zostanie uciągnięty i sformatowany z czterema spacjami:
Zweryfikuj integralność łańcucha bloków
Łańcuchy bloków są fantastyczne, ponieważ po dodaniu bloku nie można go modyfikować bez unieważnienia pozostałej części łańcucha.
Jednak nie ma dla mnie metody sprawdzenia integralności naszego łańcucha blokowego za pomocą tej implementacji.
Wprowadźmy funkcję isChainValid do naszego blockchaina. Jeśli łańcuch jest zgodny z prawem, zwróci wartość true; w przeciwnym razie zwróci fałsz:
Testowanie integralności
Możemy teraz przetestować integralność naszego łańcucha bloków. Jeśli wykonamy to teraz, potwierdzi to autentyczność naszego łańcucha.
Spróbujmy teraz manipulować naszym blockchainem. Zmodyfikujmy blok 2 i nadpiszmy jego zawartość (załóżmy, że przelaliśmy 100 monet zamiast czterech).
Kiedy to wykonamy, możemy zobaczyć, że oprogramowanie rozpoznaje nasz wysiłek majstrowania przy łańcuchu.
Możesz jednak uwierzyć, że istnieje inny sposób, aby mi w tym przeszkodzić. Zmieniłem zawartość bloku, ale nie przeliczyłem skrótu. Możesz więc spróbować być sprytny i ponownie obliczyć skrót tego samego bloku.
To wszystko, co było w naszej małej konfiguracji blockchain! Umożliwia nam dodawanie nowych bloków i wykrywanie manipulacji danymi w łańcuchu.
Istnieją dwa problemy z naszym małym łańcuchem bloków, którymi musimy się zająć:
- Nowoczesne komputery są niezwykle szybkie i potrafią dodać tysiące bloków do naszego łańcucha w kilka sekund. Oczywiście nie chcemy, aby ktokolwiek spamował nasz blockchain.
- Nasz blockchain jest nadal podatny na manipulacje. Możesz zaktualizować zawartość bloku, a następnie po prostu ponownie obliczyć skróty (i wcześniejsze skróty) dla wszystkich kolejnych bloków. Nawet jeśli z tym zadzierasz, skończysz z legalną siecią.
Aby rozwiązać te problemy, łańcuchy bloków wykorzystują technikę znaną jako „dowód pracy”. Musisz wykazać, że wykorzystałeś znaczną ilość zasobów obliczeniowych do utworzenia bloku przy użyciu tego podejścia. To też się nazywa górnictwo.
Dowód pracy wymaga, aby hash bloku zaczynał się od określonej liczby zer. Ale skąd możesz wiedzieć, czy twój hash pasuje do tej reguły?
Zawartość bloku określa jego hash. Tak więc zawsze uzyskujemy ten sam skrót, pod warunkiem, że nie modyfikujemy zawartości.
Każdy blok powinien mieć dodaną wartość nonce jako rozwiązanie. Zasadniczo są to losowe dane, które możemy aktualizować, dopóki skrót naszego bloku nie zacznie się od wystarczającej liczby zer. Ponieważ nie możesz zmienić danych wyjściowych funkcji skrótu, musisz przetestować wiele różnych kombinacji i mieć nadzieję na najlepsze.
Wprowadź Mining do Blockchain
Zacznijmy od włączenia nonce do naszej klasy Block. Nonce to pojedyncza wartość w naszym bloku, którą możemy zmodyfikować, aby wpłynąć na hash bloku.
Nie możemy zmienić znacznika czasu ani danych.
Następnie napiszmy funkcję mineBlock(), która wykona faktyczne wydobywanie bloku. Ta funkcja otrzyma wymaganą trudność jako parametr i będzie wykonywana, dopóki hasz naszego bloku nie rozpocznie się od wystarczającej liczby zer.
Właśnie stworzyłem podstawową pętlę while, która będzie działać, dopóki nasz skrót nie zacznie się od wystarczającej liczby zer. Używamy trudności do określenia, ile zer jest potrzebnych. Przy trudności 5 nasz hash musi zaczynać się od 5 zer.
Kiedy nasz hash nie zawiera wystarczającej liczby zer, podnosimy wartość nonce o jeden i ponownie obliczamy hash. A jeśli znajdziemy hash, który odpowiada trudności, logujemy go do konsoli.
Jest jeszcze jedna rzecz, którą musimy zrobić. Tak naprawdę nie bierzemy pod uwagę zmiennej nonce w naszej metodzie obliczeniowej, więc oto ona:
Klasa Blockchain
Przetestujmy to nowe podejście na naszej klasie blockchain i zobaczmy, jak to idzie.
Na początek zdefiniuję trudność naszego blockchaina w funkcji Object(). Definiujemy go tutaj, ponieważ możemy go użyć gdzieś później.
Następnie należy zmodyfikować funkcję addBlock w taki sposób, aby wydobywała blok przed dodaniem go do naszego łańcucha.
Użyj łańcucha bloków
Teraz użyjmy naszego nowego blockchaina z algorytmem proof-of-work. Tutaj dodaj kilka instrukcji console.log.
Kiedy wykonujemy ten kod, możemy zauważyć, że proces wydobywania nie jest już szczególnie szybki.
Algorytm zajmuje trochę czasu, aby wygenerować bloki z haszami, które zaczynają się od trzech zer (zgodnie z konfiguracją trudności).
To był koniec naszej podstawowej konfiguracji łańcucha bloków.
Możemy regulować, jak szybko nowe bloki są dodawane do naszego łańcucha bloków dzięki mechanizmowi proof-of-work.
Jest to najważniejsza funkcja bezpieczeństwa w łańcuchach bloków. A teraz, gdy już rozumiesz, jak to działa, zacznij tworzyć własne!
Dodaj komentarz