Cumpără valul Web 3.0

Dezvoltatorul Christophe Verdo vorbește despre cursul online ‘Stăpânirea Web 3.0 cu Waves’, pe care l-a parcurs recent.

Cumpără valul Web 3.0

Spuneți-ne câteva lucruri despre dumneavoastră. Ce v-a atras la acest curs?

Activez în dezvoltarea web de aproximativ 15 ani, în principal ca freelancer.

Dezvoltând o aplicație web de înregistrare pe termen lung pentru țările în dezvoltare la comanda unui grup bancar, m-am confruntat cu provocarea integrării certificării pe blockchain. La acea vreme, nu știam prea multe despre certificarea pe blockchain, deși eram déjà interesat de tehnologiile cripto – în principal ca investitor.

În cele din urmă, această funcție nu a fost realizată, dar, gândindu-mă că organizațiile și băncile sunt interesate de o asemenea soluție pentru aplicațiile lor, m-am apucat să studiez subiectul și am lansat în curând proiectul Signature Chain.

Am dezvoltat versiunea sa beta, care este deja disponibilă în rețeaua principală. La acea vreme, [limbajul de programare Waves] Ride nu exista, iar eu făceam totul în cel mai simplu mod, folosind tranzacții de transfer cu JSON încorporat. Dar scopul principal era de a adăuga funcționalități mai avansate după lansarea Ride. Și aceasta este principala reason pentru care m-am alăturat cursului: următoarea etapă de dezvoltare a proiectului presupunea crearea unei aplicații descentralizate (dApp).

Care aspecte ale cursului vi s-au părut cele mai simple și care cele mai dificile?

Cel mai simplu a fost faptul că am avut suficient timp pentru toate sarcinile. Scopul cursului este de a învăța ceva, nu de a concura unul împotriva altuia. Explicațiile au fost foarte accesibile, iar ilustrațiile – simple, dar cuprinzătoare. Acest lucru a ajutat la vizualizarea și înțelegerea diferitelor teme.

Atunci când am realizat sarcinile, am fost încurajați să gândească independent și uneori să studiem ceva de unul singur. Acesta este cel mai bun mod de a învăța ceva și de a înțelege conceptele discutate în cursuri.

De câteva ori, nu am înțeles complet partea teoretică până nu începeam să scriu codul, realizând sarcina. Nu ne era permis să facem ‘copy/paste’, tot codul trebuia scris de noi înșine, iar acest lucru a ajutat de asemenea la o mai bună înțelegere a tuturor.

Cel mai greu a fost că întrebările din sarcinile cu multiple opțiuni nu erau mereu clare. Engleza mea nu este perfectă, iar întrebările erau scrise de cineva care nu este vorbitor nativ al limbii, așa că uneori apăreau neînțelegeri.

Poate partea cursului dedicată oracolelor și NFT-urilor ar fi putut fi mai detaliată. Dar, în orice caz, scopul principal al cursului este de a atrage dezvoltatorii. Ulterior, pentru a înțelege toate aspectele, va trebui, desigur, să investești timp pentru a experimenta și a practica.

Puteți povesti mai în detaliu despre soluția la care ați lucrat pe parcursul întregului curs – 'Coupon Bazaar'? Putem vedea și exemple de cod?

Da, am lucrat la 'Coupon Bazaar', acesta este un marketplace unde oamenii cumpără și vând cuponuri care oferă dreptul de a achiziționa produse și servicii la prețuri mai mici. Fiecare cupon este reprezentat ca un activ digital, care preconizează o reducere specială din partea furnizorului.

Cumpără valul Web 3.0

A fost nevoie să dezvoltăm mai multe componente ale aplicației. În primul rând, a fost necesară crearea unui sistem pentru înregistrarea furnizorilor și gestionarea cupoanelor. Apoi, era nevoie de o funcție de verificare și de posibilitatea de a căuta cupoane de către utilizatori.

Cumpără valul Web 3.0

Pe parcursul cursului, am adăugat de asemenea câteva funcții noi, inclusiv un sistem de votare și o funcție care permitea verificarea și adăugarea pe lista neagră a furnizorilor.

La început, am studiat diferența dintre activele inteligente, conturile inteligente și conturile dApp și modul de operare al funcțiilor de verificare. Funcțiile de verificare permit modificarea comportamentului contului, setat implicit. În mod implicit, acestea verifică semnăturile tranzacțiilor, dar funcția de verificare permite stabilirea altor „reguli”.

{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
let ownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M'
@Verifier(tx)
func verify() = {
    match tx {
        cases: SetScriptTransaction=> sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey)
        case: DataTransaction=> true
        case_ => false
    }
}

Apoi am început să adăugăm cupoane. Am folosit una dintre cele mai importante funcții ale dApp-ului, care permite înregistrarea pe blockchain a datelor de orice tip sub formă de perechi „cheie-valoare” – o tranzacție de date. Am combinat-o cu o nouă tranzacție, invokeScript, utilizată pentru a apela o funcție solicitată în dApp din afara blockchain-ului.

Tipul de tranzacții de date pe care l-am folosit în timpul cursului este adăugarea de cupoane pe marketplace:

letdatajson = {
    "title":        "tricou cu , vote 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Univers",
    "description":  "Vreau să faci dragoste, nu război, știu că ai mai auzit asta înainte",
    "image":        "https://bit.ly/2EXTghg"
}
it('add item', asyncfunction(){
    letts = invokeScript({
       dApp: dappAddress,
           call:{
               function:"addItem",
               args:[
                    { type:"string", value: datajson.title },
                    { type:"integer", value: datajson.coupon_price },
                    { type:"string", value: JSON.stringify(datajson) }
               ]},
               payment: []
           }, accountSupplierSeed)
    lettx = awaitbroadcast(ts)
    awaitwaitForTx(tx.id)
})

Pentru a procesa aceste date cu funcția addItem și pentru a dezvolta funcția de cumpărare și alte opțiuni, am folosit o funcție apelabilă, pe care utilizatorul o poate invoca din afara blockchain-ului. Ca urmare, aceasta poate executa diverse sarcini, cum ar fi inițierea transferului de fonduri, scrierea sau actualizarea datelor în stocarea datelor dApp etc.

Iată un exemplu de funcție apelabilă, utilizată în funcția addItem:

@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
    letsupplierAddress = toBase58String(i.caller.bytes)
    letitem = getKeyItem(supplierAddress, title)
    if( price <= 0) thenthrow("valoarea de cumpărare nu poate fi mai mică decât prețul itemului")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("un item există deja")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Ulterior, am dezvoltat un sistem de votare care permite să se ofere voturi pentru promovarea sau eliminarea anumitor produse. Pentru a preveni influențele externe asupra procesului de votare, acesta folosește schema ‘Commit-Reveal’.

Faza „commit” este utilizată pentru a colecta voturi criptate folosind o funcție hash și „sare”.

Faza „reveal” este utilizată pentru a colecta voturi criptate și a compara hash-urile lor.

Iată un exemplu de funcție apelabilă, utilizată aici:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >= VOTERS) thenthrow("s-a atins numărul maxim de votanți")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("utilizatorul a participat deja")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("itemul nu există")
    elseif(status !=NONE && status !=VOTING) thenthrow("votarea nu este posibilă")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item),if(commits == VOTERS) then REVEAL else VOTING)
        ])
    }
}
>

Ce altceva ai învățat din curs?

Cursul a inclus, de asemenea, tokenizarea și tokenii non-fungibili (NFT) – tokeni care reprezintă ceva unic și, prin urmare, nu sunt interschimbabili.

Ultima lecție a fost dedicată oracolelor. Deoarece blockchain-ul nu poate obține date din lumea externă, avem nevoie de oracole pentru a trimite aceste date în sistem.

Pentru platforma noastră de piață, oracolele erau necesare pentru a verifica și, dacă este cazul, a bloca furnizorul care, de exemplu, nu a acceptat un cupon vândut.

Iată un exemplu:

funcgetExtValueItemWhiteListStatus(item:String) = {
    item +"_verifier_status"
}
 
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "verified"
letBLACKLISTED = "blacklist"
@Callable(i)
funcsetstatus(supplier: String, status: String) = {
    letaccount = toBase58String(i.caller.bytes)
    if( account !=verifier ) thenthrow("only oracle verifier are able to manage whitelist")
    elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status")
    else{
        WriteSet([
           DataEntry(getExtValueItemWhiteListStatus(supplier), status)
        ])
    }
}

Ce a fost cel mai util pentru tine?

Partea cea mai utilă a fost sarcinile. Datorită lor, materialul lecțiilor devenea mai clar, iar cunoștințele obținute recent erau consolidate prin metode de încercare și eroare. A fost, de asemenea, foarte utilă munca practică cu IDE, exploratorul și oracolele.

Cum intenționezi să folosești în practică ceea ce ai învățat?

Din început, am avut așteptări ca acest curs să ajute proiectul meu să ajungă la un nou nivel. Ideea era acum să scriu cod sign-web.app în RIDE. Versiunea existentă are deja funcții de certificare a documentelor, dar, datorită RIDE, va putea fi îmbunătățită semnificativ. Noua versiune va fi mai flexibilă și mai ușor de înțeles, având mai multe funcții, inclusiv certificarea e-mailurilor, acordurilor între mai multe părți etc.

Cursul a oferit, de asemenea, hrană pentru gândire și am avut multe idei noi. Sunt încrezător că rezultatele se vor manifesta și în viitor.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster