Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

Cześć wszystkim!

Niedawno Waves Labs ogłosił 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ż Ventuary planowane jest opracowanie dApp z funkcjami społecznymi: głosowaniem, fundraisingiem, zarządzaniem powierniczym itd.
Rozpoczęliśmy pracę od prostego przykładu w sesjach Q&A i w RIDE IDE — przykładzie z wspólnym portfelem.

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 faucet 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: przeglądarka

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:
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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].
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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 transakcji.

Upewniamy się, że saldo Alicji zostało zwiększone o 3 WAVES, a na saldzie banku pozostało 10 — 3 — 0,01 = 0,699.
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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:
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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().

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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 przykładzie

Ride4Dapps teraz obejmuje 2 nowe typy adnotacji:

  1. @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.
  2. @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.
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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 (na przykład)
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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.
Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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 }]}))

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

Bob ma 1,99 WAVES. Oznacza to, że Bob zapłacił 0,01 WAVES prowizji.

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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.

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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.

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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ę.

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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.

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

Jednak w inteligentnym kontrakcie była kontrola tej sytuacji.

Xena to oszustka, próbowała wypłacić 1 WAVES z wspólnego konta.

Uczymy się pisać smart kontrakty Waves w RIDE i RIDE4DAPPS. Część 1 (Portfel wieloosobowy)

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

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster