
Pozdrav svima!
Nedavno su Waves Labs organizovali konkurs za programere povodom lansiranja testne mreže proširenja jezika pametnih ugovora RIDE za decentralizovane aplikacije Ride4Dapps!
Odabrali smo DAO slučaj, jer planira da se bavi razvojem dApp-a sa društvenim funkcijama: glasanje, prikupljanje sredstava, upravljanje poverljivošću itd.
Počeli smo s jednostavnim primerom u i u — primer s .
Hajde da analiziramo ovaj primer, proverimo hipoteze i razmotrimo neke neobičnosti:
Pretpostavimo da imamo Alice — vlasnika dApp-a
Boob i Cooper — partneri Alice, suosnivači Alice-BC DAO
Neli — vlasnik biznisa kojem je potrebna finansijska sredstva
Bank — banka koja deli tokene
Faza 1. Inicijalizacija bilansa
Da biste dobili tokene na testnoj mreži Waves, potrebno je obratiti se i navesti adresu na koju će biti poslati tokeni.
Adresu možete saznati u IDE-u, otkrivajući podatke o računu.
Dodeljujemo Banku 10 WAVES. Nakon toga proveravamo da li su stigli putem preglednika blokova i transakcija:
Sada dodeljujemo tokene iz banke ostalim učesnicima. (Napomena: Sve transakcije na Waves mreži nisu besplatne, stoga svi učesnici moraju imati minimalni pozitivan balans da bi izvršavali transakcije).
1 WAVES = 100000000 jedinica (wavelets), jer amounts mogu biti samo celobrojni
0.01 WAVES (Naknada za transakciju) = 1000000
Bank -> [3 WAVES] -> Alice, putem TransferTransaction (Tip: 4).
Proveravamo da li env.SEED, od kojeg se potpisuju transakcije, odgovara našem Bank:


Ako nemate odgovarajući seed frazu, jednostavno prebacite se na njega u kartici Računi i proverite ponovo.
Nakon toga kreiramo, najavljujemo i potpisujemo transakciju o prenosu 3 WAVES Alice.
Podatke o Alici možete saznati i putem varijable env.accounts. Numerisanje počinje od 0, tako da je Alice env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Rezultat se takođe može posmatrati u pregledniku, link na njega biće nam vraćen odmah nakon izvršenja .
Poveravamo da je Alice-ov balans uvećan za 3 WAVES, dok je na balansu banke ostalo 10 — 3 — 0.01 = 0.699.


Šaljemo Boobu i Cooperu po 3 WAVES, a Neli, Xenai i Marku po 0.2 WAVES na isti način.
(Napomena: Napravili smo grešku na jedan znak i poslali Neli 0.02 WAVES. Budite oprezni!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Nakon dopunjavanja balansa svih učesnika vidimo:

Faza 2. Kreiranje dApp računa
Dogovorili smo se da će kreator i vlasnik decentralizirane aplikacije biti Alice.
U Accounts prelazimo, postavljamo je kao SEED i provjeravamo da li env.SEED odgovara Alice.
Pokušajmo postaviti na račun Alice najjednostavniji skript (ugovor) koji je moguć.
Pametni ugovori u Waves su predikati koji zabranjuju ili dopuštaju izvršenje određenog tipa odlazne transakcije pod određenim uvjetima. U ovom slučaju uvjet je — ALWAYS. Kod ugovora — true. Pozivamo deploy().

Naknada za setScript transakciju je 1400000/100000000 = 0.014 WAVES. Alice ima na računu još 2.986 WAVES.
Sada ćemo pokušati postaviti na račun Alice složeniju logiku pametnog ugovora, opisanu u
Ride4Dapps sada uključuje 2 nova tipa anotacija:
- @Callable(i) — prihvaća kao parametar i, podatke o tome koji je račun pozvao/potpisao transakciju. Upravo rezultat ove funkcije određuje promjenu stanja dApp računa. Drugi računi mogu kreirati transakcije i izvršavati funkcije s ovom anotacijom i mijenjati stanje dApp računa.
- @Verifier(tx) — Verifikator transakcije s parameterom tx transakcije. Odgovara logici predikata iz RIDE. Upravo u ovom izrazu možete dopustiti ili zabraniti daljnje promjene logike pametnih ugovora na dApp računu.
Hajde da učinimo dApp račun zajedničkim novčanikom za sve sudionike.

Kako bismo provjerili koji je trenutno aktivan ugovor na računu, možete u pretraživaču blokova kopirati base64 kod pametnog ugovora i prepoznati ga preko dekompilatora ()



Uvjereni smo da logika pametnog ugovora odgovara onome što očekujemo.
Alice ima na računu još 2.972 WAVES.
Ovaj dApp vodi evidenciju o tome koliko svaki od sudionika ulaže u zajednički fond putem mehanizma data transaction — DataEntry(currentKey, newAmount), gdje je currentKey račun koji poziva funkciju deposit, a newAmount je vrijednost dopunjenog stanja.
Bob i Cooper ulažu svoje depozite na dApp račun po 1 WAVES.

Pogriješimo i transakcija ne prolazi. Iako smo se uvjerili da radimo transakciju u ime Boba, pogriješili smo u indeksu i naveli račun Bank, na kojem nema pametnog ugovora. Ovdje valja naglasiti važnu stvar — za neuspješne pokušaje iniciranja transakcija naknada se ne naplaćuje! Alice ima na računu još 2.972 WAVES. Bob ima 3 WAVES.
Bob je poslao 1 WAVES na dApp račun.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob ima 1.99 WAVES. To znači da je Bob platio 0.01 WAVES kao naknadu.

Alice je imala 2.972 WAVES na svom računu, sada ima 3.972. Na računu Alice također je registrirana transakcija, međutim, s dApp računom (Alice) nije naplaćena nikakva naknada.
Nakon što je Cooper također uplatio novac, saldo Alice iznosi 4.972 WAVES.

Informacije o tome koliko WAVES pripada svakom korisniku u zajedničkom novčaniku mogu se pronaći u pregledniku blokova pod karticom Podaci.
Cooper je odlučio ne ostavljati iznos od 1 WAVES u zajedničkom novčaniku i odlučio je povući polovicu sredstava. Za to mora pozvati funkciju withdraw.

Međutim, opet smo pogriješili, jer funkcija withdraw ima sasvim druge parametre, drugačiju potpisu. Kada projektirate pametne ugovore na RIDE4DAPPS, trebate obratiti pažnju na ovu točku.

Cooper ima 2.48 WAVES na svom računu. Dakle, 3 WAVES — 1 — 0.01, a zatim + 0.5 — 0.01. Tako da svaki poziv deposit i withdraw košta 0.01 WAVES. U konačnici, u tablici vlasnika dApps, zapisi su se promijenili na sljedeći način.

Bob je također odlučio povući neki iznos iz zajedničkog novčanika, ali je pogriješio i pokušao je izvući 1.5 WAVES.

Međutim, pametni ugovor imao je provjeru za takvu situaciju.
Xena je prevarantica, pokušala je izvući 1 WAVES iz zajedničkog računa.

Njoj također nije uspjelo.
U sljedećem dijelu razmotrit ćemo složenije aspekte povezane s nesavršenostima Alice dApp računa.
Izvor: habr.com
