Jahajte valovima Web 3.0

Razvijač Christophe Verdo govori o online tečaju ‘Usavršavanje Web 3.0 s Waves’, koji je nedavno završio.

Jahajte valovima Web 3.0

Kažite nešto o sebi. Što vas je zainteresiralo za ovaj tečaj?

Bavim se web razvojem već oko 15 godina, većinom kao freelancer.

Razvijajući web aplikaciju za dugoročno registriranje za zemlje u razvoju po narudžbi jedne banke, suočio sam se s izazovom integracije blockchain certifikacije. U to vrijeme nisam znao puno o blockchain certifikaciji, iako sam već bio zainteresiran za kripto tehnologije - uglavnom kao investitor.

Na kraju ta funkcija nije bila реализirana, ali, razmišljajući o tome da su organizacije i banke zainteresirane za takva rješenja u svojim aplikacijama, posvetio sam se istraživanju ove teme i ubrzo pokrenuo projekt Signature Chain.

Razvio sam njegovu beta verziju koja je već dostupna na glavnoj mreži. U to vrijeme [programski jezik Waves] Ride još nije postojao, i sve sam radio najjednostavnijim načinom, koristeći transakcije prijenosa s ugrađenim JSON-om. No, glavni cilj bio je dodati napredniju funkcionalnost nakon lansiranja Ride-a. I to je glavni razlog zašto sam se pridružio tečaju: sljedeća faza razvoja projekta zahtijevala je izradu decentralizirane aplikacije (dApp).

Koji su vam aspekti tečaja bili najlakši, a koji najteži?

Najlakše je bilo to što smo imali dovoljno vremena za sve zadatke. Smisao tečaja je učiti, a ne natjecati se međusobno. Objašnjenja su bila veoma pristupačna, a ilustracije jednostavne, ali sveobuhvatne. To je pomoglo vizualizirati i razumjeti različite teme.

Prilikom izvršavanja zadataka poticali su nas da razmišljamo neovisno i ponekad nešto istražujemo sami. To je najbolji način da se nauči nešto i razumije ideje koje se razmatraju na nastavi.

Nekoliko puta nisam potpuno razumio teorijski dio sve dok nisam počeo pisati kod dok sam radio zadatak. Nismo smjeli koristiti ‘copy/paste’, sav kod trebalo je pisati sami, i to je također pomoglo da bolje razumijem sve.

Najveći problem bio je to što pitanja u zadatku s višestrukim odgovorima nisu uvijek bila jasna. Moj engleski nije savršen, a pitanja su pisali ljudi koji nisu izvorni govornici, zbog čega je ponekad dolazilo do nesporazuma.

Možda bi dio tečaja posvećen orakulima i NFT-ima mogao biti detaljniji. No, u svakom slučaju, osnovni cilj tečaja je zainteresirati programere. Nakon toga, kako bi se u potpunosti razumjeli svi aspekti, bit će potrebno posvetiti neko vrijeme eksperimentiranju i prakticiranju.

Možete li reći nešto više o rješenju na kojem ste radili tijekom cijelog tečaja – ‘Coupon Bazaar’? Također, možemo li vidjeti primjere koda?

Da, radili smo na ‘Coupon Bazaar’, to je tržište gdje ljudi prodaju i kupuju kupone koji omogućuju kupovinu proizvoda i usluga po nižim cijenama. Svaki kupon je predstavljen digitalnom imovinom koja podrazumijeva posebni popust od dobavljača.

Jahajte valovima Web 3.0

Trebalo je razviti nekoliko komponenti aplikacije. Prvo, potrebno je stvoriti sustav za registraciju dobavljača i upravljanje kuponima. Zatim je bila potrebna funkcija verifikacije i mogućnost pretraživanja kupona od strane korisnika.

Jahajte valovima Web 3.0

Tijekom tečaja također smo dodali nekoliko novih funkcija, uključujući sustav glasovanja i funkciju koja omogućuje verifikaciju i stavljanje dobavljača na crnu listu.

Prvo smo proučili razliku između pametnih imovina, pametnih računa i dApp računa te osnove rada s funkcijama verifikatora. Funkcije verifikatora omogućuju promjenu zadanog ponašanja računa. Po defaultu provjeravaju potpise transakcija, no funkcija verifikatora omogućava postavljanje drugih "pravila".

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

Nakon toga počeli smo dodavati kupone. Koristili smo jednu od najvažnijih funkcija dApp koja omogućuje zapisivanje podataka bilo koje vrste u blockchain u obliku parova "ključ-vrijednost" – transakciju podataka. Ožičili smo je s novom transakcijom, invokeScript, koja se koristi za pozivanje funkcije iz dApp izvan blockchaina.

Vrsta transakcija podataka koju smo koristili tijekom tečaja jest dodavanje kupona na tržište:

letdatajson = {
    "title":        "majica s , glasaj 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Svijet",
    "description":  "Želim da voliš, a ne da ratuješ, znam da si to već čuo",
    "image":        "https://bit.ly/2EXTghg"
}
it('dodaj stavku', 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)
})

Za obradu ovih podataka funkcijom addItem i razvoj funkcije kupnje i drugih opcija koristili smo pozvanu funkciju koju korisnik može pozvati izvana iz blockchaina. Kao rezultat, može izvršavati razne zadatke, poput iniciranja prijenosa sredstava, zapisivanja ili ažuriranja podataka u skladištu podataka dApp, itd.

Evo primjera pozvane funkcije koja se koristi u funkciji addItem:

@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
    letsupplierAddress = toBase58String(i.caller.bytes)
    letitem = getKeyItem(supplierAddress, title)
    if( price <= 0) thenthrow("iznos kupnje ne može biti manji od cijene stavke")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("stavka već postoji")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Kasnije smo razvili sustav glasovanja koji omogućuje glasanje za promicanje ili uklanjanje određenih proizvoda. Kako bismo spriječili vanjski utjecaj na proces glasovanja, koristi shemu ‘Commit-Reveal’.

Faza «commit» koristi se za prikupljanje šifriranih glasova pomoću hash funkcije i «soli».

Faza «reveal» koristi se za prikupljanje šifriranih glasova i usporedbu njihovih hash-ova.

Evo primjera pozvane funkcije koja se koristi ovdje:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >= VOTERS) thenthrow("došlo se do maksimalnog broja glasača")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("korisnik je već sudjelovao")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("stavka ne postoji")
    elseif(status !=NONE && status !=VOTING) thenthrow("glasovanje nije moguće")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item),if(commits == VOTERS) then REVEAL else VOTING)
        ])
    }
}
>

Što ste još naučili iz tečaja?

Tečaj je također uključivao tokenizaciju i non-fungible tokene (NFT) – tokene koji predstavljaju nešto jedinstveno i stoga nisu međusobno zamjenjivi.

Zadnja lekcija bila je posvećena orakulima. Budući da blockchain ne može primati podatke iz vanjskog svijeta, potrebni su nam orakuli za slanje tih podataka.

Za naš tržišni prostor orakuli su bili potrebni da verifikuju i, ako je potrebno, stave na crnu listu dobavljača koji, na primjer, nije prihvatio prodani kupon.

Evo primjera:

func getExtValueItemWhiteListStatus(item: String) = {
    item + "_verifier_status"
}

let verifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
let VERIFIED = "verified"
let BLACKLISTED = "blacklist"
@Callable(i)
func setstatus(supplier: String, status: String) = {
    let account = toBase58String(i.caller.bytes)
    if (account != verifier) then throw("samo oracle verifikatori mogu upravljati bijelom listom")
    elseif (status != VERIFIED && status != BLACKLISTED) then throw("pogrešan status")
    else {
        WriteSet([
            DataEntry(getExtValueItemWhiteListStatus(supplier), status)
        ])
    }
}

Što vam je bilo najkorisnije?

Najkorisniji dio su zadaci. Zahvaljujući njima, materijal predavanja postajao je jasniji, a tek stečena znanja učvrstila su se metodom pokušaja i pogrešaka. I praktični rad s IDE, eksporerom i orakulima.

Kako planirate prakticirati ono što ste naučili?

Od samog početka očekivao sam da će tečaj pomoći u podizanju mog projekta na novu razinu. Ideja je bila napisati kod sign-web.app na RIDE-u. Postojeća verzija već ima funkcije certifikacije dokumenata, no zahvaljujući RIDE-u bit će je moguće značajno poboljšati. Nova verzija bit će fleksibilnija i jasnija, imat će više funkcija, uključujući certifikaciju elektroničkih pisama, sporazuma između više strana itd.

Tečaj je također pružio poticaj za razmišljanje i dobio sam mnogo novih ideja. Siguran sam da će se rezultati pokazati i u budućnosti.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster