Zajaši val Web 3.0

Razvijalec Kristof Verdo pripoveduje o spletnem tečaju ‘Obvladovanje Web 3.0 z Waves’, ki ga je nedavno zaključil.

Zajaši val Web 3.0

Povejte nekaj o sebi. Kaj vas je pritegnilo k temu tečaju?

Dejavnostem spletnega razvoja se posvečam že približno 15 let, večinoma kot freelancer.

Ko sem razvijal dolgotrajno spletno aplikacijo za razvijajoče se države po naročilu ene bančne skupine, sem se srečal z izzivom integracije blockchain certificiranja. Takrat sem o blockchain certificiranju vedel še kar malo, čeprav sem se že prej zanimali za kripto-tehnologije – večinoma kot investitor.

Na koncu ta funkcija ni bila izvedena, vendar sem, ob razmisleku o tem, da so organizacije in banke zainteresirane za tovrstno rešitev za svoje aplikacije, začel raziskovati zadevo in kmalu zagnal projekt Signature Chain.

Razvijal sem beta različico, ki je že dostopna v glavni mreži. Takrat [programskega jezika Waves] Ride še ni bilo, in vse sem delal na najpreprostejši način, s transakcijami prenosa in vdelanim JSON-om. Vendar je bila glavna cilj dodati naprednejšo funkcionalnost po lansiranju Ride. In to je glavni razlog, zakaj sem se pridružil tečaju: naslednja stopnja razvoja projekta je predvidevala ustvarjanje decentralizirane aplikacije (dApp).

Kateri vidiki tečaja so se vam zdeli najlažji in kateri najtežji?

Najlažje je bilo, da smo imeli dovolj časa za vse naloge. Smisel tečaja je, da se naučimo nečesa, ne pa da tekmujemo med seboj. Razlage so bile zelo dostopne, ilustracije pa preproste, a izčrpne. To je pomagalo vizualizirati in razumeti različne teme.

Med izvajanjem nalog so nas spodbujali, da razmišljamo neodvisno in občasno raziskujemo sami. To je najboljši način, da se naučimo nečesa in razjasnimo ideje, obravnavane na predavanjih.

Večkrat nisem povsem razumel teoretičnega dela, dokler nisem začel pisati kode, da bi izvedel nalogo. Ni nam bilo dovoljeno uporabljati ‘copy/paste’, celotno kodo je bilo treba pisati sami, in to je prav tako pripomoglo k boljšemu razumevanju vsega.

Najbolj zahtevno je bilo to, da vprašanja v nalogi z več izbiri odgovora niso bila vedno jasna. Moj angleški jezik ni popoln in vprašanja so bila napisana s strani osebe, ki ni materni govorec, zato je včasih prihajalo do nesporazumov.

Morda bi lahko del tečaja, posvečenega orakulom in NFT, bil bolj podroben. Vsekakor pa je glavna naloga tečaja, da pritegne razvijalce. Kasneje bo seveda treba preživeti nekaj časa za eksperimentiranje in prakso, da bi popolnoma razumeli vse vidike.

Povejte več o rešitvi, na kateri ste delali skozi celoten tečaj – 'Coupon Bazaar'? Lahko tudi vidimo primere kode?

Da, delali smo na 'Coupon Bazaar', to je tržnica, kjer ljudje prodajajo in kupujejo kuponi, ki omogočajo nakup blaga in storitev po nižjih cenah. Vsak kupon je predstavljen kot digitalna sredstva, ki predvidevajo posebno popust od dobavitelja.

Zajaši val Web 3.0

Potrebno je bilo razviti več komponent aplikacije. Prvič, potrebovali smo ustvariti sistem za registracijo dobaviteljev in upravljanje s kuponi. Nato je bila potrebna funkcija preverjanja in možnost iskanja kuponov s strani uporabnikov.

Zajaši val Web 3.0

Med tečajem smo dodali tudi nekaj novih funkcij, vključno s sistemom glasovanja in funkcijo, ki omogoča preverjanje in dodajanje dobaviteljev na črn seznam.

Najprej smo preučili razliko med pametnimi sredstvi, pametnimi računi in dApp računi ter osnove dela s funkcijami preverjanja. Funkcije preverjanja omogočajo spreminjanje privzete obnašanja računa. Po privzetku preverjajo podpise transakcij, vendar funkcija preverjanja omogoča nastavitev drugih 'pravil'.

{-# 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
    }
}

Nato smo začeli dodajati kupone. Uporabili smo eno najpomembnejših funkcij dApp, ki omogoča zapis podatkov katere koli vrste v blok verigo v obliki parov 'ključ-vrednost' – transakcijo podatkov. Združili smo jo z novo transakcijo, invokeScript, ki se uporablja za klic funkcije dApp izven blok verige.

Tip podatkovne transakcije, ki smo ga uporabili med tečajem, je dodajanje kuponov na tržno platformo:

letdatajson = {
    "title":        "majica z , glasujte 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Vesolje",
    "description":  "Želim, da delate ljubezen, ne vojne, vem, da ste to že slišali",
    "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)
})

Za obdelavo teh podatkov s funkcijo addItem in razvoj funkcije nakupa ter drugih možnosti smo uporabili klicateljsko funkcijo, ki jo uporabnik lahko klice zunaj blockchaina. Posledično lahko izvaja različne naloge, kot so sprožitev prenosa sredstev, zapisovanje ali posodabljanje podatkov v podatkovnem skladišču dApp itd.

Tukaj je primer klicateljske funkcije, ki se uporablja v funkciji addItem:

@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
    letsupplierAddress = toBase58String(i.caller.bytes)
    letitem = getKeyItem(supplierAddress, title)
    if( price <= 0) thenthrow("znesek nakupa ne more biti manjši od cene izdelka")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("izdelek že obstaja")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Kasneje smo razvili sistem glasovanja, ki omogoča oddajo glasov za promocijo ali odstranitev določenih izdelkov. Da bi preprečili zunanje vplivanje na proces glasovanja, uporablja shemo 'Commit-Reveal'.

Faza 'commit' se uporablja za zbiranje šifriranih glasov s pomočjo hash funkcije in 'soli'.

Faza 'reveal' se uporablja za zbiranje šifriranih glasov in primerjanje njihovih hashev.

Tukaj je primer klicateljske funkcije, ki se uporablja tukaj:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >=VOTERS) thenthrow("dosežena največja številka volivcev")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("uporabnik je že sodeloval")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("izdelek ne obstaja")
    elseif(status !=NONE && status !=VOTING) thenthrow("glasovanje ni mogoče")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
        ])
    }
}
>

Kaj ste še izvedeli iz tečaja?

Tečaj je prav tako vključeval tokenizacijo in nepogrešljive tokene (NFT) – tokene, ki predstavljajo nekaj edinstvenega in zato niso zamenljivi.

Zadnja seja je bila posvečena orakljem. Ker blockchain ne more pridobivati podatkov iz zunanjega sveta, potrebujemo oraklje, da te podatke pošljejo vanj.

Za našo tržnico so bili potrebni oraklji, da potrdijo in po potrebi uvrstijo na črno listo dobavitelja, ki na primer ni sprejel prodanega kupona.

Tukaj je primer:

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

Kaj je bilo za vas najbolj koristno?

Najbolj koristni del so naloge. Zahvaljujoč njim je bila vsebina predavanj razumljivejša, medtem ko so se ravno pridobljena znanja utrjevala s poskusi in napakami. Tudi praktično delo z IDE, raziskovalcem in oraklji.

Kako nameravate praktično uporabiti, kar ste se naučili?

Od samega začetka sem pričakoval, da bo tečaj pomagal dvigniti moj projekt na novo raven. Ideja je bila, da zdaj napišem kodo sign-web.app v RIDE. Obstoječa različica že ima funkcije za certificiranje dokumentov, vendar jo bo mogoče z RIDE znatno izboljšati. Nova različica bo bolj prilagodljiva in razumljiva ter bo imela več funkcij, vključno s certificiranjem elektronskih sporočil, dogovorov med več strankami itd.

Tečaj je prav tako dal prostor za razmislek, in imel sem veliko novih idej. Prepričan sem, da se bodo rezultati pokazali tudi v prihodnosti.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster