
Cześć wszystkim!
Niedawno Waves Labs ogłosiło konkurs dla deweloperów z okazji wydania wersji testowej rozszerzenia języka inteligentnych kontraktów RIDE dla zdecentralizowanych aplikacji Ride4Dapps!
Wybraliśmy przypadek DAO, ponieważ planowane jest opracowanie dApp z funkcjami społecznymi: głosowaniem, fundraisingiem, zarządzaniem powierniczym itd.
Rozpoczęliśmy pracę od prostego przykładu w i w — przykładzie z .
Przyjrzyjmy się temu przykładowi, sprawdźmy hipotezy i rozważmy pewne niezwykłości:
Załóżmy, że mamy Alicję — właścicielkę dApp
Boob i Cooper — partnerzy Alicji, współzałożyciele Alice-BC DAO
Neli — właściciel biznesu, który potrzebuje finansowania
Bank — bank, który rozdaje tokeny
Krok 1. Inicjalizacja sald
Aby w testowej sieci waves otrzymać tokeny, trzeba zwrócić się do i podać adres, na który mają być wysłane tokeny.
Adres można poznać w IDE, rozwijając dane konta.
Przydzielamy Bankowi 10 WAVES. Następnie sprawdzamy, że dotarły one przez przeglądarkę bloków i transakcji:
Teraz rozdawajmy tokeny z banku pozostałym uczestnikom. (Uwaga: Wszystkie transakcje w sieci waves nie są darmowe, dlatego każdy uczestnik musi mieć minimalne dodatnie saldo, aby móc przeprowadzać transakcje).
1 WAVES = 100000000 jednostek (wavelets), ponieważ kwoty mogą być tylko liczbowe
0.01 WAVES (opłata za transakcję) = 1000000
Bank -> [3 WAVES] -> Alice, przez TransferTransaction (Typ: 4).
Sprawdzamy, że env.SEED, za pomocą którego podpisywane są transakcje, odpowiada naszemu Bankowi:


Jeśli nie masz odpowiednio pasujących fraz seed, po prostu przełącz się na nie w zakładce Konta i sprawdź jeszcze raz.
Następnie tworzymy, ogłaszamy i podpisujemy transakcję przekazania 3 WAVES Alicji.
Dane Alicji można również poznać przez zmienną env.accounts. Numeracja zaczyna się od 0, więc Alicja to env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Wynik można również obserwować w przeglądarce, a link do niej zwróci nam się natychmiast po wykonaniu .
Upewniamy się, że saldo Alicji zostało zwiększone o 3 WAVES, a na saldzie banku pozostało 10 — 3 — 0,01 = 0,699.


Wysyłamy Boob i Cooper po 3 WAVES, a Neli, Xenę i Marka po 0,2 WAVES w ten sam sposób.
(Uwaga: Popełniliśmy błąd o jeden znak i wysłaliśmy Neli 0,02 WAVES. Uważajcie!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Po zasileniu sald wszystkich uczestników widzimy:

Krok 2. Tworzenie konta dApp
Ustaliliśmy, że twórcą i właścicielem zdecentralizowanej aplikacji będzie Alice.
Przechodzimy do sekcji Konta, ustawiamy ją jako SEED i sprawdzamy, czy env.SEED odpowiada Alice.
Spróbujemy zainstalować na koncie Alice najprostszy skrypt (kontrakt) z dostępnych.
Smart kontrakty w Waves to predykaty, które zabraniają lub pozwalają na wykonanie danej transakcji wyjściowej pod określonymi warunkami. W tym przypadku warunkiem jest ALWAYS. Kod kontraktu to true. Wywołujemy deploy().

Opłata za transakcję setScript wynosi 1400000/100000000 = 0.014 WAVES. Alice pozostało na saldzie 2.986 WAVES.
Teraz spróbujemy zainstalować na koncie Alice bardziej złożoną logikę smart kontraktu opisaną w
Ride4Dapps teraz obejmuje 2 nowe typy adnotacji:
- @Callable(i) — przyjmuje jako parametr i, dane o tym, który konto wywołało/podpisało transakcję. To właśnie wynik tej funkcji decyduje o zmianie stanu konta dApp. Inne konta mogą tworzyć transakcje i wykonać funkcje z tą adnotacją, zmieniając stan konta dApp.
- @Verifier(tx) — Weryfikator transakcji z parametrem tx transakcji. Odnosi się do logiki predykatów z RIDE. To w tym wyrażeniu można zezwolić lub zakazać dalsze zmiany logiki smart kontraktów na koncie dApp.
Zróbmy dApp konto jako wspólny portfel dla wszystkich uczestników.

Aby sprawdzić, który kontrakt jest aktualnie aktywny na koncie, można w eksploratorze bloków skopiować kod base64 smart kontraktu i zidentyfikować go za pomocą dekompilatora ()



Upewniamy się, że logika smart kontraktu odpowiada naszym oczekiwaniom.
Alice pozostało na saldzie 2.972 WAVES.
Ten dApp śledzi, ile wnosi każdy z uczestników do wspólnego funduszu poprzez mechanizm data transaction — DataEntry(currentKey, newAmount), gdzie currentKey to konto, które wywołuje funkcję deposit, a newAmount to wartość zasilonego salda.
Bob i Cooper wpłacają swoje depozyty na konto dApp po 1 WAVES.

Popełniamy błąd i transakcja nie przechodzi. Mimo że upewniliśmy się, że wykonujemy transakcję w imieniu Boba, pomyliliśmy się w indeksie i wskazaliśmy konto Bank, na którym nie ma smart kontraktu. Należy tutaj zaznaczyć, że za nieudane próby inicjowania transakcji opłata nie jest pobierana! Alice pozostało na saldzie 2.972 WAVES. Bob ma 3 WAVES.
Bob wysłał 1 WAVES na konto dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob ma 1,99 WAVES. Oznacza to, że Bob zapłacił 0,01 WAVES prowizji.

Alice miała na koncie 2,972 WAVES, teraz ma 3,972. Na koncie Alice zarejestrowano również transakcję, jednak z konta dApp (Alice) nie pobrano żadnej prowizji.
Po tym, jak Cooper również zasilił konto Alice, na jej saldzie pojawiło się 4,972 WAVES.

Można sprawdzić, ile WAVES należy do kogo w wspólnym portfelu w eksploratorze bloków w zakładce Dane.
Cooper zmienił zdanie co do pozostawienia kwoty 1 WAVES w wspólnym portfelu i postanowił wypłacić połowę środków. W tym celu musi wywołać funkcję withdraw.

Jednak znowu się pomyliliśmy, ponieważ funkcja withdraw ma zupełnie inne parametry, inną sygnaturę. Przy projektowaniu inteligentnych kontraktów na RIDE4DAPPS należy zwrócić na to uwagę.

Cooper ma 2,48 WAVES na swoim koncie. Odpowiednio 3 WAVES - 1 - 0,01, a potem + 0,5 - 0,01. Zatem każde wywołanie deposit i withdraw kosztuje 0,01 WAVES. W rezultacie w tabeli właścicieli dApps zapisy zmieniły się w następujący sposób.

Bob również postanowił wycofać pewną kwotę z wspólnego portfela, ale się pomylił i spróbował wypłacić 1,5 WAVES.

Jednak w inteligentnym kontrakcie była kontrola tej sytuacji.
Xena to oszustka, próbowała wypłacić 1 WAVES z wspólnego konta.

Też jej się nie udało.
W następnej części omówimy bardziej złożone kwestie związane z niedoskonałością konta dApp Alice.
Źródło: habr.com
