Pozdrav!
Nedavno, Waves Labs
Izabrali smo DAO slučaj jer
Počeli smo s jednostavnim primjerom u
Pogledajmo ovaj primjer, testirajmo hipoteze i pogledajmo neke neobičnosti:
Dopustite nam Alice - vlasnicu dApp-a
Boob i Cooper su Alice partneri, suosnivači Alice-BC DAO
Neli je vlasnica tvrtke kojoj je potrebno financiranje
Banka - banka koja distribuira tokene
Faza 1. Inicijalizacija stanja
Kako biste dobili tokene na testnoj mreži waves, trebate kontaktirati
Adresu možete pronaći u IDE-u tako da otvorite podatke o svom računu.
Izdvajamo banku 10 WAVES. Zatim provjeravamo jesu li stigli kroz preglednik blokova i transakcija:
Sada podijelimo tokene iz banke ostalim sudionicima. (Napomene: Sve transakcije na mreži Waves nisu besplatne, stoga je za sve sudionike potreban minimalni pozitivni saldo za obavljanje transakcija).
1 VALOVI = 100000000 jedinica (wavelets), budući da iznosi mogu biti samo cijeli brojevi
0.01 WAVES (transakcijska naknada) = 1000000
Banka -> [3 VALA] -> Alice, putem TransferTransaction (Tip: 4).
Provjeravamo da env.SEED iz kojeg se potpisuju transakcije odgovara našoj banci:

Ako nemate odgovarajuću početnu frazu, samo se prebacite na nju u kartici Računi i provjerite ponovno.
Nakon toga kreiramo, najavljujemo i potpisujemo transakciju za prijenos 3 WAVES Alice.
Također možete saznati Aliceine podatke putem varijable env.accounts. Numeriranje 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đer može vidjeti u pregledniku, poveznica na njega bit će nam vraćena odmah nakon izvršenja
Osiguravamo da se Alicein saldo nadopuni za 3 VALA, a saldo banke ostane na 10 - 3 - 0.01 = 0.699.
Boobu i Cooperu šaljemo po 3 VALA, a Neli, Xeni i Marku po 0.2 VALA na isti način.
(Napomene: napravili smo pogrešku od jednog znaka i poslali Neli 0.02 VALOVA. Budite oprezni!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
Nakon nadopunjavanja stanja svih sudionika, vidimo:
Faza 2. Napravite dApp račun
Dogovorili smo se da će Alice biti kreator i vlasnik decentralizirane aplikacije.
Idite na Računi, postavite ga kao SEED i provjerite env.SEED odgovara Alice.
Pokušajmo instalirati najjednostavniju moguću skriptu (ugovor) na Alicin račun.
Pametni kontakti u Wavesu su predikati koji zabranjuju ili dopuštaju bilo koju vrstu odlazne transakcije pod određenim uvjetima. U ovom slučaju, ovo stanje je UVIJEK. Kod ugovora je istinit. Poziv deploy().
Naknada po setScript transakciji 1400000/100000000 = 0.014 WAVES. Alice ima 2.986 VALOVA na saldu.
Pokušajmo sada instalirati složeniju logiku pametnog ugovora na račun Alice, opisanu u
Ride4Dapps sada uključuje 2 nove vrste komentara:
- @Poziv(i) — kao parametar i uzima podatak o tome koji je račun pozvao/potpisao transakciju. Rezultat ove funkcije određuje promjenu stanja dApp računa. Drugi računi mogu stvarati transakcije i izvršavati funkcije s ovom napomenom i mijenjati stanje dApp računa.
- @Verifikator(tx) — Verifikator transakcije s parametrom transakcije tx. Odgovara logici predikata iz RIDE. Upravo u ovom izrazu možete dopustiti ili zabraniti daljnje promjene logike pametnih ugovora na dApp računu.
Učinimo dApp račun kao zajednički novčanik za sve sudionike.
Kako biste provjerili koji je ugovor trenutno aktivan na vašem računu, možete kopirati base64 kod pametnog ugovora u block explorer i prepoznati ga pomoću dekompilatora (
Osiguravamo da logika pametnog ugovora odgovara onome što očekujemo.
Alice ima još 2.972 VALOVA na saldu.
Ova dApp prati koliko svaki sudionik doprinosi zajedničkom fondu putem mehanizma podatkovna transakcija — DataEntry(currentKey, newAmount), gdje je currentKey račun koji poziva funkciju depozita, a newAmount je vrijednost nadopunjenog stanja.
Boob i Cooper polažu svoje depozite na dApp račun s 1 WAVES.
Pogriješimo i transakcija ne prolazi. Budući da smo, unatoč tome što smo bili uvjereni da radimo transakciju u ime Boba, pogriješili u indeksu i naveli bankovni račun koji nema pametni ugovor. Ovdje vrijedi napomenuti važnu točku - postoji naknada za neuspješne pokušaje pokretanja transakcija ne može se ukloniti! Alice ima još 2.972 VALOVA na saldu. Bob ima 3 VALA.
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 još 1.99 VALOVA. To jest, Bob je platio 0.01 WAVES provizije
Alisa je imala 2.972 VALA na svom saldu, sada je 3.972. Također je evidentirana transakcija na Alice računu, ali nije naplaćena provizija s dApp računa (Alice).
Nakon što je i Cooper dopunio račun, Alicein saldo je postao 4.972 VALOVA.
Tko posjeduje koliko WAVES-a u zajedničkom novčaniku možete saznati u block exploreru na kartici Podaci.
Cooper se predomislio oko ostavljanja iznosa od 1 WAVES na općem novčaniku i odlučio povući polovicu afiniteta. Da bi to učinio, mora pozvati funkciju povlačenja.
No, opet smo bili u krivu, budući da funkcija povlačenja ima sasvim druge parametre i drugačiji potpis. Kada dizajnirate pametne ugovore na RIDE4DAPPS, trebali biste obratiti pozornost na ovu točku
Cooper sada ima 2.48 WAVES u svojoj bilanci. Prema tome, 3 VALA - 1 - 0.01, a zatim + 0.5 - 0.01. Sukladno tome, svaki poziv za uplatu i isplatu košta 0.01 WAVES. Kao rezultat toga, unosi u tablici vlasnika dApps promijenili su se na sljedeći način.
Bob je također odlučio podići nešto novca iz zajedničkog novčanika, ali je pogriješio i pokušao podići 1.5 VALOVA.
Međutim, pametni ugovor je imao provjeru za ovu situaciju.
Xena je prevarant, pokušala je povući 1 WAVES s ukupnog računa.
Ni njoj to nije išlo.
U sljedećem ćemo dijelu pogledati složenija pitanja vezana uz nesavršenost Alice dApp računa.
Izvor: www.habr.com