Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

Bună ziua tuturor!

Mai recent, Waves Labs a anunțat competiție pentru dezvoltatori dedicată lansării extensiei de limbaj de contract inteligent RIDE pentru aplicații descentralizate Ride4Dapps în rețeaua de testare!

Am ales cazul DAO pentru că Ventuar intenționează să dezvolte dApps cu funcții sociale: vot, strângere de fonduri, management al încrederii etc.
Am început cu un exemplu simplu în Sesiuni de întrebări și răspunsuri și RIDE IDE - exemplu cu portofel partajat.

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 robinet și indicați adresa la care să trimiteți jetoanele.
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: referent

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ă:
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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].
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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 tranzacții.

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.
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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:
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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().

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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 exemplu

Ride4Dapps acum include 2 noi tipuri de adnotări:

  1. @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.
  2. @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.
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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 (de exemplu)
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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.
Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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 }]}))

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

Bob mai are 1.99 VALURI. Adică Bob a plătit comision de 0.01 WAVES

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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.

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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.

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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ă.

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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.

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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.

Învățați să scrieți contracte inteligente Waves pe RIDE și RIDE4DAPPS. Partea 1 (Portofel cu mai mulți utilizatori)

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

Adauga un comentariu