13

Smart contracts – czym są i jak je stworzyć?

Smart contracts, czyli tzw. inteligentne kontrakty, to cyfrowe umowy funkcjonujące w formie samoobsługowych aplikacji. Brzmi abstrakcyjnie? Postaramy się zatem nieco ten temat przybliżyć oraz pokazać, jak stworzyć inteligentną umowę we własnym zakresie.

Smart kontrakty to nic innego jak inteligentne umowy, wyrażone w formie aplikacji. Do powszechnego obiegu zostały wprowadzone dzięki Ethereum, ale warto wspomnieć, że już Bitcoin umożliwiał przeprowadzanie pierwszych prostych transakcji, które pozwalały na przesyłanie danych pomiędzy użytkownikami tej kryptowaluty.

Jak wspominaliśmy w naszym ostatnim artykule na temat Ethereum, Bitcoin, ze względu na swoje ograniczenia, niestety nie pozwala na tworzenie bardziej zaawansowanych rozwiązań tego typu. Tutaj właśnie z odsieczą wkracza druga pod względem popularności kryptowaluta, która oferuje o wiele więcej, aniżeli coiny. Ethereum to bowiem cała platforma deweloperska, której struktura daje możliwość tworzenia zdecentralizowanych, rozproszonych aplikacji, a także o wiele bardziej zaawansowanych smart kontraktów, aniżeli w przypadku Bitcoina.

Czym jest i jak działa smart contract?

Inteligentne umowy to swego rodzaju aplikacje, które po spełnieniu ściśle określonych warunków pozwalają na wykonanie kodu przy użyciu EVM (Ethereum Virtual Machine) i zwrócenie oczekiwanych rezultatów. Aby lepiej to zobrazować, posłużmy się jednym z prostych przykładów (który przytoczyliśmy już wcześniej na łamach Antywebu w tekście o blockchanie):

Smart kontrakty działają w oparciu o prostą zasadę: “jeśli zdarzy się X, wykonaj Y”. Odnosząc tę zasadę do sytuacji, jaka może spotkać nas w codziennym życiu, przypuśćmy:

Kupujesz mieszkanie. Korzystając ze smart kontraktu, w chwili dokonania zapłaty za mieszkanie, automatycznie dokonuje się stosowny wpis zmieniający własność nieruchomości w “wirtualnej księdze wieczystej” (czyli np. zostaje to odnotowane w konkretnej transakcji na rejestrze przechowywanym w blockchainie), a ty w tym samym czasie dostajesz kod dostępu do mieszkania i bez załatwiania zbędnych formalności w jakichkolwiek urzędach, możesz się wprowadzić. Simple as that ;)

Jak zatem widzicie (w sporym uproszczeniu), smart kontrakty to aplikacje, które mogą mieć taką samą moc sprawczą, jak tradycyjne umowy prawne. Mają jednak tę ogromną przewagę, że są o wiele szybciej weryfikowane, dzięki czemu oszczędzamy mnóstwo czasu, wysiłku i formalności, a przede wszystkim – pomijamy cały proces biurokracji.

Smart kontrakty działają podobnie jak zwykłe umowy. Pierwszym krokiem prowadzącym do ich powstania jest ustalenie między stronami konkretnych warunków takiej umowy (“jeśli zdarzy się X, wykonaj Y”). Następnie warunki kontraktu są spisywane – z tym, że nie w formie tradycyjnej, lecz w aplikacji działającej na blockchainie. Szczegółowy sposób wykonywania kontraktów opiszemy natomiast w dalszej części tego artykułu.

Gdzie można wykorzystać smart kontrakty?

Czasy, w których w pełni będziemy mogli korzystać z tego, co mają nam do zaoferowania smart kontrakty, z pewnością dopiero przed nami. Jak na razie wkraczają one w naszą rzeczywistość stosunkowo powoli, głównie ze względu na konieczność dostosowania lub modyfikacji wielu norm prawnych czy systemów. Ponadto, inteligentne kontrakty w powszechnej świadomości ciągle jeszcze bardziej kojarzą się społeczeństwu z tematem “podejrzanych kryptowalut”, aniżeli z sektorem FinTech. Mimo to, bez trudu można znaleźć sporo miejsc, w których smart kontrakty sprawdzą się doskonale.

Nad jednym z zastosowań smart kontraktów pochylił się obecny gigant szwajcarskiego sektora bankowego UBS (wraz z Barclays Credit Suisse, HBC, SIX i Thomson Reuters). Mowa o platformie Madrec (Massive Autonomous Distributed Reconciliation), która (w sporym uproszczeniu) ma na celu ułatwienie bankom analizy ogromnego zakresu danych na temat kontrahentów i potencjalnego ryzyka kredytowego.

Smart kontrakty mogą być oczywiście wykorzystywane także na wielu innych polach, np. w:

  • walce z podróbkami czy handlem skradzionymi dobrami cyfrowymi (Alibaba)
  • celach podatkowych (VATcoin)
  • ochronie zdrowia (Roche Group, MediLedger Project)
  • płatnościach w e-commerce (no, może niekoniecznie w Bitcoinach… ;))
  • automatyzacji zamówień (jeśli klient X wybierze samochód Y i zapłaci Z, zmień właściciela samochodu Y na X, zapisz w BC i prześlij info do Urzędu Komunikacji(?))
  • sektorze nieruchomości (przykład zakupu nieruchomości podany powyżej)

Jak stworzyć smart contract?

Jak dotąd nasze artykuły gościnne na Antywebie tworzone był z myślą o osobach, które nie są deweloperami i szukają prostych wyjaśnień popularnych obecnie tematów, związanych z kryptowalutami i blockchainem. Staraliśmy się ubierać omawiane tematy w język nietechniczny i łatwo przyswajalny dla osób, które na co dzień nie pracują z kodem. Ten artykuł jednak nieco odbiega od naszych założeń, gdyż korzystając z okazji do rozwinięcia tematu smart kontraktów, chcemy Wam także pokazać, jak w prosty sposób taką inteligentną umowę stworzyć. Niech nie zdziwi Was zatem fragment kodu, jaki znajdziecie poniżej :) A zatem… do dzieła!

W tej części tekstu dowiecie się m. in.

  • Jak wygląda smart contract
  • Jak wgrać smart contract do sieci
  • Jak wywołać wgrany kod aplikacji, aby otrzymać oczekiwany rezultat

Smart Kontrakt – jaka wiedza będzie Wam potrzebna na początku?

Zanim rozpoczniemy tworzenie przykładowych smart kontraktów, określmy sobie jaka wiedza jest wymagana do tego typu zabaw.

Zagłębiając się w świat kryptowalut i smart kontraktów dobrze, abyście znali:

  • Javascript
  • Linux i Command Line Interface
  • Język programowania: Solidity
  • Sposób działania sieci Ethereum

Narzędzia, które będą potrzebne:

Kompilator solidity (solcjs)
Klient Ethereum: geth
Edytor tekstowy

Remix

Co do edytora, najlepszą opcją będzie wykorzystanie webowego IDE o nazwie Remix. Remix to narzędzie, które pozwala na pisanie inteligentnych kontraktów przy pomocy przeglądarki. Umożliwia także skompilowanie ich, oraz wrzucenie do sieci. Remix wspiera również wirtualną maszynę JavaScript, która pozwala na symulację uruchomienia i wgrania kontraktu do sieci. Następnie można wszystkie funkcję przetestować.

Jest to dobre rozwiązanie dla osób, które chcą przetestować smart kontrakty i nauczyć się ich tworzenia, ale pamiętajcie o jednym! Remix nie odzwierciedla pełnej sieci (ani czasu oczekiwania na wykopanie bloku).

Klient Ethereum

Ethereum posiada kilku klientów, jak m. in. Geth. Głównymi alternatywami do Geth są Parity, oraz klient Cpp Ethereum. Dla końcowych użytkowników Parity może okazać się lepsze (a przede wszystkim wygodniejsze w użyciu), głównie dlatego, że dostarcza w całości interfejs webowy, który możemy spokojnie uruchomić w naszej przeglądarce.

Sieć prywatna

Aby uruchomić naszą pierwszą sieć prywatną, potrzebujemy jednego lub kilku klientów, którzy będą potwierdzać nasze bloki. Sieć Ethereum jest siecią typu Peer to peer (P2P), dlatego dobrze jest uruchomić na początek minimalnie 3 instancje (lub więcej).

Konfiguracja sieci prywatnej

Sieć blockchain w naszym przypadku posiada definicje reguł dla bloku startowego – zwanego także blokiem genesis. Dla sieci Ethereum taka definicja zapisana jest w pliku genesis.json (w przypadku klienta geth). Plik ten wygląda mniej w przybliżeniu tak, jak ten przedstawiony poniżej:

smart contracts sieć prywatna

Plik ten definiuje przede wszystkim numer sieci. Sieć główna (mainnet) posiada numer 1. Następnie w bloku zawierane są informacje na temat zmian w protokole, oraz numer bloku, w którym dana zmiana następuje. Dodatkowo zawiera początkową trudność sieci* oraz alokację balansów startowych dla danych adresów.

* Czym jest trudność sieci?

Przypomnijmy, że wykopanie bloku w sieci Ethereum trwa średnio 15 sekund. Trudność sieci zapewnia, by ten średni czas był zachowany. Początkowo możemy ustawić niską wartość, ponieważ w trakcie działania i aktywności “górników” trudność zostanie dostosowana do tego, jaką szybkość urządzenia włączymy – tak by blok był wykopywany średnio co ustalone 15 sekund.

Jak uruchomić sieć prywatną?

Jak wspomniano wyżej, do uruchomienia sieci będzie potrzebny klient. W naszym przypadku będzie to geth. Klient ten może zostać pobrany bezpośrednio ze strony: Geth & Tools

Aby uruchomić naszą sieć, musimy wygenerować identyfikator klienta w sieci P2P. Do tego celu używamy narzędzia bootnode:

./bootnode --genkey node.key

Następnie generujemy swój portfel, którego będziemy używać do przeprowadzania transakcji.

./geth --datadir=./ethereum account new

Oczywiście najpierw możemy wygenerować konto i do danego adresu przypisać odpowiednią kwotę przyznaną na starcie. Jeżeli tego nie zrobimy, będziemy musieli rozpocząć proces kopania, by uzyskać środki (pochodzące z nagrody za znalezienie bloku).

Kolejnym krokiem będzie inicjalizacja sieci

./geth --datadir=./ethereum --networkid 2456 --nodekey node.key init genesis.json

oraz jej uruchomienie (bez końcówki init genesis.json)

./geth –datadir=./ethereum –networkid 2456 –nodekey node.key –mine –minerthreads 1

Smart Kontrakt – kod
Gdy nasza sieć prywatna jest już gotowa, następnym krokiem będzie stworzenie Smart Kontraktu. Najprostszym przykładem będzie kontrakt, który zwróci nam “Hello World”. Aby wykonać tę operację, musimy napisać kontrakt oraz go skompilować.

Po kompilacji wgrywamy go do sieci. Tworzy ona kod binarny oraz opis aplikacji (ABI – Application Binary Interface). ABI jest wymagane do wykonania operacji na naszym Smart Kontrakcie. Przykładowy kod kontraktu będzie następujący:

Hello.sol:

Kompilacja kodu – jak ją wykonać?

By wykonać kompilację, musimy zainstalować kompilator:

npm install -g solc

A następnie wygenerować kod binarny oraz interfejs binarny (ABI):

solcjs Hello.sol --bin
solcjs Hello.sol --abi

Wgranie kontraktu do sieci
Kolejnym krokiem jest wgranie naszego skompilowanego kontraktu do sieci. By to zrobić potrzebujemy mały kod JavaScript, w którym zdefiniujemy nasz interfejs binarny oraz kod binarny (w miejscu z prefiksem 0x).

Deploy.js:

Na początku definiujemy nasz tekst, który będzie od razu zapisany w sieci podczas wysyłania kontraktu do sieci. Funkcja showText() po wykonaniu powinna zwrócić wyżej zdefiniowany tekst Hello World.

Powyższy skrypt musimy wykonać przy pomocy konsoli geth. Aby to zrobić, musimy połączyć się z klientem wykonując:

./geth attach --datadir=./ethereum.

Następnie w konsoli klienta uruchamiamy poniższe polecenie:

loadScript("deploy.js")

Uwaga! Jeżeli stworzyliśmy konto z hasłem, wcześniej musimy je odblokować – używając do tego polecenia: personal.unlockAccount(eth.coinbase, ‚12345678’, 0) – gdzie 12345678 to przykładowe hasło. Ostatni parametr oznacza, że chcemy odblokować nasze konto na czas nieokreślony. Oczywiście można tam podać inną wartość :)

Po chwili klient powinien wyświetlić komunikat o tym, że nasz kontrakt został wykopany i podać nam jego adres:

Contract mined! address: 0x1fbc3e8b42f9b9ea7ca3df8057f47c2d58226e00

oraz numer transakcji w której kontrakt został wykopany:

transactionHash:

0x9726dc4ffece040e1e9eeeea77b43cc419139c722ea7ebabf4e991b817549384

Wykonanie kodu

Po pomyślnym wysłaniu kodu do sieci, będziemy mogli go wykonać. By to zrobić, w konsoli klienta musimy wskazać adres oraz podać ABI naszego kontraktu.

var hello = eth.contract([{"constant":true,"inputs":[],"name":"showText","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"text","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":
"constructor"}]).at("0x1fbc3e8b42f9b9ea7ca3df8057f47c2d58226e00")

W kolejnym kroku wykonujemy odwołanie do naszej funkcji, która zwraca nam nasz oczekiwany wynik.

hello.showText()
"Hello World”

Kod, który używaliśmy w dzisiejszym artykule, znajdziecie także na naszym GitHubie.

Smart Kontrakty na samym początku przygody mogą wydawać się skomplikowane. Programista chcący zacząć programowanie kontraktów, będzie musiał zrozumieć inne podejście – podejście, w którym każda operacja (w tym przypadku transakcja) nie jest wykonywana natychmiast. Odczyt danych z kontraktu jest szybki, jednak modyfikacja sieci wymaga oczekiwania na wykonanie bloku, oraz otrzymanie kilku potwierdzeń. Dodatkowo trzeba w mniejszym, lub większym stopniu zrozumieć sposób działania samej sieci Ethereum. Mając już tą wiedzę, reszta staje się o wiele prostsza.

__________________________________

Autorzy:

Justyna Kot – Project Manager & Business Analyst
https://twitter.com/JustineKot
https://www.linkedin.com/in/justyna-kot/

Piotr Pawlak – Blockchain dApps Developer
https://www.linkedin.com/in/ppawlakov/

Concise Softwaresoftware house specjalizujący się w rozwiązaniach z zakresu blockchain, Internet of things, automotive, web oraz aplikacjach mobilnych.
Od 11 lat działamy na skalę globalną, ale serce naszego teamu bije niezmiennie w Rzeszowie. Jesteśmy zgranym zespołem inżynierów i projektantów, którzy każdego dnia z pasją pomagają tworzyć swoim partnerom innowacyjny, zintegrowany świat. Wśród nich znajdują się m. in. Jaguar, Red Bull, Panasonic, Delivery Hero, Bosch, Neufund. Nasi inżynierowie należą także do czołówki ekspertów zajmujących się technologią blockchain.