Bună ziua tuturor!
Mai recent, Waves Labs
Am ales cazul DAO pentru că
Am început cu un exemplu simplu în
Să ne uităm la acest exemplu, să testăm ipoteze și să vedem câteva ciudățenii:
Să avem Alice - proprietarul dApp
Boob și Cooper sunt parteneri Alice, co-fondatori ai Alice-BC DAO
Neli este un proprietar de afaceri care are nevoie de finanțare
Bank - o bancă care distribuie jetoane
Etapa 1. Inițializarea soldurilor
Pentru a primi jetoane în rețeaua de testare waves, trebuie să contactați
Puteți găsi adresa în IDE, deschizând detaliile contului.
Evidențiem Bank 10 WAVES. Apoi verificăm că au ajuns prin browserul de blocare și tranzacții:
Acum să distribuim jetoane de la bancă celorlalți participanți. (Note: Toate tranzacțiile din rețeaua waves nu sunt gratuite, așa că este necesar un sold minim pozitiv pentru ca toți participanții să facă tranzacții).
1 UNDE = 100000000 de unități (undă), deoarece cantitățile pot fi numai întregi
0.01 WAVES (Comision de tranzacție) = 1000000
Bank -> [3 WAVES] -> Alice, prin TransferTransaction (Tip: 4).
Verificăm dacă env.SEED din care sunt semnate tranzacțiile se potrivește cu Banca noastră:

Dacă nu aveți o expresie inițială care se potrivește, comutați la ea în fila Conturi și verificați din nou.
După aceasta, creăm, anunțăm și semnăm o tranzacție pentru transferul lui 3 WAVES Alice.
De asemenea, puteți afla datele lui Alice prin variabila env.accounts. Numerotarea începe de la 0, deci Alice este env.accounts[1].
broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
Rezultatul poate fi observat și în browser, un link către acesta ne va fi returnat imediat după execuție
Ne asigurăm că soldul lui Alice este completat cu 3 VALURI, iar soldul bancar rămâne la 10 - 3 - 0.01 = 0.699.
Le trimitem lui Boob și Cooper câte 3 UNDURI, iar Neli, Xena și Mark câte 0.2 UNDURI fiecare în același mod.
(Note: am făcut o eroare cu un caracter și i-am trimis lui Neli 0.02 WAVES. Fii atent!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
După completarea soldurilor tuturor participanților, vedem:
Etapa 2. Creați un cont dApp
Am convenit că Alice va fi creatorul și proprietarul aplicației descentralizate.
Accesați Conturi, setați-l ca SEED și verificați înv.SEED se potrivește cu Alice.
Să încercăm să instalăm cel mai simplu script (contract) posibil pe contul lui Alice.
Contactele inteligente din Waves sunt predicate care interzic sau permit orice tip de tranzacție de ieșire să aibă loc în anumite condiții. În acest caz, această condiție este ÎNTOTDEAUNA. Codul contractului este adevărat. Apelați deploy().
Taxă per tranzacție setScript 1400000/100000000 = 0.014 WAVES. Alice mai are 2.986 VALURI pe sold.
Să încercăm acum să instalăm o logică de contract inteligentă mai complexă pe contul Alice, descrisă în
Ride4Dapps acum include 2 noi tipuri de adnotări:
- @Callable(i) — ia ca parametru i, datele despre care cont a numit/a semnat tranzacția. Este rezultatul acestei funcții care determină schimbarea stării contului dApp. Alte conturi pot crea tranzacții și executa funcții cu această adnotare și pot schimba starea contului dApp.
- @Verifier(tx) — Verificator de tranzacție cu parametrul tranzacție tx. Corespunde logicii predicatelor din RIDE. În această expresie puteți permite sau interzice modificări ulterioare ale logicii contractelor inteligente pe contul dApp.
Hai sa facem Dapp cont ca portofel comun pentru toți participanții.
Pentru a verifica ce contract este activ în prezent în contul dvs., puteți copia codul base64 al contractului inteligent în exploratorul de blocuri și îl puteți recunoaște folosind un decompilator (
Ne asigurăm că logica contractului inteligent se potrivește cu ceea ce ne așteptăm.
Alice mai are 2.972 VALURI pe sold.
Acest dApp urmărește cât contribuie fiecare participant la fondul comun printr-un mecanism tranzacție de date — DataEntry(currentKey, newAmount), unde currentKey este contul care apelează funcția de depozit, iar newAmount este valoarea soldului alimentat.
Boob și Cooper fac depuneri în contul dApp cu 1 WAVES.
Facem o greșeală și tranzacția nu are loc. Din moment ce, în ciuda faptului că eram convinși că facem o tranzacție în numele lui Bob, am făcut o greșeală în index și am indicat un cont bancar care nu are un smart contract. Merită remarcat un punct important aici - există o taxă pentru încercările nereușite de a iniția tranzacții nu poate fi eliminat! Alice mai are 2.972 VALURI pe sold. Bob are 3 VALURI.
Bob a trimis 1 WAVES la contul dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob mai are 1.99 VALURI. Adică Bob a plătit comision de 0.01 WAVES
Alice a avut 2.972 VALURI la sold, acum este 3.972. A fost înregistrată și o tranzacție pe contul Alice, dar nu a fost perceput niciun comision din contul dApp (Alice).
După ce Cooper a completat și contul, soldul lui Alice a devenit 4.972 WAVES.
Puteți afla cine deține câte WAVE-uri în portofelul comun în exploratorul de blocuri din fila Date.
Cooper s-a răzgândit să lase suma de 1 WAVE pe portofelul general și a decis să retragă jumătate din afinitate. Pentru a face acest lucru, el trebuie să apeleze funcția de retragere.
Cu toate acestea, am greșit din nou, deoarece funcția de retragere are parametri complet diferiți și o semnătură diferită. Când proiectați contracte inteligente pe RIDE4DAPPS, ar trebui să acordați atenție acestui punct
Cooper are acum 2.48 VALURI în bilanţ. În consecință, 3 UNDURI - 1 - 0.01 și apoi + 0.5 - 0.01. În consecință, fiecare apel de depunere și retragere costă 0.01 WAVES. Ca urmare, intrările din tabelul proprietarilor dApps s-au schimbat după cum urmează.
De asemenea, Bob a decis să retragă niște bani din portofelul partajat, dar a greșit și a încercat să retragă 1.5 VALURI.
Cu toate acestea, contractul inteligent avea o verificare pentru această situație.
Xena este o escrocă, a încercat să retragă 1 WAVES din totalul contului.
Nici pentru ea nu i-a mers.
În partea următoare, vom analiza probleme mai complexe legate de imperfecțiunea contului Alice dApp.
Sursa: www.habr.com