
Përshëndetje të gjithëve!
Së fundmi, Waves Labs një konkurs për zhvilluesit që lidhet me shpalljen e rrjetit testues të zgjerimit të gjuhës së kontratave inteligjente RIDE për aplikacione të decentralizuara Ride4Dapps!
Ne zgjodhëm rastin DAO, pasi planifikon të merret me zhvillimin e një dApp me funksione sociale: votim, mbledhje fondesh, menaxhim të besuar etj.
Ne filluam punën me një shembull të thjeshtë në dhe në — shembulli me .
Le të shqyrtojmë këtë shembull, të testojmë hipotezat dhe të shqyrtojmë disa çudira:
Le të supozojmë se kemi Alice — Pronarin e dApp
Boob dhe Cooper — partnerët e Alice, bashkëthemeluesit e Alice-BC DAO
Neli — pronari i biznesit, i cili ka nevojë për financimin
Bank — banka që ndan tokene
Hapi 1. Inizializimi i bilanceve
Për të marrë tokene në rrjetin testues waves, duhet të kontaktoni dhe të specifikoni adresën në të cilën do të dërgoni tokene.
Adresa mund të merret në IDE, duke zgjatur të dhënat e llogarisë.
Ajo që ndodh është Banku ndan 10 WAVES. Më pas kontrolloni nëse ato kanë mbërritur përmes shikuesit të bllokëve dhe transaksioneve:
Tani le të ndani tokene nga banka me pjesëmarrësit e tjerë. (Shënim: Të gjitha transaksionet në rrjetin waves nuk janë falas, prandaj është e nevojshme që të gjithë pjesëmarrësit të kenë një bilanc minimal pozitiv për të kryer transaksione).
1 WAVES = 100000000 Njësi (wavelets), pasi shumat mund të jenë vetëm integer
0.01 WAVES (Tarifa e Transaksionit) = 1000000
Bank -> [3 WAVES] -> Alice, përmes TransferTransaction (Tipi: 4).
Kontrolloni nëse env.SEED, me të cilin nënshkruhen transaksionet korrespondon me Bankën tonë:


Nëse nuk keni përputhje me frazën seed, thjesht kaloni në të në rendin e Llogarive dhe kontrolloni përsëri.
Pas kësaj, krijojmë, shpallim dhe nënshkruajmë transaksionin për transferimin e 3 WAVES Alice.
Të dhënat rreth Alicës mund të merren gjithashtu përmes variablit env.accounts. Numerimi fillon nga 0, prandaj Alice është env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Rezultatin mund ta shihni gjithashtu në shikues, lidhja për të do të kthehet menjëherë pas ekzekutimit .
Sigurohuni që bilanci i Alicës të jetë rritur me 3 WAVES, ndërsa bilanci i bankës ka mbetur 10 — 3 — 0.01 = 0.699.


Dërgoni Boob dhe Cooper nga 3 WAVES, dhe Neli, Xena dhe Mark nga 0.2 WAVES në të njëjtën mënyrë.
(Shënim: Bëmë një gabim në një shifër dhe i dërguam Neli 0.02 WAVES. Kini kujdes!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Pas rritjes së bilanceve të të gjithë pjesëmarrësve ne shohim:

Hapi 2. Krijimi i llogarisë dApp
Ne u dakorduam që krijuesi dhe pronari i aplikacionit të decentralizuar do të jetë Alice.
Në Accounts kalojmë dhe e caktuam atë si SEED dhe kontrollojmë nëse env.SEED përputhet me Alice.
Do të provojmë të vendosim në llogarinë Alice skriptin më të thjeshtë (kontratën) të mundshëm.
Smart kontratat në Waves janë predikate që ndalojnë ose lejojnë ekzekutimin e një lloji të caktuar të transaksionit në përputhje me kushte të caktuara. Në këtë rast, kjo kusht është ALWAYS. Kodi i kontratës është true. Thërrasim deploy().

Tarifa për transaksionin setScript është 1400000/100000000 = 0.014 WAVES. Në bilancin e Alicës mbeti 2.986 WAVES.
Le të provojmë tani të vendosim në llogarinë Alice një logjikë më komplekse të smart-kontratës, të përshkruar në
Ride4Dapps tani përfshin 2 lloje të reja anotaciones:
- @Callable(i) — merr si parametër i, informacion në lidhje me cilën llogari thërriti/nënshkroi transaksionin. Pikërisht rezultati i kësaj funksioni përcakton ndryshimin e gjendjes së llogarisë dApp. Llogari të tjera mund të krijojnë transaksione dhe të ekzekutojnë funksionet me këtë anotacion dhe të ndryshojnë gjendjen e llogarisë dApp.
- @Verifier(tx) — Verifikues i transaksionit me parametrin tx të transaksionit. Përshtatet me logjikën e predikateve në RIDE. Pikërisht në këtë shprehje mund të lejohet ose të ndalohet mëtejshëm ndryshimi i logjikës së smart-kontratave në llogarinë dApp.
Le të bëjmë dApp llogarinë si një portofol të përbashkët për të gjithë pjesëmarrësit.

Për të kontrolluar se cili kontratë është aktive në llogari, mund të kopjoni kodin base64 të smart-kontratës në shfletuesin e bllokimeve dhe ta njohni atë përmes dekompilatorit ()



Sigurohuni që logjika e smart-kontratës përputhet me atë që presim.
Në bilancin e Alicës mbeti 2.972 WAVES.
Ky dApp mban llogari për atë që çdo pjesëmarrës kontribuon në fondin e përbashkët përmes mekanizmit data transaction — DataEntry(currentKey, newAmount), ku currentKey — është llogaria që thërret funksionin deposit, ndërsa newAmount — është vlera e bilancit të rritur.
Boob dhe Cooper depërtuar depozitat e tyre në llogarinë dApp me nga 1 WAVES.

Bëjmë një gabim dhe transaksioni nuk kalon. Duke qenë se përshtatëm që po bënim transaksionin në emër të Bob, gabuam në indeks dhe treguam llogarinë Bank, mbi të cilën nuk ka smart-kontratë. Këtu merret parasysh një pikë e rëndësishme — për përpjekjet e dështuara për të iniciuar transaksione tarifa nuk merret! Në bilancin e Alicës mbeti 2.972 WAVES. Bob ka 3 WAVES.
Bob dërgoi 1 WAVES në llogarinë dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob i mbetën 1.99 WAVES. Pra, Bob pagoi 0.01 WAVES si taksë.

Alice kishte 2.972 WAVES në llogari, tani ka 3.972. Në llogarinë e Alice u regjistrua gjithashtu një transaksion, megjithatë nga llogaria dApp (Alice) nuk u tërhoq asnjë taksë.
Pas përfundimit të depozitimit nga Cooper, në llogarinë e Alice arriti 4.972 WAVES.

Mund të informoheni se sa WAVES i përkasin kujt në portofolin e përbashkët në shfletuesin e blloqeve në sekçionin Data.
Cooper ndryshoi mendje për të lënë 1 WAVES në portofolin e përbashkët dhe vendosi të tërheqë gjysmën e shumës. Për këtë, ai duhet të thërrasë funksionin withdraw.

Megjithatë, përsëri gabuam, sepse funksioni withdraw ka parametra të ndryshëm, një nënshkrim të ndryshëm. Kur të projektoni kontrata të mençura në RIDE4DAPPS, duhet t'i kushtoni vëmendje këtij momenti.

Cooper tani ka 2.48 WAVES në llogari. Pra, 3 WAVES - 1 - 0.01, pastaj + 0.5 - 0.01. Prandaj, çdo thirrje e deposit dhe withdraw kushton 0.01 WAVES. Në fund, në tabelën e pronarëve të dApps, regjistrimet u ndryshuan si më poshtë.

Bob gjithashtu vendosi të tërheqë një shumë nga portofoli i përbashkët, por gaboi dhe përpiqej të tërhiqte 1.5 WAVES.

Megjithatë, në kontratën e mençur ka qenë një kontroll për këtë situatë.
Xena është një mashtruese, përpiqej të tërhiqte 1 WAVES nga llogaria e përbashkët.

Ajo gjithashtu nuk arriti dot.
Në pjesën tjetër do të shqyrtojmë çështje më të ndërlikuara që lidhen me të metat e llogarisë dApp të Alice.
Burimi: habr.com
