SÔida Web 3.0 lainetel

Arendaja Kristof Verdo rÀÀgib veebikursusest 'Mastering Web 3.0 with Waves', mille ta hiljuti lÀbis.

SÔida Web 3.0 lainetel

RÀÀgi meile natuke endast. Mis huvitas sind selle kursuse juures?

Olen tegelenud veebiarendusega umbes 15 aastat, peamiselt vabakutselisena.

Arendades arengumaade pikaajalise registreerimise veebirakendust ĂŒhe pangagruppi tellimuse kohaselt, kohtasin ma blockchain-sertifitseerimise integreerimisega seotud probleeme. Sel ajal ei teadnud ma blockchain-sertifitseerimisest palju, kuigi olin juba krĂŒptotehnoloogiate vastu huvitatud – peamiselt investori vaatevinklist.

LÔppkokkuvÔttes seda funktsiooni ei rakendatud, kuid mÔeldes sellele, et organisatsioonid ja pangad on sellise lahenduse vastu oma rakendustes, hakkasin ma teema uurimist tegema ja varsti lansseerisin projekti Signature Chain.

. Arendasin vĂ€lja selle beetaversiooni, mis on juba pĂ”hivĂ”rgus saadaval. Sel ajal [programmeering keelt Waves] Ride ei eksisteerinud, ja ma tegin kĂ”ik kĂ”ige lihtsamal viisil, kasutades transaktsioonide ĂŒlekandeid koos sisseehitatud JSON-iga. Kuid pĂ”hieesmĂ€rk oli lisada pĂ€rast Ride'i kĂ€ivitamist keerukamad funktsioonid. Ja see on peamine pĂ”hjus, miks ma liitusin kursusega: projekti jĂ€rgmine arenguetapp hĂ”lmas detsentraliseeritud rakenduse (dApp) loomist.

Millised kursuse aspektid tundusid sulle kÔige lihtsamad ja millised kÔige keerulisemad?

KĂ”ige lihtsam oli see, et meil oli kĂ”ikide ĂŒlesannete jaoks piisavalt aega. Kursuse mĂ”te on Ă”ppida midagi uut, mitte ĂŒksteisega vĂ”istelda. Selgitused olid vĂ€ga arusaadavad ja illustratsioonid olid lihtsad, kuid pĂ”hjalikud. See aitas visualiseerida ja mĂ”ista erinevaid teemasid.

Ülesannete tĂ€itmisel suunati meid mĂ”tlema iseseisvalt ja vahel midagi iseseisvalt uurima. See on parim viis millegi Ă”ppimiseks ja klassides kĂ€sitletud ideedega tutvumiseks.

MĂ”ned korrad ei mĂ”istnud ma teooriat tĂ€ielikult enne, kui hakkasin koodi kirjutama, tĂ€ites ĂŒlesannet. Meile ei lubatud teha 'copy/paste', kogu kood pidi olema ise kirjutatud, ja see aitas samuti paremini asjadest aru saada.

KĂ”ige keerulisem oli see, et valikvastustega ĂŒlesannetes esitatud kĂŒsimused ei olnud alati selged. Minu inglise keel pole ideaalne ja kĂŒsimused olid kirjutatud inimeselt, kes ei ole keele emakeelena kĂ”neleja, mistĂ”ttu tekkis mĂ”nikord arusaamatus.

VĂ”ib-olla vĂ”iks osa kursusest, mis kĂ€sitleb oraakleid ja NFT-sid, olla pĂ”hjalikum. Kuid igal juhul on kursuse peamine ĂŒlesanne Ă€ratada arendajate huvi. Hiljem, et tĂ€ielikult mĂ”ista kĂ”iki selle aspekte, on loomulikult vajalik veidi aega eksperimenteerimiseks ja harjutamiseks.

RÀÀkige lĂ€hemalt lahendusest, millega te töötasite kogu kursuse vĂ€ltel – 'Coupon Bazaar'? Kas saaks ka nĂ€ha koodinĂ€iteid?

Jah, me töötasime 'Coupon Bazaar'i kallal, see on turuplats, kus inimesed mĂŒĂŒvad ja ostavad kupone, mis annavad Ă”iguse osta kaupu ja teenuseid madalama hinnaga. Iga kupong on esindatud digitaalse varana, millel on eriline allahindlus tarnijalt.

SÔida Web 3.0 lainetel

Tekkis vajadus arendada mitu rakenduse komponenti. Esiteks tuli luua tarnijate registreerimise ja kupongide haldamise sĂŒsteem. SeejĂ€rel oli vajalik valida verifitseerimise funktsioon ja vĂ”imalus, et kasutajad saaksid kupongi otsida.

SÔida Web 3.0 lainetel

Kursuse jooksul lisasime ka mitmeid uusi funktsioone, sealhulgas hÀÀletussĂŒsteemi ja funktsiooni, mis vĂ”imaldab tarnijaid verifitseerida ja musta nimekirja panna.

Esmalt uurisime erinevust nutivara, nutikonto ja dApp-konto vahel ning verifikaatorite funktsioone. Verifikaatori funktsioonid vÔimaldavad muuta konto vaikeseadeid. VaikesÀtete kohaselt kontrollivad nad tehingute allkirju, kuid verifikaatori funktsioon vÔimaldab seada muid 'reegleid'.

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

SeejĂ€rel hakkasime kupone lisama. Kasutasime ĂŒhte dApp-i olulisemat funktsiooni, mis vĂ”imaldab sĂ€ilitada plokiahelas mis tahes tĂŒĂŒpi andmeid paaride "vĂ”ti-vÀÀrtus" kujul – andmete tehing. Ühendasime selle uue tehinguga, invokeScript, mida kasutatakse dApp-i vĂ€lisest plokiahelast kutsutava funktsiooni kutsumiseks.

Andmete tehingute tĂŒĂŒp, mida me kursuse kĂ€igus kasutasime, oli kupongide lisamine turule:

letdatajson = {
    "title":        "t-sÀrk koos , hÀÀleta 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Universum",
    "description":  "Ma tahan, et sa armastaksid, mitte sÔda, ma tean, et oled seda enne kuulnud",
    "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)
})

Nende andmete töötlemiseks funktsiooniga addItem ning ostu ja muude valikute arendamiseks kasutasime kutsutavat funktsiooni, mida kasutaja saab blockchain'ist vĂ€ljast kutset teha. Tulemusena suudab see sooritada erinevaid ĂŒlesandeid, nĂ€iteks algatada vahendite ĂŒlekandeid, salvestada vĂ”i vĂ€rskendada andmeid dApp-i andmehoidmisse jne.

Siin on nÀide kutsutavast funktsioonist, mida kasutatakse funktsioonis addItem:

@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
    letsupplierAddress = toBase58String(i.caller.bytes)
    letitem = getKeyItem(supplierAddress, title)
    if( price <= 0) thenthrow("ostusumma ei saa olla vÀiksem kui toote hind")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("toode on juba olemas")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Hiljem arendasime vĂ€lja hÀÀletussĂŒsteemi, mis vĂ”imaldab hÀÀli anda teatud toodete edendamiseks vĂ”i kĂ”rvaldamiseks. Et vĂ€ltida vĂ€list mĂ”jutamist hÀÀletamise protsessis, kasutab see ‘Commit-Reveal’ skeemi.

Faas „commit” kasutatakse krĂŒpteeritud hÀÀlte kogumiseks, kasutades hash-funktsiooni ja „soola”.

Faas „reveal” kasutatakse krĂŒpteeritud hÀÀlte kogumiseks ja nende hash'ide vĂ”rdlemiseks.

Siin on nÀide kutsutavast funktsioonist, mida siin kasutatakse:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >=VOTERS) thenthrow("max hÀÀletajate arv on saavutatud")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("kasutaja on juba osalenud")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("toode ei eksisteeri")
    elseif(status !=NONE && status !=VOTING) thenthrow("hÀÀletamine ei ole vÔimalik")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item), if(commits ==VOTERS) thenREVEAL elseVOTING)
        ])
    }
}
>

Mida veel Ôppisite kursusest?

Kursus sisaldas ka tokeniseerimist ja mittevahetatavaid tokeneid (NFT) – tokeneid, mis esindavad midagi ainulaadset ja seega ei ole omavahel asendatavad.

Viimane tund oli pĂŒhendatud oraaklitele. Kuna plokiahel ei saa andmeid vĂ€lismaailmast, vajame oraakleid, et saata neid andmeid plokiahelale.

Meie turuplatvormil olid oraaklid vajalikud, et kinnitada ja vajadusel musta nimekirja panna koostööpartner, kes nĂ€iteks ei aktsepteerinud mĂŒĂŒdud kupongi.

Siin on nÀide:

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("ainult oraakli kinnitaja saab hallata valge nimekirja")
    elseif (status != VERIFIED && status != BLACKLISTED) then throw("vale staatus")
    else {
        WriteSet([
           DataEntry(getExtValueItemWhiteListStatus(supplier), status)
        ])
    }
}

Mis oli teie jaoks kÔige kasulikum?

KĂ”ige kasulikum osa olid ĂŒlesanded. TĂ€nu neile muutus loengute materjal arusaadavamaks ja vĂ€rskelt omandatud teadmised kinnistusid katse-eksituse meetodil. VĂ€ga kasulik oli ka praktiline töö IDE, uurijaga ja oraaklitega.

Kuidas kavatsete praktikas kasutada seda, mida olete Ôppinud?

Juba algusest peale lootsin, et kursus aitab viia minu projekti uuele tasemele. Idee oli nĂŒĂŒd kirjutada kood sign-web.app RIDE-is. Olemasolev versioon juba sisaldab dokumentide sertifitseerimise funktsioone, kuid RIDE abil on seda vĂ”imalik oluliselt tĂ€iustada. Uus versioon tuleb paindlikum ja arusaadavam, lisafunktsioonide hulk suureneb, sealhulgas e-kirjade, mitme osapoole vaheliste lepingute jne sertifitseerimine.

Kursus andis ka mÔtteainet ning mul tekkis palju uusi ideid. Olen kindel, et tulemused avalduvad ka tulevikus.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster