
Mindenkinek szia!
Nemrégiben a Waves Labs versenyt hirdetett a fejlesztők számára a RIDE okos szerződés nyelv tesztelési hálózatra való kibővítése kapcsán, a decentralizált alkalmazásokhoz készült Ride4Dapps!
A DAO esettanulmányt választottuk, mert tervez dApp fejlesztésével foglalkozni, amely társadalmi funkciókkal bír: szavazás, crowdfunding, bizalmi kezelés stb.
Egy egyszerű példával kezdtük a munkát és a — példa alapján .
Nézzük meg ezt a példát, ellenőrizzük a hipotéziseket, és nézzük meg néhány furcsaságot:
Legyen Alice — dApp tulajdonos
Boob és Cooper — Alice partnerei, az Alice-BC DAO társalapítói
Neli — az üzlet tulajdonosa, aki finanszírozásra vágyik
Bank — a tokeneket kiosztó bank
1. lépés. A egyenlegek inicializálása
Ahhoz, hogy a waves teszt-hálózatban tokeneket kapjunk, meg kell keresni a és megadni a címet, ahova a tokeneket küldeni kell.
A címet az IDE-ben lehet megtudni, az akkuntadatok kibővítésével.
Jelöljük ki a Bankot 10 WAVES-szel. Ezután ellenőrizzük, hogy megérkeztek-e a blokklánc és tranzakciók böngészőjén keresztül:
Most adjuk ki a tokeneket a bankból a többi résztvevőnek. (Megjegyzés: Minden tranzakció a waves hálózatában nem ingyenes, ezért minden résztvevőnek minimális pozitív egyensúllyal kell rendelkeznie, hogy tranzakciókat végezhessenek).
1 WAVES = 100000000 egység (wavelets), mivel az összeg csak egész szám lehet
0.01 WAVES (tranzakciós díj) = 1000000
Bank -> [3 WAVES] -> Alice, a TransferTransaction (Típus: 4) segítségével.
Ellenőrizzük, hogy az env.SEED, amivel a tranzakciókat aláírják, egyezik-e a Bank-kal:


Ha nincs megfelelő seed kifejezése, egyszerűen válts át rá az Accounts lapon, és ellenőrizd újra.
Ezután létrehozzuk, bejelentjük és aláírjuk a tranzakciót, amelyben 3 WAVES-t küldünk Alice-nak.
Alice adatait az env.accounts változón keresztül is meg lehet tudni. A számozás 0-ról indul, így Alice az env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Az eredményt a böngészőben is figyelemmel kísérhetjük, egy hivatkozást visszakapunk azonnal a tranzakció végrehajtása után. .
Meggyőződünk róla, hogy Alice egyenlege 3 WAVES-szel nőtt, míg a bank egyenlege 10 — 3 — 0.01 = 0.699 maradt.


Küldjünk Boob-nak és Cooper-nek 3 WAVES-t, Nelinek, Xenának és Mark-nak 0.2 WAVES-t ugyanígy.
(Megjegyzés: Hibát vétettünk egy számjegyben és Nelinek 0.02 WAVES-t küldtünk. Legyetek figyelmesek!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Miután minden résztvevő egyenlegét feltöltöttük, így állunk:

2. lépés. dApp fiók létrehozása
Megállapodtunk abban, hogy a decentralizált alkalmazás létrehozója és tulajdonosa Alice lesz.
Az Accounts-ba lépve beállítjuk őt SEED-ként, és ellenőrizzük, hogy az env.SEED megfelel-e Alice-nak.
Próbáljuk meg telepíteni Alice fiókjára a lehető legegyszerűbb szkriptet (szerződést).
A Waves okos szerződései azokat a predikátumokat képviselik, amelyek megakadályozzák vagy lehetővé teszik egy adott kimenő tranzakciók végrehajtását bizonyos feltételek mellett. Ebben az esetben ez a feltétel: ALWAYS. A szerződés kódja: true. Hívjuk meg a deploy()-t.

A setScript tranzakció díja 1400000/100000000 = 0.014 WAVES. Alice egyenlegén 2.986 WAVES maradt.
Próbáljuk meg most egy bonyolultabb logikájú okos szerződést telepíteni Alice fiókjára, amely a
Ride4Dapps most két új típusú annotációt tartalmaz:
- @Callable(i) — i paraméterként fogadja el az adatokat arról, hogy melyik fiók indította/aláírta a tranzakciót. Ennek a funkciónak az eredménye határozza meg a dApp fiók állapotának megváltozását. Más fiókok tranzakciókat indíthatnak és végrehajthatják a funkciókat ezzel a megjegyzéssel, megváltoztatva a dApp fiók állapotát.
- @Verifier(tx) — Tranzakció verifikálója a tx tranzakció paraméterrel. A RIDE predikátumainak logikáját követi. Csak ebben a kifejezésben lehet engedélyezni vagy megtiltani a dApp fiók okos szerződéseinek logikájának későbbi módosítását.
Lépjünk a jövő felé, dApp a fiók közös tárcaként minden résztvevő számára.

Annak ellenőrzéséhez, hogy jelenleg melyik szerződés aktív a fiókon, a blokk böngészőjében másoljuk ki az okos szerződés base64 kódját, és ismerjük fel a dekompilátor segítségével ()



Győződjünk meg róla, hogy az okos szerződés logikája megfelel az elvárásainknak.
Alice egyenlegén 2.972 WAVES maradt.
Ez a dApp nyilvántartja, hogy a résztvevők mennyit hozzájárulnak a közös alaphoz a data transaction — DataEntry(currentKey, newAmount), ahol currentKey az a fiók, amely meghívja a deposit funkciót, míg newAmount a feltöltött egyenleg értéke.
Bob és Cooper 1 WAVES betétet helyeznek el a dApp fiókba.

Hibát engedünk meg, és a tranzakció nem megy át. Mivel annak ellenére, hogy megbizonyosodtunk arról, hogy Bob nevében indítunk tranzakciót, hibát vétettünk az indexben, és a Bank fiókot adtuk meg, amin nincs okos szerződés. Itt fontos megjegyezni — a sikertelen tranzakciós kezdeményezésekért díjat nem számítanak fel! Alice egyenlegén 2.972 WAVES maradt. Bob-nak 3 WAVES van.
Bob 1 WAVES-t küldött a dApp fióknak.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob-nak maradt 1,99 WAVES. Tehát Bob 0,01 WAVES díjat fizetett.

Alice egyenlege 2,972 WAVES volt, most 3,972. Az Alice fiókjához is társított tranzakció, azonban a dApp Account (Alice) esetében nem volt levonva díj.
Miután Cooper is feltöltötte Alice számláját, az egyenleg 4,972 WAVES lett.

Arról, hogy kinek mennyi WAVES van a közös pénztárcában, a blokklánc böngészője 'Data' fülén keresztül tájékozódhatunk.
Cooper meggondolta magát, és úgy döntött, hogy nem hagy 1 WAVES-t a közös pénztárcában, hanem az összeg felezésére törekszik. Ehhez meg kell hívnia a withdraw funkciót.

Azonban ismét tévedtünk, mivel a withdraw funkciónak teljesen más paraméterei, különböző szignatúrája van. Amikor a smartraktárakat RIDE4DAPPS-ban tervezitek, figyelni kell erre a pontra.

Cooper egyenlege 2,48 WAVES lett. Ennek megfelelően: 3 WAVES - 1 - 0,01, majd + 0,5 - 0,01. Ennek megfelelően minden deposit és withdraw hívás 0,01 WAVES-be kerül. Végül a dApps tulajdonosainak táblázatában az adatok a következőképpen változtak meg.

Bob is úgy döntött, hogy kivon egy kis pénzt a közös pénztárcából, de tévedett, és 1,5 WAVES-t akart kivonni.

Azonban a smartraktárban volt egy ellenőrzés az ilyen helyzetekre.
Xena csaló, megpróbálta kivonni az 1 WAVES-t a közös számláról.

Neki sem sikerült.
A következő részben bonyolultabb kérdésekkel foglalkozunk, amelyek Alice dApp Account-jának tökéletlenségeivel kapcsolatosak.
Forrás: habr.com
