Wprowadzenie do inteligentnych kontraktów

W tym artykule przyjrzymy się, czym są inteligentne kontrakty, czym są, poznamy różne platformy inteligentnych kontraktów, ich funkcje, a także omówimy, jak działają i jakie korzyści mogą przynieść. Materiał ten będzie bardzo przydatny dla czytelników, którzy nie są zbyt dobrze zaznajomieni z tematem inteligentnych kontraktów, ale chcą zbliżyć się do jego zrozumienia.

Regularny kontrakt vs. inteligentny kontrakt

Zanim zagłębimy się w szczegóły, weźmy przykład różnic pomiędzy zwykłą umową, która jest określona na papierze, a inteligentną umową, która jest reprezentowana cyfrowo.

Wprowadzenie do inteligentnych kontraktów

Jak to działało przed pojawieniem się inteligentnych kontraktów? Wyobraźcie sobie grupę ludzi, którzy chcą ustalić pewne zasady i warunki podziału wartości, a także pewien mechanizm gwarantujący realizację tego podziału według danych zasad i warunków. Następnie spotykali się, sporządzali dokument, na którym zapisywali swoje dane identyfikacyjne, warunki i wartości, datowali je i podpisywali. Umowa ta została również poświadczona przez zaufaną stronę, np. notariusza. Co więcej, osoby te poszły w różnych kierunkach z papierową kopią takiej umowy i zaczęły wykonywać pewne czynności, które mogły nie odpowiadać samej umowie, to znaczy zrobiły jedną rzecz, ale na papierze było poświadczone, że powinny coś zrobić zupełnie inny. I jak wyjść z tej sytuacji? Tak naprawdę jeden z członków grupy musi wziąć ten dokument, zebrać dowody, skierować je do sądu i osiągnąć zgodność umowy z rzeczywistymi działaniami. Dość często trudno jest osiągnąć uczciwą realizację tej umowy, co prowadzi do przykrych konsekwencji.

Co można powiedzieć o inteligentnych kontraktach? Łączą w sobie zarówno możliwość napisania warunków umowy, jak i mechanizm ich ścisłej realizacji. Jeżeli warunki zostały ustalone i podpisano odpowiednią transakcję lub żądanie, po zaakceptowaniu tego żądania lub transakcji nie jest już możliwa zmiana warunków ani wpływ na ich realizację.

Istnieje jeden walidator lub cała sieć, a także baza danych przechowująca wszystkie inteligentne kontrakty, które zostały zgłoszone do realizacji, w ścisłej kolejności chronologicznej. Ważne jest również, aby ta baza danych zawierała wszystkie warunki wyzwalające realizację inteligentnej umowy. Ponadto musi wziąć pod uwagę samą wartość, której podział jest opisany w umowie. Jeśli dotyczy to jakiejś waluty cyfrowej, to ta baza danych powinna to uwzględnić.

Innymi słowy, walidatorzy inteligentnych kontraktów muszą mieć dostęp do wszystkich danych, na których opiera się inteligentny kontrakt. Na przykład pojedyncza baza danych powinna być używana do jednoczesnego rozliczania walut cyfrowych, sald użytkowników, transakcji użytkowników i znaczników czasu. Wtedy w inteligentnym kontrakcie warunkiem może być saldo użytkownika w określonej walucie, nadejście określonego czasu lub fakt, że została przeprowadzona określona transakcja, ale nic więcej.

Definicja inteligentnego kontraktu

Ogólnie rzecz biorąc, sama terminologia została wymyślona przez badacza Nicka Szabo i użyta po raz pierwszy w 1994 r., a została udokumentowana w 1997 r. w artykule opisującym samą ideę inteligentnych kontraktów.

Inteligentne kontrakty implikują pewną automatyzację dystrybucji wartości, która może zależeć jedynie od z góry określonych warunków. W najprostszej formie wygląda to jak umowa o ściśle określonych warunkach, którą podpisują określone strony.

Inteligentne kontrakty mają na celu zminimalizowanie zaufania do stron trzecich. Czasami całkowicie wyklucza się ośrodek decyzyjny, od którego wszystko zależy. Ponadto takie umowy są łatwiejsze do audytu. Jest to konsekwencja pewnych cech konstrukcyjnych takiego systemu, jednak najczęściej przez smart kontrakt rozumiemy zdecentralizowane środowisko i obecność funkcji, które pozwalają każdemu na analizę bazy danych i przeprowadzenie pełnego audytu realizacji kontraktów. Zapewnia to ochronę przed wsteczną zmianą danych, która pociągałaby za sobą zmiany w realizacji samej umowy. Digitalizacja większości procesów przy tworzeniu i uruchamianiu inteligentnego kontraktu często upraszcza technologię i koszt ich wdrożenia.

Prosty przykład – usługa Escrow

Spójrzmy na bardzo prosty przykład. Pomoże Ci przybliżyć się do zrozumienia funkcjonalności inteligentnych kontraktów, a także lepiej zrozumieć, w jakich przypadkach należy je stosować.

Wprowadzenie do inteligentnych kontraktów

Można go również wdrożyć za pomocą Bitcoina, choć na razie Bitcoina trudno nazwać pełnoprawną platformą dla inteligentnych kontraktów. Mamy więc kupca i sklep internetowy. Klient chce kupić monitor w tym sklepie. W najprostszym przypadku kupujący realizuje i wysyła płatność, a sklep internetowy ją akceptuje, potwierdza, a następnie wysyła towar. Jednak w tej sytuacji potrzebne jest duże zaufanie – kupujący musi zaufać sklepowi internetowemu na całą kwotę monitora. Ponieważ sklep internetowy może mieć w oczach kupującego złą reputację, istnieje ryzyko, że z jakiegoś powodu po przyjęciu płatności sklep odmówi obsługi i nie wyśle ​​towaru do kupującego. Kupujący zadaje zatem pytanie (i w związku z tym sklep internetowy zadaje to pytanie), co można w tym przypadku zastosować, aby zminimalizować tego typu ryzyko i zwiększyć wiarygodność transakcji.

W przypadku Bitcoina możliwe jest umożliwienie kupującemu i sprzedającemu niezależnego wyboru mediatora. Jest wiele osób zaangażowanych w rozwiązywanie kontrowersyjnych kwestii. A nasi uczestnicy mogą wybrać z ogólnej listy mediatorów tego, któremu zaufają. Razem tworzą adres wielopodpisowy 2 z 3, w którym znajdują się trzy klucze, a do wydania monet z tego adresu wymagane są dwa podpisy z dowolnymi dwoma kluczami. Jeden klucz będzie należeć do kupującego, drugi do sklepu internetowego, a trzeci do pośrednika. I na taki multipodpisowy adres kupujący prześle kwotę niezbędną do zapłaty za monitor. Teraz, gdy sprzedawca widzi, że pieniądze są zablokowane na jakiś czas na zależnym od niego adresie multipodpisowym, może bezpiecznie wysłać monitor pocztą.

Następnie kupujący odbiera przesyłkę, sprawdza towar i podejmuje decyzję o ostatecznym zakupie. Może całkowicie zgodzić się ze świadczoną usługą i podpisać transakcję swoim kluczem, gdzie przekazuje monety z adresu multipodpisowego sprzedawcy, albo może być z czegoś niezadowolony. W drugim przypadku kontaktuje się z mediatorem, aby przygotować alternatywną transakcję, która spowoduje inną dystrybucję monet.

Załóżmy, że monitor przyszedł trochę porysowany i w zestawie nie było kabla do podłączenia do komputera, choć na stronie sklepu internetowego widniała informacja, że ​​kabel powinien być w zestawie. Następnie kupujący zbiera materiał dowodowy niezbędny do udowodnienia mediatorowi, że został w tej sytuacji oszukany: wykonuje zrzuty ekranu strony, robi zdjęcie paragonu pocztowego, robi zdjęcie rys na monitorze i wykazuje, że plomba została uszkodzony i kabel został wyciągnięty. Sklep internetowy z kolei gromadzi jego materiał dowodowy i przekazuje go mediatorowi.

Mediatorowi zależy na jednoczesnym zaspokojeniu zarówno oburzenia kupującego, jak i interesów sklepu internetowego (powód okaże się później). Jest to transakcja, w ramach której monety z adresu multipodpisowego zostaną wydane w jakiejś proporcji pomiędzy kupującym, sklepem internetowym i mediatorem, gdyż on część bierze dla siebie w nagrodę za swoją pracę. Załóżmy, że 90% całkowitej kwoty trafia do sprzedawcy, 5% do mediatora i 5% odszkodowania do kupującego. Mediator podpisuje tę transakcję swoim kluczem, ale nie można jej jeszcze zastosować, ponieważ wymaga dwóch podpisów, a warto tylko jeden. Wysyła taką transakcję zarówno do kupującego, jak i sprzedającego. Jeżeli przynajmniej jednemu z nich będzie usatysfakcjonowana taka możliwość redystrybucji monet, wówczas transakcja zostanie wstępnie podpisana i rozesłana do sieci. Aby to potwierdzić, wystarczy, że jedna ze stron transakcji zgodzi się z opcją mediatora.

Ważne jest, aby na początku wybrać mediatora, aby obie strony mu zaufały. W takim przypadku będzie działał niezależnie od interesów jednego lub drugiego i obiektywnie oceni sytuację. Jeżeli mediator nie zapewni możliwości dystrybucji monet, która zadowoli przynajmniej jednego uczestnika, wówczas po wspólnej zgodzie zarówno kupujący, jak i sklep internetowy mogą wysłać monety na nowy adres multipodpisowy, składając swoje dwa podpisy. Nowy adres multipodpisowy zostanie zestawiony z innym mediatorem, który być może będzie bardziej kompetentny w tej sprawie i zaproponuje lepszą opcję.

Przykład z akademikiem i lodówką

Przyjrzyjmy się bardziej złożonemu przykładowi, który wyraźniej pokazuje możliwości inteligentnego kontraktu.

Wprowadzenie do inteligentnych kontraktów

Załóżmy, że jest trzech facetów, którzy niedawno przeprowadzili się do tego samego pokoju w akademiku. Cała trójka jest zainteresowana kupnem lodówki do swojego pokoju, z której będą mogli wspólnie korzystać. Jeden z nich zgłosił się na ochotnika do zebrania potrzebnej kwoty na zakup lodówki i negocjacji ze sprzedawcą. Jednak poznali się dopiero niedawno i nie ma między nimi wystarczającego zaufania. Oczywiście dwóch z nich podejmuje ryzyko, dając pieniądze trzeciemu. Ponadto muszą osiągnąć porozumienie w sprawie wyboru sprzedawcy.

Mogą skorzystać z usługi escrow, czyli wybrać mediatora, który będzie monitorował przebieg transakcji i rozwiązywał kontrowersyjne kwestie, jeśli takie się pojawią. Następnie, po zgodzie, sporządzają inteligentną umowę i określają w niej określone warunki.

Pierwszy warunek jest taki, że przed upływem określonego czasu, powiedzmy w ciągu tygodnia, odpowiednie konto inteligentnej umowy musi otrzymać trzy płatności z określonych adresów na określoną kwotę. Jeśli tak się nie stanie, inteligentna umowa przestanie działać i zwróci monety wszystkim uczestnikom. Jeżeli warunek jest spełniony, wówczas ustalane są wartości identyfikatorów sprzedawcy i mediatora oraz sprawdzany jest warunek, aby wszyscy uczestnicy zgadzali się z wyborem sprzedawcy i mediatora. Po spełnieniu wszystkich warunków środki zostaną przelane na wskazane adresy. Takie podejście może chronić uczestników przed oszustwami z dowolnej strony i ogólnie eliminuje potrzebę zaufania.

Widzimy na tym przykładzie samą zasadę, że ta możliwość stopniowego ustawiania parametrów spełniających każdy warunek pozwala na tworzenie systemów o dowolnej złożoności i głębokości zagnieżdżonych poziomów. Dodatkowo możesz najpierw zdefiniować pierwszy warunek w inteligentnym kontrakcie, a dopiero po jego spełnieniu ustawić parametry dla kolejnego warunku. Innymi słowy, warunek jest formalnie zapisany i parametry dla niego można ustawić już w trakcie jego działania.

Klasyfikacja inteligentnych kontraktów

Do klasyfikacji można ustawić różne grupy kryteriów. Jednak w momencie rozwoju technologii cztery z nich są istotne.

Inteligentne kontrakty można wyróżnić na podstawie środowiska ich realizacji, które może być scentralizowane lub zdecentralizowane. W przypadku decentralizacji mamy znacznie większą niezależność i tolerancję na błędy przy realizacji inteligentnych kontraktów.

Wyróżnia je także sposób stawiania i spełniania warunków: mogą być dowolnie programowalne, ograniczone lub predefiniowane, czyli ściśle typowane. Gdy na platformie inteligentnych kontraktów znajdują się tylko 4 konkretne inteligentne kontrakty, parametry dla nich można ustawić w dowolny sposób. W związku z tym ustawienie ich jest znacznie prostsze: wybieramy kontrakt z listy i przekazujemy parametry.

Według metody inicjacji istnieją inteligentne kontrakty zautomatyzowane, czyli w przypadku wystąpienia określonych warunków są one samowykonalne oraz są umowy, w których warunki są określone, ale platforma nie sprawdza automatycznie ich spełnienia; w tym celu należy rozpocząć osobno.

Ponadto inteligentne kontrakty różnią się poziomem prywatności. Mogą być całkowicie otwarte, częściowo lub całkowicie poufne. To drugie oznacza, że ​​zewnętrzni obserwatorzy nie widzą warunków inteligentnych kontraktów. Temat prywatności jest jednak bardzo szeroki i lepiej go rozpatrywać oddzielnie od niniejszego artykułu.

Poniżej przyjrzymy się bliżej pierwszym trzem kryteriom, aby zapewnić większą przejrzystość zrozumienia bieżącego tematu.

Inteligentne kontrakty według czasu wykonania

Wprowadzenie do inteligentnych kontraktów

W oparciu o środowisko wykonawcze rozróżnia się scentralizowane i zdecentralizowane platformy inteligentnych kontraktów. W przypadku scentralizowanych umów cyfrowych stosowana jest jedna usługa, w której występuje tylko jeden walidator i może istnieć usługa tworzenia kopii zapasowych i odzyskiwania danych, która również jest zarządzana centralnie. Jest jedna baza danych, która przechowuje wszystkie informacje niezbędne do ustalenia warunków inteligentnej umowy i dystrybucji wartości, która jest brana pod uwagę w tej właśnie bazie usług. Taka scentralizowana usługa ma klienta, który ustala warunki z określonymi żądaniami i korzysta z takich umów. Ze względu na scentralizowany charakter platformy mechanizmy uwierzytelniania mogą być mniej bezpieczne niż w kryptowalutach.

Jako przykład możemy wziąć dostawców komunikacji mobilnej (różnych operatorów komórkowych). Załóżmy, że dany operator prowadzi na swoich serwerach scentralizowaną ewidencję ruchu, który może być przesyłany w różnych formatach, na przykład: w formie połączeń głosowych, transmisji SMS, ruchu w mobilnym Internecie i według różnych standardów, a także prowadzi rejestry środków na saldach użytkowników. W związku z tym dostawca usług telefonii komórkowej może zawierać umowy o rozliczanie świadczonych usług i ich płatności na różnych warunkach. W tym przypadku łatwo jest ustawić warunki typu „wyślij SMS z takim a takim kodem na taki a taki numer, a otrzymasz takie a takie warunki dystrybucji ruchu”.

Można podać jeszcze jeden przykład: tradycyjne banki z rozszerzoną funkcjonalnością bankowości internetowej i bardzo prostymi umowami, takimi jak regularne płatności, automatyczne przeliczanie wpłat przychodzących, automatyczne naliczanie odsetek od określonego rachunku itp.

Jeśli mówimy o inteligentnych kontraktach ze zdecentralizowanym środowiskiem wykonawczym, to mamy grupę walidatorów. Idealnie byłoby, gdyby każdy mógł zostać walidatorem. Ze względu na protokół synchronizacji baz danych i osiąganie konsensusu, mamy jakąś wspólną bazę danych, która będzie teraz przechowywać wszystkie transakcje ze ściśle opisanymi kontraktami, a nie jakieś zapytania warunkowe, których formaty często się zmieniają i nie ma otwartej specyfikacji. Tutaj transakcje będą zawierały instrukcje wykonania kontraktu według ścisłej specyfikacji. Specyfikacja ta ma charakter otwarty, dzięki czemu użytkownicy platformy sami mogą przeprowadzać audyt i walidację inteligentnych kontraktów. Widzimy tutaj, że zdecentralizowane platformy są lepsze od scentralizowanych pod względem niezależności i odporności na awarie, ale ich projektowanie i utrzymanie są znacznie bardziej złożone.

Inteligentne kontrakty metodą ustalania i spełniania warunków

Przyjrzyjmy się teraz bliżej, jak inteligentne kontrakty mogą różnić się sposobem ustalania i wypełniania warunków. Tutaj zwracamy naszą uwagę na inteligentne kontrakty, które są losowo programowalne i kompletne w Turingu. Inteligentny kontrakt zgodny z Turingiem pozwala ustawić prawie dowolne algorytmy jako warunki wykonania kontraktu: cykle zapisu, niektóre funkcje obliczania prawdopodobieństw i tym podobne - aż do własnych algorytmów podpisu elektronicznego. W tym przypadku mamy na myśli prawdziwie dowolne pisanie logiki.

Istnieją również arbitralne inteligentne kontrakty, ale nie są to kompletne kontrakty Turinga. Obejmuje to Bitcoin i Litecoin z własnym skryptem. Oznacza to, że możesz używać tylko niektórych operacji w dowolnej kolejności, ale nie możesz już pisać pętli i własnych algorytmów.

Ponadto istnieją platformy inteligentnych kontraktów, które wdrażają predefiniowane inteligentne kontrakty. Należą do nich Bitshares i Steemit. Bitshares posiada szereg inteligentnych kontraktów do handlu, zarządzania kontem, zarządzania samą platformą i jej parametrami. Steemit to podobna platforma, tyle że nie skupia się już na wydawaniu tokenów i handlu jak Bitshares, ale na blogowaniu, czyli przechowuje i przetwarza treści w sposób zdecentralizowany.

Arbitralne kontrakty Turing-complete obejmują platformę Ethereum i RootStock, który jest wciąż w fazie rozwoju. Dlatego poniżej omówimy nieco bardziej szczegółowo platformę inteligentnych kontraktów Ethereum.

Inteligentne kontrakty metodą inicjacji

Ze względu na sposób inicjowania inteligentne kontrakty można również podzielić na co najmniej dwie grupy: automatyczne i ręczne (nieautomatyczne). Zautomatyzowane charakteryzują się tym, że przy wszystkich znanych parametrach i warunkach inteligentny kontrakt jest realizowany całkowicie automatycznie, czyli nie wymaga wysyłania żadnych dodatkowych transakcji i wydawania dodatkowej prowizji przy każdej kolejnej realizacji. Sama platforma posiada wszystkie dane, aby obliczyć, w jaki sposób inteligentna umowa zostanie zrealizowana. Logika nie jest tam dowolna, ale z góry ustalona i wszystko to jest przewidywalne. Oznacza to, że możesz z góry oszacować złożoność realizacji inteligentnej umowy, zastosować za nią jakąś stałą prowizję, a wszystkie procesy jej realizacji są bardziej wydajne.

W przypadku inteligentnych kontraktów, które są dowolnie programowane, realizacja nie jest zautomatyzowana. Aby zainicjować taki inteligentny kontrakt, praktycznie na każdym kroku trzeba utworzyć nową transakcję, która wywoła kolejny etap realizacji lub kolejną metodę inteligentnego kontraktu, zapłacić odpowiednią prowizję i poczekać na potwierdzenie transakcji. Wykonanie może zakończyć się pomyślnie lub nie, ponieważ kod inteligentnego kontraktu jest dowolny i mogą pojawić się pewne nieprzewidywalne momenty, takie jak wieczna pętla, brak niektórych parametrów i argumentów, nieobsługiwane wyjątki itp.

Konta Ethereum

Typy kont Ethereum

Przyjrzyjmy się, jakie rodzaje kont mogą znajdować się na platformie Ethereum. Tutaj są tylko dwa rodzaje kont i nie ma innej opcji. Pierwszy typ nazywany jest kontem użytkownika, drugi jest kontem kontraktowym. Zastanówmy się, czym się różnią.

Konto użytkownika kontrolowane jest wyłącznie za pomocą klucza osobistego podpisu elektronicznego. Właściciel rachunku generuje własną parę kluczy do podpisu elektronicznego, korzystając z algorytmu ECDSA (Elliptic Curve Digital Signature Algorithm). Jedynie transakcje podpisane tym kluczem mogą zmienić stan tego konta.

Dla konta inteligentnej umowy przewidziana jest osobna logika. Można nim sterować jedynie za pomocą predefiniowanego kodu oprogramowania, który całkowicie określa zachowanie inteligentnej umowy: w jaki sposób będzie zarządzał swoimi monetami w określonych okolicznościach, z inicjatywy jakiego użytkownika i na jakich dodatkowych warunkach te monety będą dystrybuowane. Jeśli twórcy nie uwzględnią niektórych punktów w kodzie programu, mogą pojawić się problemy. Przykładowo inteligentny kontrakt może otrzymać pewien stan, w którym nie akceptuje inicjacji dalszej realizacji od któregokolwiek z użytkowników. W tym przypadku monety zostaną faktycznie zamrożone, ponieważ inteligentny kontrakt nie przewiduje wyjścia z tego stanu.

Jak tworzone są konta w Ethereum

W przypadku konta użytkownika właściciel samodzielnie generuje parę kluczy za pomocą ECDSA. Należy zauważyć, że Ethereum wykorzystuje dokładnie ten sam algorytm i dokładnie tę samą krzywą eliptyczną dla podpisów elektronicznych co Bitcoin, ale adres jest obliczany w nieco inny sposób. Tutaj nie jest już używany wynik podwójnego mieszania, jak w Bitcoinie, ale pojedyncze mieszanie jest zapewnione za pomocą funkcji Keccak o długości 256 bitów. Z wartości wynikowej odcinane są najmniej znaczące bity, a mianowicie najmniej znaczące 160 bitów wyjściowej wartości skrótu. W rezultacie otrzymujemy adres w Ethereum. W rzeczywistości zajmuje 20 bajtów.

Należy pamiętać, że identyfikator konta w Ethereum jest kodowany w formacie szesnastkowym bez stosowania sumy kontrolnej, w przeciwieństwie do Bitcoina i wielu innych systemów, gdzie adres jest kodowany w systemie bazowym 58 liczb z dodatkiem sumy kontrolnej. Oznacza to, że musisz zachować ostrożność podczas pracy z identyfikatorami kont w Ethereum: nawet jeden błąd w identyfikatorze gwarantuje utratę monet.

Istotną cechą jest to, że konto użytkownika na poziomie ogólnej bazy danych tworzone jest w momencie, gdy zaakceptuje on pierwszą płatność przychodzącą.

Utworzenie inteligentnego konta kontraktowego wymaga zupełnie innego podejścia. Początkowo jeden z użytkowników pisze kod źródłowy inteligentnej umowy, po czym kod przechodzi przez kompilator specjalny dla platformy Ethereum, uzyskując kod bajtowy dla własnej maszyny wirtualnej Ethereum. Powstały kod bajtowy umieszczany jest w specjalnym polu transakcji. Jest certyfikowany w imieniu konta inicjatora. Następnie transakcja ta jest propagowana w całej sieci i umieszcza kod inteligentnego kontraktu. Prowizja za transakcję i co za tym idzie za wykonanie umowy jest pobierana z salda konta inicjatora.

Każdy inteligentny kontrakt koniecznie zawiera własnego konstruktora (tego kontraktu). Może być pusty lub zawierać treść. Po wykonaniu konstruktora tworzony jest identyfikator konta inteligentnego kontraktu, za pomocą którego można wysyłać monety, wywoływać określone metody inteligentnych kontraktów itp.

Struktura transakcji Ethereum

Aby było to jaśniejsze, zaczniemy przyglądać się strukturze transakcji Ethereum i przykładowemu kodowi inteligentnego kontraktu.

Wprowadzenie do inteligentnych kontraktów

Transakcja Ethereum składa się z kilku pól. Pierwszy z nich, nonce, to określony numer seryjny transakcji w stosunku do samego konta, które ją dystrybuuje i jest jej autorem. Jest to konieczne, aby rozróżnić transakcje podwójne, czyli wykluczyć przypadek dwukrotnej akceptacji tej samej transakcji. Dzięki zastosowaniu identyfikatora każda transakcja ma unikalną wartość skrótu.

Następnie pojawia się pole podobne cena gazu. Wskazuje cenę, po której waluta bazowa Ethereum zostaje przeliczona na gaz, który służy do zapłaty za realizację inteligentnego kontraktu i alokację zasobu maszyny wirtualnej. Co to znaczy?

W Bitcoin opłaty są płacone bezpośrednio przez walutę bazową – sam Bitcoin. Jest to możliwe dzięki prostemu mechanizmowi ich wyliczania: płacimy ściśle za ilość danych zawartych w transakcji. W Ethereum sytuacja jest bardziej skomplikowana, gdyż bardzo trudno polegać na wolumenie danych transakcyjnych. Tutaj transakcja może zawierać również kod programu, który zostanie wykonany na maszynie wirtualnej, a każda operacja na maszynie wirtualnej może mieć inny stopień złożoności. Istnieją również operacje alokujące pamięć dla zmiennych. Będą miały swoją złożoność, od której będzie zależeć płatność za każdą operację.

Koszt każdej operacji w ekwiwalencie gazu będzie stały. Wprowadza się go specjalnie w celu ustalenia stałego kosztu każdej operacji. W zależności od obciążenia sieci zmieni się cena gazu, czyli współczynnik, według którego zostanie przeliczona waluta bazowa na tę jednostkę pomocniczą w celu zapłaty prowizji.

Transakcja w Ethereum ma jeszcze jedną cechę: kod bajtowy, który zawiera do wykonania na maszynie wirtualnej, będzie wykonywany do momentu zakończenia się jakimś wynikiem (sukcesem lub niepowodzeniem) lub do wyczerpania się określonej ilości monet przydzielonych do zapłaty prowizji . Aby uniknąć sytuacji, w której w przypadku jakiegoś błędu wszystkie monety z konta nadawcy zostały wydane na prowizję (np. uruchomił się jakiś wieczny cykl w maszynie wirtualnej), istnieje pole: uruchomić gaz (często nazywany limitem gazu) – określa maksymalną ilość monet, jaką nadawca jest skłonny wydać na realizację określonej transakcji.

Następne pole nazywa się adres przeznaczenia. Obejmuje to adres odbiorcy monet lub adres konkretnego inteligentnego kontraktu, którego metody zostaną wywołane. Po nim następuje pole wartość, gdzie wpisana jest ilość monet wysłanych na adres docelowy.

Dalej jest interesujące pole tzw dane, gdzie mieści się cała konstrukcja. Nie jest to osobne pole, ale cała struktura, w której zdefiniowany jest kod dla maszyny wirtualnej. Można tu umieścić dowolne dane – obowiązują w tym zakresie odrębne zasady.

I nazywa się ostatnie pole podpis. Zawiera jednocześnie zarówno podpis elektroniczny autora tej transakcji, jak i klucz publiczny, za pomocą którego podpis ten będzie weryfikowany. Z klucza publicznego można uzyskać identyfikator rachunku nadawcy tej transakcji, czyli jednoznacznie zidentyfikować rachunek nadawcy w samym systemie. Dowiedzieliśmy się najważniejszej rzeczy o strukturze transakcji.

Przykładowy kod inteligentnego kontraktu dla Solidity

Przyjrzyjmy się teraz bliżej najprostszemu inteligentnemu kontraktowi na przykładzie.

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

Powyżej znajduje się uproszczony kod źródłowy, który może przechowywać monety użytkowników i zwracać je na żądanie.

Istnieje zatem inteligentny kontrakt Banku, który spełnia następujące funkcje: gromadzi monety na swoim saldzie, czyli po potwierdzeniu transakcji i złożeniu takiego inteligentnego kontraktu tworzone jest nowe konto, które może zawierać monety na swoim saldzie; zapamiętuje użytkowników i podział monet pomiędzy nimi; posiada kilka metod zarządzania saldami, czyli możliwe jest uzupełnianie, wypłacanie i sprawdzanie salda użytkownika.

Przejrzyjmy każdą linię kodu źródłowego. Ten kontrakt ma stałe pola. Jeden z nich, zawierający adres typu, nazywany jest właścicielem. Tutaj umowa zapamiętuje adres użytkownika, który utworzył tę inteligentną umowę. Co więcej, istnieje dynamiczna struktura, która utrzymuje zgodność pomiędzy adresami użytkowników i saldami.

Następnie następuje metoda Bankowa - ma taką samą nazwę jak umowa. W związku z tym jest to jego konstruktor. Tutaj zmiennej właściciela przypisany jest adres osoby, która umieściła tę inteligentną umowę w sieci. To jedyna rzecz, która dzieje się w tym konstruktorze. Oznacza to, że msg w tym przypadku to dokładnie te dane, które zostały przesłane do maszyny wirtualnej wraz z transakcją zawierającą cały kod tej umowy. W związku z tym msg.sender jest autorem tej transakcji, która hostuje ten kod. Będzie właścicielem smart kontraktu.

Metoda wpłaty umożliwia przelanie określonej liczby monet na konto kontraktu w drodze transakcji. W tym przypadku inteligentny kontrakt otrzymując te monety, pozostawia je w swoim bilansie, ale zapisuje w strukturze sald, kto dokładnie był nadawcą tych monet, aby wiedzieć, do kogo należą.

Kolejna metoda nazywa się wycofaniem i przyjmuje jeden parametr – ilość monet, jaką ktoś chce wypłacić z tego banku. Sprawdza to, czy na saldzie użytkownika, który wywołuje tę metodę, jest wystarczająca ilość monet, aby je wysłać. Jeśli jest ich wystarczająco dużo, inteligentny kontrakt sam zwraca dzwoniącemu odpowiednią liczbę monet.

Następnie następuje metoda sprawdzenia aktualnego salda użytkownika. Ktokolwiek wywoła tę metodę, zostanie wykorzystany do odzyskania salda w inteligentnym kontrakcie. Warto zaznaczyć, że modyfikatorem tej metody jest widok. Oznacza to, że sama metoda w żaden sposób nie zmienia zmiennych swojej klasy i tak naprawdę jest metodą jedynie odczytującą. Za wywołanie tej metody nie jest tworzona odrębna transakcja, nie jest pobierana żadna opłata, a wszystkie obliczenia wykonywane są lokalnie, po czym użytkownik otrzymuje wynik.

Aby zniszczyć stan inteligentnego kontraktu, potrzebna jest metoda kill. I tutaj następuje dodatkowe sprawdzenie, czy wywołujący tę metodę jest właścicielem tego kontraktu. Jeśli tak, to kontrakt ulega samozniszczeniu, a funkcja zniszczenia przyjmuje jeden parametr - identyfikator rachunku, na który kontrakt wyśle ​​wszystkie monety pozostałe na jego saldzie. W takim przypadku pozostałe monety automatycznie trafią na adres właściciela umowy.

Jak działa pełny węzeł w sieci Ethereum?

Przyjrzyjmy się schematycznie, jak takie inteligentne kontrakty są realizowane na platformie Ethereum i jak działa pełny węzeł sieci.

Wprowadzenie do inteligentnych kontraktów

Pełny węzeł w sieci Ethereum musi posiadać co najmniej cztery moduły.
Pierwszym, jak w przypadku każdego zdecentralizowanego protokołu, jest moduł sieciowy P2P - moduł umożliwiający połączenie sieciowe i współpracę z innymi węzłami, gdzie wymieniane są bloki, transakcje i informacje o innych węzłach. Jest to tradycyjny komponent wszystkich zdecentralizowanych kryptowalut.

Następnie mamy moduł do przechowywania danych blockchain, przetwarzania, wyboru gałęzi priorytetowej, dołączania bloków, odłączania bloków, walidacji tych bloków itp.

Trzeci moduł nazywa się EVM (Ethereum virtual machine) – jest to maszyna wirtualna, która odbiera kod bajtowy z transakcji Ethereum. Moduł ten pobiera aktualny stan danego konta i dokonuje zmian w jego stanie na podstawie otrzymanego kodu bajtowego. Wersja maszyny wirtualnej w każdym węźle sieci musi być taka sama. Obliczenia, które odbywają się na każdym węźle Ethereum są dokładnie takie same, jednak zachodzą w sposób asynchroniczny: ktoś wcześniej sprawdza i akceptuje tę transakcję, czyli wykonuje cały zawarty w niej kod, a ktoś później. Odpowiednio, gdy zostanie utworzona transakcja, zostaje ona rozesłana do sieci, węzły ją akceptują, a w momencie weryfikacji, w taki sam sposób, w jaki wykonywany jest Bitcoin Script w Bitcoin, wykonywany jest tutaj kod bajtowy maszyny wirtualnej.

Transakcję uważa się za zweryfikowaną, jeśli cały zawarty w niej kod został wykonany, wygenerowano nowy stan danego rachunku i zapisano go do czasu, aż będzie jasne, czy transakcja została zrealizowana, czy nie. Jeśli transakcja zostanie zastosowana, stan ten uważa się nie tylko za zakończony, ale także bieżący. Istnieje baza danych przechowująca stan każdego konta dla każdego węzła sieci. Z uwagi na to, że wszystkie obliczenia przebiegają w ten sam sposób i stan blockchainu jest taki sam, baza danych zawierająca stany wszystkich kont również będzie taka sama dla każdego węzła.

Mity i ograniczenia inteligentnych kontraktów

Jeśli chodzi o ograniczenia istniejące dla platform inteligentnych kontraktów podobnych do Ethereum, można przytoczyć następujące:

  • wykonanie kodu;
  • przydzielać pamięć;
  • dane blockchainowe;
  • wysyłać płatności;
  • utwórz nową umowę;
  • zadzwoń do innych umów.

Przyjrzyjmy się ograniczeniom nałożonym na maszynę wirtualną i w związku z tym rozwiejmy niektóre mity na temat inteligentnych kontraktów. Na maszynie wirtualnej, która może znajdować się nie tylko w Ethereum, ale także na podobnych platformach, możesz wykonywać naprawdę dowolne operacje logiczne, czyli pisać kod i on będzie tam wykonywany, możesz dodatkowo przydzielić pamięć. Opłata jest jednak pobierana odrębnie za każdą operację i za każdą dodatkową przydzieloną jednostkę pamięci.

Następnie maszyna wirtualna może odczytać dane z bazy danych blockchain, aby wykorzystać je jako wyzwalacz do wykonania tej lub innej logiki inteligentnego kontraktu. Maszyna wirtualna może tworzyć i wysyłać transakcje, może tworzyć nowe kontrakty i wywoływać metody innych inteligentnych kontraktów, które są już opublikowane w sieci: istniejących, dostępnych itp.

Najczęstszym mitem jest to, że inteligentne kontrakty Ethereum mogą wykorzystywać informacje z dowolnego zasobu Internetu na swoich warunkach. Prawda jest taka, że ​​maszyna wirtualna nie może wysłać żądania sieciowego do jakiegoś zewnętrznego zasobu informacyjnego w Internecie, czyli nie da się napisać inteligentnej umowy, która rozdzielałaby wartość pomiędzy użytkownikami w zależności, powiedzmy, od pogody na zewnątrz, lub kto wygrał jakieś mistrzostwa, lub na podstawie innego zdarzenia, które miało miejsce w świecie zewnętrznym, ponieważ informacji o tych zdarzeniach po prostu nie ma w bazie danych samej platformy. Oznacza to, że w blockchainie nie ma nic na ten temat. Jeśli się tam nie pojawi, maszyna wirtualna nie może wykorzystać tych danych jako wyzwalaczy.

Wady Ethereum

Wymieńmy najważniejsze. Pierwszą wadą są pewne trudności w projektowaniu, rozwijaniu i testowaniu inteligentnych kontraktów w Ethereum (Ethereum używa języka Solidity do pisania inteligentnych kontraktów). Rzeczywiście praktyka pokazuje, że bardzo duży procent wszystkich błędów leży po stronie czynnika ludzkiego. W rzeczywistości dotyczy to już napisanych inteligentnych kontraktów Ethereum, które mają średnią lub większą złożoność. Jeśli w przypadku prostych inteligentnych kontraktów prawdopodobieństwo błędu jest małe, to w złożonych inteligentnych kontraktach bardzo często pojawiają się błędy, które prowadzą do kradzieży środków, ich zamrożenia, zniszczenia inteligentnych kontraktów w nieoczekiwany sposób itp. Wiele takich przypadków zostało już zrealizowanych. znany.

Drugą wadą jest to, że sama maszyna wirtualna nie jest idealna, ponieważ jest również pisana przez ludzi. Może wykonywać dowolne polecenia i na tym polega luka: pewną liczbę poleceń można skonfigurować w określony sposób, który spowoduje nieprzewidziane z góry konsekwencje. Jest to bardzo złożony obszar, ale istnieje już kilka badań, które pokazują, że w aktualnej wersji sieci Ethereum występują te luki i mogą doprowadzić do niepowodzenia wielu inteligentnych kontraktów.

Kolejna duża trudność, którą można uznać za wadę. Polega na tym, że praktycznie lub technicznie można dojść do wniosku, że jeśli skompilujesz kod bajtowy kontraktu, który będzie wykonywany na maszynie wirtualnej, możesz ustalić jakąś konkretną kolejność operacji. Wykonywane razem operacje te znacznie obciążają maszynę wirtualną i spowalniają ją nieproporcjonalnie do opłaty uiszczonej za wykonanie tych operacji.

W przeszłości był już okres w rozwoju Ethereum, kiedy wielu facetów, którzy szczegółowo rozumieli działanie maszyny wirtualnej, znalazło takie luki. W rzeczywistości transakcje wiązały się z bardzo niewielką opłatą, ale praktycznie spowalniały całą sieć. Problemy te są bardzo trudne do rozwiązania, gdyż należy po pierwsze je ustalić, po drugie dostosować cenę za wykonanie tych operacji i po trzecie przeprowadzić hard fork, czyli aktualizację wszystkich węzłów sieci do nowej wersji oprogramowania, a następnie jednoczesną aktywację tych zmian.

Jeśli chodzi o Ethereum, przeprowadzono wiele badań i zdobyto wiele praktycznych doświadczeń: zarówno pozytywnych, jak i negatywnych, niemniej jednak nadal istnieją trudności i słabe punkty, z którymi nadal trzeba sobie jakoś poradzić.

Tak więc część tematyczna artykułu została zakończona, przejdźmy do pytań, które pojawiają się dość często.

Najczęściej zadawane pytania

— Jeśli wszystkie strony istniejącej inteligentnej umowy chcą zmienić warunki, czy mogą anulować tę inteligentną umowę za pomocą multisig, a następnie utworzyć nową inteligentną umowę ze zaktualizowanymi warunkami jej realizacji?

Odpowiedź tutaj będzie dwojaka. Dlaczego? Bo z jednej strony inteligentny kontrakt jest raz zdefiniowany i nie implikuje już żadnych zmian, a z drugiej strony może mieć z góry napisaną logikę, która przewiduje całkowitą lub częściową zmianę niektórych warunków. Oznacza to, że jeśli chcesz coś zmienić w swojej inteligentnej umowie, musisz określić warunki, na jakich możesz aktualizować te warunki. W związku z tym jedynie w tak ostrożny sposób można zorganizować przedłużenie umowy. Ale i tutaj możesz wpaść w kłopoty: popełnij jakiś błąd i uzyskaj odpowiednią lukę. Dlatego takie rzeczy muszą być bardzo szczegółowe, starannie zaprojektowane i przetestowane.

— A co jeśli mediator zawrze umowę z jedną z uczestniczących stron: depozyt czy inteligentny kontrakt? Czy mediator jest wymagany w inteligentnej umowie?

W przypadku inteligentnej umowy mediator nie jest wymagany. Może nie istnieć. Jeśli w przypadku depozytu mediator wchodzi w spisek z jedną ze stron, to tak, ten schemat wtedy gwałtownie traci całą swoją wartość. Dlatego też mediatorzy dobierani są w taki sposób, aby cieszyły się zaufaniem wszystkich stron zaangażowanych w ten proces jednocześnie. W związku z tym po prostu nie prześlesz monet na adres z wieloma podpisami za pośrednictwem mediatora, któremu nie ufasz.

— Czy w ramach jednej transakcji Ethereum można przenieść wiele różnych tokenów z Twojego adresu na różne adresy docelowe, na przykład adresy wymiany, gdzie handluje się tymi tokenami?

To dobre pytanie i dotyczy modelu transakcyjnego Ethereum i tego, czym różni się on od modelu Bitcoin. A różnica jest radykalna. Jeśli w modelu transakcyjnym Ethereum po prostu przesyłasz monety, to są one przesyłane tylko z jednego adresu na drugi, bez zmian, tylko określoną kwotę. Innymi słowy, nie jest to model niewydanych produktów (UTXO), ale model kont i odpowiadających im sald. Teoretycznie możliwe jest wysłanie kilku różnych tokenów w jednej transakcji na raz, jeśli napiszesz przebiegły inteligentny kontrakt, ale i tak będziesz musiał dokonać wielu transakcji, stworzyć kontrakt, następnie przelać do niego tokeny i monety, a następnie wywołać odpowiednią metodę . Wymaga to wysiłku i czasu, dlatego w praktyce tak nie jest i wszystkie płatności w Ethereum realizowane są w oddzielnych transakcjach.

— Jednym z mitów na temat platformy Ethereum jest to, że nie da się opisać warunków, które będą zależeć od danych zewnętrznego zasobu internetowego, więc co wtedy zrobić?

Rozwiązaniem jest to, że sam inteligentny kontrakt może zapewnić jedną lub więcej tzw. zaufanych wyroczni, które zbierają dane o stanie rzeczy w świecie zewnętrznym i przekazują je do inteligentnych kontraktów specjalnymi metodami. Sama umowa uważa dane, które otrzymała od zaufanych stron, za prawdziwe. Aby uzyskać większą niezawodność, wystarczy wybrać dużą grupę wyroczni i zminimalizować ryzyko ich zmowy. Sama umowa nie może uwzględniać danych z wyroczni, które są sprzeczne z większością.

Temu tematowi poświęcony jest jeden z wykładów kursu online o Blockchain – „Wprowadzenie do inteligentnych kontraktów".

Źródło: www.habr.com

Dodaj komentarz