Pozdravljeni vsi!
Nedavno, Waves Labs
Izbrali smo primer DAO, ker
Začeli smo s preprostim primerom v
Poglejmo ta primer, preizkusimo hipoteze in poglejmo nekaj nenavadnosti:
Naj imamo Alice - lastnico dApp
Boob in Cooper sta partnerja Alice, soustanovitelja Alice-BC DAO
Neli je lastnica podjetja, ki potrebuje financiranje
Banka - banka, ki distribuira žetone
Faza 1. Inicializacija bilanc
Če želite prejeti žetone v testnem omrežju waves, se morate obrniti
Naslov najdete v IDE tako, da odprete podatke o svojem računu.
Izpostavljamo banko 10 WAVES. Nato preverimo, ali so prispeli prek brskalnika blokov in transakcij:
Sedaj pa razdelimo žetone iz banke ostalim udeležencem. (Opombe: Vse transakcije v omrežju Waves niso brezplačne, zato je za vse udeležence potrebno minimalno pozitivno stanje za transakcije).
1 VALOVI = 100000000 enot (wavelets), saj so lahko zneski samo cela števila
0.01 WAVES (transakcijska provizija) = 1000000
Banka -> [3 VALOVI] -> Alice, prek TransferTransaction (tip: 4).
Preverimo, ali se env.SEED, iz katerega se podpisujejo transakcije, ujema z našo banko:

Če nimate ujemajočega semenskega izraza, preprosto preklopite nanj v zavihku Računi in znova preverite.
Po tem ustvarimo, objavimo in podpišemo transakcijo za prenos 3 WAVES Alice.
Alicine podatke lahko najdete tudi prek spremenljivke env.accounts. Številčenje se začne z 0, zato je Alice env.accounts[1].
broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
Rezultat lahko opazujemo tudi v brskalniku, povezava do njega se nam vrne takoj po izvedbi
Poskrbimo, da se Alicino stanje napolni s 3 VALOVI, bančno stanje pa ostane 10 - 3 - 0.01 = 0.699.
Boobu in Cooperju pošljemo po 3 VALOVE, Neli, Xeni in Marku pa na enak način po 0.2 VALOVA.
(Opombe: naredili smo napako z enim znakom in poslali Neli 0.02 WAVES. Bodite previdni!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
Po dopolnitvi stanja vseh udeležencev vidimo:
Faza 2. Ustvarite račun dApp
Dogovorili smo se, da bo Alice ustvarjalka in lastnica decentralizirane aplikacije.
Pojdite v Računi, ga nastavite kot SEED in preverite, ali se env.SEED ujema z Alice.
Poskusimo namestiti čim bolj preprosto skripto (pogodbo) na Alicin račun.
Pametni stiki v Waves so predikati, ki pod določenimi pogoji prepovedujejo ali dovoljujejo kakršno koli vrsto odhodne transakcije. V tem primeru je ta pogoj VEDNO. Koda pogodbe je resnična. Pokliči deploy().
Provizija na transakcijo setScript 1400000/100000000 = 0.014 WAVES. Alice ima na stanju še 2.986 VALOV.
Poskusimo zdaj namestiti bolj zapleteno logiko pametnih pogodb na račun Alice, opisano v
Ride4Dapps zdaj vključuje 2 novi vrsti opomb:
- @Callable(i) — kot parameter i vzame podatke o tem, kateri račun je poklical/podpisal transakcijo. Rezultat te funkcije je tisti, ki določa spremembo stanja računa dApp. Drugi računi lahko ustvarjajo transakcije in izvajajo funkcije s to opombo ter spremenijo stanje računa dApp.
- @Verifier(tx) — Preverjevalec transakcije s parametrom transakcije tx. Ustreza predikatni logiki iz RIDE. V tem izrazu lahko dovolite ali prepoveste nadaljnje spremembe logike pametnih pogodb na računu dApp.
Naredimo dApp račun kot skupna denarnica za vse udeležence.
Če želite preveriti, katera pogodba je trenutno aktivna na vašem računu, lahko kopirate kodo base64 pametne pogodbe v raziskovalcu blokov in jo prepoznate z dekompilatorjem (
Poskrbimo, da se logika pametne pogodbe ujema s tem, kar pričakujemo.
Alice ima na stanju še 2.972 VALOV.
Ta dApp preko mehanizma spremlja, koliko vsak udeleženec prispeva v skupni sklad podatkovna transakcija — DataEntry(currentKey, newAmount), kjer je currentKey račun, ki kliče funkcijo depozita, newAmount pa je vrednost dopolnjenega stanja.
Boob in Cooper nakažeta na račun dApp z 1 WAVES.
Naredimo napako in transakcija ne uspe. Ker smo kljub temu, da smo bili prepričani, da delamo transakcijo v imenu Boba, naredili napako v indeksu in navedli bančni račun, ki nima pametne pogodbe. Tukaj je treba omeniti pomembno točko - za neuspešne poskuse sprožitve transakcij se zaračuna pristojbina ni mogoče odstraniti! Alice ima na stanju še 2.972 VALOV. Bob ima 3 VALOVE.
Bob je poslal 1 WAVES na račun dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob ima še 1.99 WAVES. To pomeni, da je Bob plačal 0.01 provizije WAVES
Alice je imela 2.972 WAVES na svojem ravnotežju, zdaj je 3.972. Transakcija je bila zabeležena tudi na računu Alice, vendar z računa dApp (Alice) ni bila zaračunana provizija.
Ko je tudi Cooper napolnil račun, je Alicino stanje postalo 4.972 WAVES.
Kdo ima v lasti koliko WAVES v skupni denarnici, lahko ugotovite v raziskovalcu blokov na zavihku Podatki.
Cooper si je premislil, da bi znesek 1 WAVES pustil v splošni denarnici, in se odločil, da umakne polovico afinitete. Za to mora poklicati funkcijo umika.
Vendar smo se spet zmotili, saj ima funkcija dviga popolnoma druge parametre in drugačen podpis. Ko oblikujete pametne pogodbe na RIDE4DAPPS, morate biti pozorni na to točko
Cooper ima zdaj v svoji bilanci stanja 2.48 WAVES. V skladu s tem 3 VALOVI - 1 - 0.01 in nato + 0.5 - 0.01. V skladu s tem vsak klic za polog in dvig stane 0.01 WAVES. Posledično so se vnosi v tabeli lastnikov dApps spremenili na naslednji način.
Tudi Bob se je odločil dvigniti nekaj denarja iz skupne denarnice, vendar je naredil napako in poskušal dvigniti 1.5 WAVES.
Vendar je imela pametna pogodba ček za to situacijo.
Xena je prevarant, poskušala je dvigniti 1 WAVES s celotnega računa.
Tudi njej se ni izšlo.
V naslednjem delu si bomo ogledali bolj zapletena vprašanja, povezana z nepopolnostjo računa Alice dApp.
Vir: www.habr.com