Kryptointeligencja – Sprawdzamy możliwości inteligentnych kontraktów w walucie Ethereum

System kryptowaluty Ethereum pozwala tworzyć w blockchainie programy zarządzające skomplikowanymi transakcjami i dokumentujące wyniki. Pokażemy, jak zacząć pracę z inteligentnymi kontraktami Ethereum.

W ostatnich latach wokół cyfrowych walut narobiło się sporo hałasu. Zaczęło się od tego, że tajemniczy twórca najsłynniejszej z nich, bitcoina, wpadł na pomysł, że jest to dobry sposób na przechowywanie wartości, podobnie jak złoto. Dlatego bitcoin został zaprojektowany jedynie do handlu i przechowywania wartości.

Kiedy Vitalik Buterin wraz z kilkoma innymi osobami zaprojektowali pierwszą wersję Ethereum [1], chcieli rozszerzyć koncepcję blockchaina, tak aby obejmowała inne rodzaje transakcji. Ethereum opiera się na pomyśle inteligentnych kontraktów. Inteligentny kontrakt to program zagnieżdżony w blockchainie, który automatycznie zarządza, kontroluje i dokumentuje akcje podejmowane w określonym wcześniej celu. Inteligentny kontrakt pozwala twórcy na zaimplementowanie kontraktu lub zgody bez potrzeby tradycyjnego nadzoru i egzekucji.

Uważa się, że bitcoin posiada podstawowe wsparcie dla inteligentnych kontraktów w kontekście swojej roli cyfrowej waluty, przez co może wspierać funkcje, takie jak deponowanie i konta potwierdzane wieloma podpisami, ale Ethereum rozszerza tę koncepcję o wsparcie dla dużo szerszego zakresu transakcji i umów. Przykładowo Ethereum było pierwszą technologią blockchain wspierającą NFT (non-fungible token) [2] i w dalszym ciągu jest najpopularniejszym narzędziem do tworzenia NFT.

Możliwości inteligentnych kontraktów sprawiają, że Ethereum jest idealnym kandydatem do wsparcia zdecentralizowanych autonomicznych organizacji (DAOs), ubezpieczeń opartych na blockchainie i innych systemów wymagających fizycznej weryfikacji.

Blockchain Ethereum

Reguły blockchaina są takie same dla wszystkich kryptowalut. Jeśli spędziliście więcej niż kilka godzina na programowaniu, to wiecie, czym są listy wiązane. Polega to na tym, że pierwszy element wskazuje na kolejny, tworząc listę, która rozrasta się w miarę naszych potrzeb.

W przypadku blockchaina każdy może pobrać listę i dodać do niej element. Jak jednak upewnić się, że najnowszy blok jest prawidłowy? Skąd wiemy, że ludzie, których nie znamy, nie zmienili wcześniejszych bloków? Blockchain musi być odporny na manipulacje.

Rysunek 1: Przykładowy kod z samouczka Merkle-Patricia.
Rysunek 2: Korzystając pod Linuksem z Exodusa, otrzymujemy kod QR, za pomocą którego ludzie mogą przelewać nam fundusze.

Aby to zapewnić, każdy blok po pierwszym wskazuje do tyłu z wykorzystaniem kryptograficznej funkcji skrótu. Funkcja ta jest uzależniona od zawartości poprzednich bloków. To nie wszystko, gdyż wszystkie wartości funkcji skrótu bloków zależne są od poprzednich bloków, aż do pierwszego z nich. Pierwszy blok nazywany jest blokiem genesis, a pełny system to struktura, którą nazywa się drzewem Merkle Patricia.

Zaraz, to w takich wypadku mamy tu drzewo czy listę? Prawdę mówiąc, trochę z obu. Jeśli blockchain byłby zwykłą listą wiązaną, to każda weryfikacja musiałaby przechodzić przez całą listę. Cała EVM (Ethereum Virtual Machine) byłaby zajęta i nikt nie byłby w stanie określić stanu systemu.

W rzeczywistości cały system Ethereum jest maszyną o jednym stanie. Maszyna stanów to konstrukcja, która zmienia swój stan w zależności od wejścia. W tym wypadku na wejściu mamy każdą transakcję wykonywaną w EVM. Brzmi to dziwnie, ale stan to nie jest pojedyncza wartość, jak w prostych aplikacjach. Zamiast tego, stan ma wiele ciągle zmieniających się wartości i przedstawiany jest w formie drzewa.

Ethereum posiada trzy drzewa, które możemy przeglądać, aby zweryfikować dowolną akcję na liście wiązanej. Drzewa te, czyli state, transactions i receipts, sprawdzają prawa własności, jak też same siebie. Dzięki temu, że drzewa są rozdzielone, dużo łatwiej jest skorzystać z małej części listy do zweryfikowania, czy wszystko jest w porządku.

Każde drzewo posiada korzenie, czyli stateRoot, transactionsRoot i receiptsRoot. Ich wartości znajdują się w nagłówku każdego bloku w blokchainie Ethereum. Dzięki temu klient może zweryfikować wszystkie drzewa bez odpytywania całych drzew. Przycięte drzewo zajmuje około 1.2 TB, a pełne to 6 TB. Jak widać, nie łatwo jest mieć pełny węzeł listy.

Kiedy chcemy wykorzystać nasz eter (ETH – kryptowaluta używana z Ethereum) lub zweryfikować cokolwiek w blokchainie Ethereum, potrzebujemy klienta. Pełny klient z pełnym węzłem listy wymaga zbyt wiele przestrzeni dyskowej jak na możliwości większości systemów. Lekki węzeł wymaga tylko niewielkiego fragmentu drzewa i pozwala na wykonywanie zaawansowanych zapytań na drzewie. Z jego pomocą możemy weryfikować swoje konto, sprawdzać istnienie inne konta i uruchamiać testowe kontrakty. Testowanie odgrywa ważną rolę, gdyż pozwala nauczyć się, jak unikać fałszywych kontraktów.

Drzewa posiadają zróżnicowane funkcje i potrzebujemy ich do różnych zdań. Klient opiera się na drzewie state, w którym sprawdza elementy związane z kontem i testuje kontrakty.

Drzewo transactions często jest aktualizowane, ale nigdy nie jest edytowane. Z kolei drzewo state zmienia się dosyć często, ponieważ zawiera wszystkie konta i ich salda.

Drzewo receipts przechowuje jedynie efekty działania transakcji, więc również jest aktualizowane, ale nie edytowane. Więcej na temat obsługi drzew Merkle-Patricia znajdziemy w samouczku dostępnym online [3]. Możemy pobrać z niego kod i pobawić się nim samemu. Pierwszy przykład, widoczny na Rysunku 1, pokazuje, jak zainicjować drzewo.

Transakcje

Najprostszą transakcją jest przelanie do kogoś jakiejś sumy. Możemy spróbować wykonać płatność pomiędzy własnymi kontami lub, co lepsze, w sieci testowej testnet. Każda transakcja kosztuje tyle samo gwei (gwei to najmniejsza jednostka waluty Ethereum, równa jednej miliardowej eteru). Rzeczywisty koszt zależny jest od ceny gazu. Zgodnie z Wikipedią, „tworząc transakcję, wysyłający musi określić wartości limitu gazu i ceny gazu. Limit gazu to maksymalna wartość gazu, którą wysyłający chce wykorzystać w transakcji, a cena gazu, to ilość eteru, którą wysyłający chce zapłacić górnikowi za jednostkę wykorzystywanego gazu”.

Portfele standardowo ustalają cenę gazu automatycznie w jednostce gwei. Kiedy wykonujemy bardziej zaawansowane transakcje, możemy zwiększyć cenę gazu, aby zachęcić górników do wykonania naszego zlecenia w pierwszej kolejności.

Większość ludzi wykorzystuje do transakcji wtyczki do przeglądarek. MetaMask do doskonały, powszechnie stosowany klient Ethereum. Z poziomu portfela MetaMask możemy wysyłać, a czasami i wybierać samemu cenę gazu. MetaMask potrafi też przyspieszyć oczekujące transakcje. Możemy też prosić o fundusze, udostępniając nasz publiczny adres.

W przypadku pulpitu Linuksa dostępne są portfele Jaxx, Exodus (Rysunek 2) i MyCrypto. Posiadają one więcej funkcji i wymyślne interfejsy, na przykład z wykresami transakcji. Co ważniejsze, możemy mieć portfele z różnymi blockchainami, nie tylko Ethereum. Zauważmy też, że transakcja odbywa się, kiedy tworzony jest kontrakt i podczas wykonywania kontraktów.

Inteligentne kontrakty

Zgodnie ze stroną Ethereum, „Inteligentny kontrakt to po prostu program, który działa w blokchainie Ethereum. Jest to połączenie kodu (jego funkcji) i danych (ich stanu), które przechowywane jest na konkretnym adresie blockchainu Ethereum”.

Inteligentne kontrakty mogą rozwiązywać wiele problemów. Potrafią realizować tak różne zadania, jak tworzenie nowych walut i ułatwianie zbierania funduszy. System BAT (Basic Attention Token), wykorzystywany przez dostawców cyfrowych reklam do śledzenia czasu przyciągania uwagi użytkowników, to przykład technologii opartej na blockchainie Ethereum, który pokazuje moc inteligentnych kontraktów.

Dokumentacja Ethereum kontynuuje wyjaśnienia: „Inteligentne kontrakty są rodzajem kont Ethereum. Oznacza to, że posiadają saldo i mogą realizować transakcje w sieci. Nie są jednak kontrolowane przez użytkownika. Zamiast tego są rozmieszczane w sieci i uruchamiają się zgodnie z tym, jak zostały zaprogramowane. Konta użytkowników mogą oddziaływać z inteligentnymi kontraktami przez zatwierdzanie transakcji wykonujących funkcje zdefiniowane w tych kontraktach. Inteligentne kontrakty mogą definiować reguły tak jak standardowe kontrakty i automatycznie wymuszać przestrzeganie ich poprzez kod. Nie mogą być domyślnie kasowane, a interakcje z nimi są nieodwracalne”.

Rysunek 3: Kiedy pytacie o tokeny do testnetu, spróbujcie robić to w środy. Ikona z niskim naładowaniem baterii oznacza, że jest zbyt duży ruch, aby wydawać ich więcej.
Rysunek 4: Po prawej widzimy kod źródłowy w Solidity służący do importowania Zeppelina, frameworku do standardów.

W przypadku Ethereum inteligentne kontrakty to specjalne konta, które najpierw muszą być utworzone (wybite) przez konta użytkowników. Twórca kontraktu powinien stworzyć kod i musi posiadać konto oraz walutę (eter). Kiedy tworzy kontrakt, kod może utworzyć wartości, które po przejściu do blockchaina stają się niezmienne.

Po umieszczeniu kontraktu na liście wiązanej każdy użytkownik, ponosząc odpowiedni koszt, może go wywołać. Koszt różni się w zależności od kontraktu. Inteligentny kontrakt może być też aukcją NFT.

Możemy wyobrazić sobie program, który będzie realizował aukcję. Będziemy otrzymywać i akceptować oferty. Następnie, we wcześniej zdefiniowanym punkcie, program wybierze najwyższą z nich, ustalając zwycięzcę. W tym momencie wszystkie przegrane oferty wrócą do licytujących. Program przeleje fundusze do odpowiednich użytkowników. Ten typ aukcji może być zagnieżdżony bezpośrednio w blockchainie z wykorzystaniem inteligentnych kontraktów.

Deweloper musi napisać kod dla kontraktu, przetestować go, a następnie umieścić w blockchainie. Społeczność Ethereum posiada wyspecjalizowane narzędzia do kodowania i wydawania inteligentnych kontraktów. Programiści mają też dostęp do środowiska testowego testnet, które działa jak podstawowy blockchain Ethereum poza tym, że nie ma wartości (tokeny do testnetu dostępne są online [4]). Korzystając z testnetu, możemy też nabrać doświadczenia z używaniem regularnych transakcji (Rysunek 3).

Język Solidity

Inteligentne kontrakty możemy tworzyć w wielu językach, ale najpopularniejszy to Solidity [5]. Wygląda on i zachowuje się z grubsza jak język C, gdyż posiada konstruktory, funkcje i musimy w nim określać typy zmiennych.

Każda instancja jest kontraktem i każdy kontrakt może posiadać jeden jedyny konstruktor. Funkcje i wartości posiadają ustawienia widoczności, które mówią kompilatorowi, jakie inne funkcje mogą z nich korzystać. Przykładowo, ustawienie public sprawia, że funkcja jest dostępna dla każdej innej w całym blockchainie. Jak widać na Rysunku 4, Solidity pozwala też importować frameworki. Rozwijane są też inne języki, ale Solidity to dobry wybór na początek, jeśli chcemy pouczyć się o programowaniu inteligentnych kontraktów.

Środowiska deweloperskie

Aby naprawdę zacząć, potrzebujemy środowiska deweloperskiego. Dobrym wyborem jest Cakeshop. Cakeshop IDE zachowuje się jak demon, uruchamiając lokalną listę wiązaną, z którą możemy robić co nam się podoba (patrz ramka „Konfiguracja Cakeshopa”). Możemy też umieścić w lokalnej sieci tak wiele węzłów, jak potrzebujemy. Za pomocą interfejsu odnajdziemy podstawowe rzeczy, jakich potrzebujemy do interakcji z blockchainem. Możemy tworzyć konta i wysyłać fundusze w obie strony na testowej liście wiązanej. Następnie warto sprawdzić funkcję przeglądania listy wiązanej, za pomocą której sprawdzimy, jak działa transakcja. Dostępna jest piaskownica, w której umieścimy swoje kontrakty i przetestujemy wszystkie funkcje.

Łatwiejszym sposobem na zapoznanie się z tą technologią może być dostępny online Remix IDE [8]. Remix umożliwia ładowanie plików z lokalnego dysku czy nawet z GitHuba. Posiada funkcje podobne do Cakeshopa, a dodatkowo wspiera wtyczki. Podstawową wtyczką jest Solidity, która daje pełne wsparcie dla tego języka.

Remix posiada wiele innych wtyczek, wliczając w to samouczki, narzędzia weryfikujące i przykładowy kod. Kod ten obejmuje różne rozwiązania, od najprostszych sposobów przechowywania po aplikacje rozproszone. Dla bardziej zaawansowanych dostępne są usługi sięgające po zewnętrzne informacje (zwane oracles).


Rysunek 5: Dane zwracane przez Cakeshop w terminalu: lew z tortem oznacza, że możemy sprawdzić adres, na który przejdziemy w przeglądarce.

Rysunek 7 przedstawia Remix IDE. Po lewej możemy wybrać przeglądarkę plików, kompilator i pluginy, jakie chcemy dołączyć. Po prawej widoczny jest kod i konsola.

Prosty kontrakt

Niektóre podstawowe kontrakty widoczne są w domyślnym widoku Remixa. Listing 1 pokazuje przykład zastosowania podstawowej składni.

Kod ten zawiera jedynie proste wywołania funkcji i brak tu konstruktora, ale jest to doskonały sposób na zrozumienie, czego potrzebujemy, aby całość działała. Górny wiersz nie jest potrzebny, ale wiele kompilatorów będzie narzekać na jego brak. Drugi wiersz wskazuje, z jakiego kompilatora należy korzystać.

Listing 1 posiada jedną funkcję kontraktu, Storage. Cały kod umieszczony został w tej funkcji. Pierwsza funkcja zachowuje wartość number, a druga ją odczytuje.

Nadchodzi ETH2

Ethereum będzie wkrótce aktualizowane do wersji 2.0. Największą zmianą jest przejście z algorytmu Proof of Work na Proof of Stake. Dzięki temu będzie można korzystać z niewielkich komputerów w roli węzłów, co pomoże sieci weryfikować bloki. Wcześniej, aby przeprowadzić weryfikację i otrzymać za to nagrodę potrzebowaliśmy potężnej maszyny.

Dla mniejszych graczy na rynku brzmi to świetnie, ale w tej chwili, aby dołączyć węzeł, trzeba posiadać 32 jednostki eteru. Jest to rodzaj zastawu. Przy dobrym zachowaniu zwiększy się on w ramach nagrody. Jeśli będziemy się zachowywać nieprawidłowo, zostaniemy ukarani utratą funduszy. System ten ma sprawić, że nikt nie będzie próbował tworzyć fałszywych bloków i niszczyć konsensusu.

Rysunek 6: W piaskownicy możemy tworzyć kod i testować, co się stanie, kiedy skorzystamy z danej funkcji.

Konfiguracja Cakeshopa

Twórcy Cakeshopa zdecydowali się napisać go w Javie. Dostępny jest na GitHubie [6], gdzie znajdziemy plik .war oraz kod źródłowy. Korzystając z tego pliku binarnego, możemy w prosty sposób uruchomić program, chociaż musimy zdefiniować węzły. Jeśli chcemy zobaczyć, jak działa Cakeshop, możemy skorzystać z pakietu snap. Niestety jest on w wersji 0.10.0, więc po zapoznaniu się z konfiguracją węzłów warto zainstalować nowsze wydanie. Pakiet snap posiada zdefiniowane węzły i dlatego uruchamia się pojedynczym poleceniem.

$ sudo snap install cakeshop

Czekamy na zakończenie instalacji i wydajemy następujące polecenie:

$ cakeshop

Teraz musimy sprawdzić adres, na którym dostępny jest interfejs webowy. Zwykle to będzie http://172.17.0.1:8080/cakeshop/, ale warto go zweryfikować, aby mieć pewność (Rysunek 5).

Więcej opcji instalacji znajdziemy na stronie domowej Cakeshop [7]. Opisuje ona różne sposoby na uruchomienie instancji Dockera.

Kiedy już wszystko zainstalujemy, możemy obejrzeć poszczególne elementy blokchaina, a nawet wchodzić w interakcje z listą wiązaną. To nasz własny blockchain, a nie publiczny! Za pomocą przeglądarki bloków możemy sprawdzić, co zmieniają nasze akcje. Posiadamy też nielimitowane fundusze. Rysunek 6 pokazuje, jak wygląda piaskownica.

Wnioski

Ethereum staje się potężną siłą w dziedzinie finansów i technologii. Jeśli będziemy w stanie korzystać z różnych portfeli i usług, łatwiej będzie nam obsłużyć własne finanse, a może nawet publikować własną sztukę.

Powinienem dodać, że siła Ethereum pochodzi z potrzeby ostrożności. Inteligentne kontrakty są widoczne w blockchainie i błąd lub dziura w bezpieczeństwie w kodzie może prowadzić do powstania podatności. W 2016 roku zrealizowano atak, gdzie prawie 50 milionów w eterze zostało przejęte z kont Ethereum, jednak deweloperzy byli w stanie odzyskać te pieniądze dzięki odgałęzieniu blockchaina Ethereum. Od tego czasu powstało kilka aktualizacji, które zwiększyły bezpieczeństwo, ale pamiętajmy o potrzebie dogłębnego testowania kodu i korzystaniu z bezpiecznych technik programowania.

Rysunek 7: Remix IDE: powyższy przykładowy kod wdraża komponenty Web3.
Listing 1: Inteligentny kontrakt

01 // SPDX-License-Identifier: GPL-3.0

02

03 pragma solidity >=0.7.0 <0.9.0;

04

05 /**

06  * @title Przechowywanie

07  * @dev Zachowaj i odzyskaj wartość za pomocą zmiennej

08  */

09

10

11

12 contract Storage {

13

14     uint256 number;

15

16     /**

17      * @dev Przechowaj wartość w zmiennej

18      * @param zachowaj wartość num

19      */

20     function store(uint256 num) public {

21         number = num;

22     }

23

24     /**

25      * @dev Zwróć wartość

26      * @return wartość to 'number'

27      */

28     function retrieve() public view returns (uint256){

29         return number;

30     }

31 }

Web 3.0 oparte będzie na cyfrowych walutach i otaczających je technologiach. Miejmy nadzieję, że Ethereum, dla większości użytkowników, przełoży się na lepsze doświadczenia i pomoże zbalansować moc drzemiącą w tym rozwiązaniu. 

Autor: Mats Tage Axelsson ustawił kilka różnych trybów i do tej pory nie odnalazł skrótu klawiszowego, który by je zmienił.

Żródła:

[1] Ethereum: https://ethereum.org/

[2] NFT: https://pl.wikipedia.org/wiki/Niewymienialny_token

[3] Drzewo Merkle Patricia w Ethereum: https://rockwaterweb.com/ethereum-merkle-patricia-trees-javascript-tutorial/

[4] Ethereum Ropsten Testnet Faucet: https://testnet.help/en/ethfaucet/ropsten

[5] Solidity: https://docs.soliditylang.org/en/v0.8.11/

[6] Cakeshop na GitHubie: https://github.com/ConsenSys/cakeshop/releases

[7] Strona domowa Cakeshop: https://opensourcelibs.com/lib/cakeshop

[8] Remix IDE: https://remix.ethereum.org/

Podziel się postem :)

Najnowsze:

Bezpieczeństwo

Ostrzeżenie CSIRT KNF. Uważaj, jeśli odwiedzałeś takie strony

CSIRT KNF zwraca uwagę, że tylko w marcu odebrano zgłoszenia ponad 6 tysięcy domen związanych z fałszywymi serwisami w sieci. Były wykorzystywane zwłaszcza na potrzeby oszustw dotyczących usług kurierskich, inwestycji czy mediów społecznościowych.

Oprogramowanie

Firefox 125 już dostępny. Autorzy zapowiadają 25% wzrost wydajności

Mozilla wypuściła aktualizację Firefox 125.0.1. Główne zmiany dotyczą zakreślania w przeglądarce PDF, kodeka AV1, kart w Firefox View, blokowania potencjalnie niezaufanych pobrań, sugestii wklejania URL, kontenerów kart i włączania WPAD. Nie zabrakło też innych, drobnych zmian i poprawek.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *