Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Witam wszystkich!

Niedawno Waves Labs ogłosił konkurs dla programistów poświęcony udostępnieniu rozszerzenia języka inteligentnych kontraktów RIDE dla zdecentralizowanych aplikacji Ride4Dapps do sieci testowej!

Wybraliśmy przypadek DAO, ponieważ ryzykowny planuje rozwój dApps z funkcjami społecznościowymi: głosowaniem, zbieraniem funduszy, zarządzaniem zaufaniem itp.
Zaczęliśmy od prostego przykładu w Sesje pytań i odpowiedzi i JAZDA IDE - przykład z wspólny portfel.

Spójrzmy na ten przykład, przetestuj hipotezy i spójrz na kilka osobliwości:

Miejmy Alice - właścicielkę dApp
Boob i Cooper są partnerami Alice, współzałożycielami Alice-BC DAO
Neli jest właścicielką firmy, która potrzebuje finansowania
Bank – bank zajmujący się dystrybucją tokenów

Etap 1. Inicjalizacja wag

Aby otrzymać tokeny w sieci testowej fal, należy się skontaktować kran i wskaż adres, na który mają zostać przesłane tokeny.
Adres można znaleźć w IDE, otwierając dane swojego konta.
Wyróżniamy Bank 10 FALE. Następnie sprawdzamy, czy dotarły przez przeglądarkę bloków i transakcji: recenzent

Teraz rozdajmy tokeny z banku pozostałym uczestnikom. (Uwagi: wszystkie transakcje w sieci Waves nie są bezpłatne, dlatego aby wszyscy uczestnicy mogli dokonać transakcji, wymagane jest minimalne saldo dodatnie).

1 FALE = 100000000 jednostek (falek), ponieważ kwoty mogą być tylko liczbami całkowitymi
0.01 FALE (Opłata transakcyjna) = 1000000

Bank -> [3 FALE] -> Alicja, poprzez TransferTransaction (Typ: 4).

Sprawdzamy czy env.SEED z którego podpisywane są transakcje jest zgodne z naszym Bankiem:
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Jeśli nie masz pasującej frazy początkowej, po prostu przejdź do niej w zakładce Konta i sprawdź ponownie.
Następnie tworzymy, ogłaszamy i podpisujemy transakcję przeniesienia 3 WAVES Alice.
Dane Alicji możesz także sprawdzić poprzez zmienną env.accounts. Numeracja zaczyna się od 0, więc Alicja to env.accounts[1].
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))

Wynik można obserwować także w przeglądarce, link do niego zostanie nam zwrócony natychmiast po wykonaniu transakcje.

Dbamy o to, aby saldo Alicji zostało uzupełnione 3 FALAMI, a saldo banku pozostało na poziomie 10 - 3 - 0.01 = 0.699.
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

W ten sam sposób wysyłamy Boobowi i Cooperowi po 3 FALE, a Neli, Xenie i Markowi po 0.2 FALI.
(Uwagi: popełniliśmy jeden znak błędu i wysłaliśmy Neli 0.02 FALE. Bądź ostrożny!)

broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))

Po uzupełnieniu sald wszystkich uczestników widzimy:
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Etap 2. Utwórz konto dApp

Uzgodniliśmy, że twórcą i właścicielem zdecentralizowanej aplikacji będzie Alicja.
Przejdź do Kont, ustaw go jako SEED i sprawdź, czy env.SEED pasuje do Alice.

Spróbujmy zainstalować możliwie najprostszy skrypt (umowę) na koncie Alicji.
Inteligentne kontakty w Waves to predykaty, które zabraniają lub zezwalają na wystąpienie dowolnego rodzaju transakcji wychodzącej pod pewnymi warunkami. W tym przypadku ten warunek jest ZAWSZE. Kod kontraktu jest prawdziwy. Wywołaj funkcję wdrażania().

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Opłata za transakcję setScript 1400000/100000000 = 0.014 WAVES. Alicja ma na koncie 2.986 FALI.

Spróbujmy teraz zainstalować na koncie Alice bardziej złożoną logikę inteligentnych kontraktów, opisaną w przykład

Ride4Dapps zawiera teraz 2 nowe typy adnotacji:

  1. @Callable(i) — przyjmuje jako parametr i dane o tym, który rachunek zlecił/podpisał transakcję. To właśnie wynik działania tej funkcji decyduje o zmianie stanu konta dApp. Inne konta mogą tworzyć transakcje i wykonywać funkcje za pomocą tej adnotacji oraz zmieniać stan konta dApp.
  2. @Weryfikator(tx) — Weryfikator transakcji z parametrem tx transakcji. Odpowiada logice predykatów z RIDE. To właśnie w tym wyrażeniu możesz zezwolić lub zabronić dalszych zmian w logice inteligentnych kontraktów na koncie dApp.

Zróbmy dApp konto jako wspólny portfel dla wszystkich uczestników.
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Aby sprawdzić, która umowa jest aktualnie aktywna na Twoim koncie, możesz skopiować kod base64 inteligentnej umowy w eksploratorze bloków i rozpoznać go za pomocą dekompilatora (Przykładowo)
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Dbamy o to, aby logika smart kontraktu była zgodna z naszymi oczekiwaniami.
Alicja ma na koncie 2.972 FALE.

Ta dApp śledzi, ile każdy uczestnik wnosi wkład do wspólnego funduszu za pośrednictwem mechanizmu transakcja danych — DataEntry(currentKey, newAmount), gdzie currentKey to konto wywołujące funkcję depozytu, a newAmount to wartość uzupełnionego salda.

Boob i Cooper dokonują wpłat na konto dApp za pomocą 1 FALI.
Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Popełniamy błąd i transakcja nie dochodzi do skutku. Ponieważ pomimo tego, że byliśmy przekonani, że dokonujemy transakcji w imieniu Boba, popełniliśmy błąd w indeksie i wskazaliśmy rachunek bankowy, który nie posiada inteligentnej umowy. Warto tutaj zwrócić uwagę na ważny punkt – za nieudane próby zainicjowania transakcji pobierana jest opłata nie można usunąć! Alicja ma na koncie 2.972 FALE. Bob ma 3 FALE.

Bob wysłał 1 FALE na konto dApp.

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Bobowi pozostało 1.99 FALI. Oznacza to, że Bob zapłacił 0.01 prowizji WAVES

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Alicja miała na koncie 2.972 FALE, teraz wynosi 3.972. Transakcja została również zarejestrowana na koncie Alice, jednak z konta dApp (Alicja) nie została pobrana prowizja.
Po tym jak Cooper również uzupełnił konto, saldo Alicji wyniosło 4.972 FALE.

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Możesz dowiedzieć się, kto jest właścicielem ilu WAVES we wspólnym portfelu, w eksploratorze bloków w zakładce Dane.

Cooper zmienił zdanie co do pozostawienia kwoty 1 FALI w portfelu ogólnym i zdecydował się wypłacić połowę powinowactwa. Aby to zrobić, musi wywołać funkcję wycofania.

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Jednak znowu się myliliśmy, ponieważ funkcja wypłaty ma zupełnie inne parametry i inną sygnaturę. Projektując inteligentne kontrakty na RIDE4DAPPS, powinieneś zwrócić uwagę na ten punkt

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Cooper ma teraz w bilansie 2.48 FALI. Odpowiednio 3 FALE - 1 - 0.01, a następnie + 0.5 - 0.01. W związku z tym każde wezwanie do wpłaty i wypłaty kosztuje 0.01 FALI. W rezultacie wpisy w tabeli właścicieli dApps zmieniły się w następujący sposób.

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Bob również zdecydował się wypłacić część pieniędzy ze wspólnego portfela, ale popełnił błąd i próbował wypłacić 1.5 FALI.

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Jednak inteligentny kontrakt miał kontrolę nad tą sytuacją.

Xena jest oszustką, próbowała wypłacić 1 FALE z całego konta.

Nauka pisania inteligentnych kontraktów Waves na RIDE i RIDE4DAPPS. Część 1 (Portfel dla wielu użytkowników)

Jej też to nie wyszło.

W kolejnej części przyjrzymy się bardziej złożonym zagadnieniom związanym z niedoskonałością konta Alice dApp.

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

Dodaj komentarz