Sēdi uz Web 3.0 viļņa

Izstrādātājs Kristofs Verdo stāsta par tiešsaistes kursu ‘Mastering Web 3.0 with Waves’, kuru viņš nesen pabeidza.

Sēdi uz Web 3.0 viļņa

Pastāstiet nedaudz par sevi. Kas jūs ieinteresēja šajā kursā?

Es nodarbojos ar tīmekļa izstrādi apmēram 15 gadus, galvenokārt kā brīvprātīgais.

Izstrādājot ilgtspējīga reģistrēšanās tīmekļa lietotni attīstības valstīm pēc bankas grupas pasūtījuma, es saskāros ar uzdevumu integrēt tajā blokķēdes sertifikāciju. Tajā laikā es nezināju daudz par blokķēdes sertifikāciju, lai gan jau biju ieinteresēts kripto tehnoloģijās – galvenokārt kā investors.

Rezultātā šī funkcija netika īstenota, bet, padomājot par to, ka organizācijas un bankas ir ieinteresētas šādā risinājumā savām lietotnēm, es sāku pētīt šo jautājumu un drīz uzsāku projektu Signature Chain.

Es izstrādāju tā beta versiju, kas jau ir pieejama galvenajā tīklā. Tajā laikā [programmēšanas valoda Waves] Ride vēl nebija, un es visu veicu vissimplākajā veidā, izmantojot pārskaitījumu darījumus ar iekļautu JSON. Bet galvenais mērķis bija pievienot progresīvāku funkcionalitāti pēc Ride palaišanas. Un tas ir galvenais iemesls, kāpēc es pievienojos kursam: nākamais projekta attīstības posms paredzēja decentralizētas lietotnes (dApp) izveidi.

Kuri kursa aspekti jums šķita visvieglākie, un kuri visgrūtākie?

Visvieglāk bija tas, ka mums bija pietiekami daudz laika visiem uzdevumiem. Kursa jēga ir mācīties kaut ko, nevis sacensties savā starpā. Skaidrojumi bija ļoti pieejami, un ilustrācijas – vienkāršas, bet izsmeļošas. Tas palīdzēja vizualizēt un saprast dažādas tēmas.

Veicot uzdevumus, mūs mudināja domāt neatkarīgi un dažreiz ko pašam pētīt. Tas ir labākais veids, kā ko iemācīties un izprast idejas, kas tika apspriestas nodarbībās.

Vairākas reizes es pilnībā nesapratu teorētisko daļu līdz brīdim, kad sāku rakstīt kodu, pildot uzdevumu. Mums nebija atļauts veikt ‘copy/paste’, visu kodu bija jāraksta pašiem, un tas arī palīdzēja labāk visā izprast.

Grūtākā daļa bija tā, ka jautājumi vairāku izvēļu uzdevumā nebija vienmēr skaidri. Mans angļu valodas prasmju līmenis nav ideāls, un jautājumus bija izstrādājusi persona, kas nav dzimtā valoda, tāpēc reizēm radās pārpratumi.

Iespējams, ka daļa kursa, kas veltīta orakuliem un NFT, varēja būt detalizētāka. Bet jebkurā gadījumā galvenais kursa mērķis ir ieinteresēt izstrādātājus. Pēc tam, lai pilnībā izprastu visus tā aspektus, būs nepieciešams kādu laiku veltīt eksperimentiem un praksei.

Pastāstiet sīkāk par risinājumu, pie kura strādājāt visa kursa laikā – ‘Coupon Bazaar’? Vai varam redzēt arī koda piemērus?

Jā, mēs strādājām pie ‘Coupon Bazaar’, tas ir tirgus, kur cilvēki pārdod un pērk kuponus, kas dod tiesības iegādāties preces un pakalpojumus par zemāku cenu. Katrs kupons tiek attēlots kā digitāls aktīvs, kas nozīmē īpašu atlaidi no piegādātāja.

Sēdi uz Web 3.0 viļņa

Bija jāsagatavo vairāki lietotnes komponenti. Pirmkārt, bija jāizveido sistēma piegādātāju reģistrācijai un kuponu pārvaldībai. Pēc tam bija nepieciešama verifikācijas funkcija un iespēja lietotājiem meklēt kuponus.

Sēdi uz Web 3.0 viļņa

Kursa laikā mēs arī pievienojām vairākas jaunas funkcijas, tostarp balsošanas sistēmu un funkciju, kas ļauj verificēt un iekļaut melnajā sarakstā piegādātājus.

Vispirms mēs izpētījām atšķirību starp viedajiem aktīviem, viedajiem kontiem un dApp kontiem, kā arī funkcijas verifikatora darbību. Verifikatora funkcijas ļauj mainīt konta uzvedību, kas noteikta pēc noklusējuma. Noklusējuma iestatījumi pārbauda darījumu parakstus, bet verifikatora funkcija ļauj noteikt citas „noteikumu” kategorijas.

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

Pēc tam mēs sākām pievienot kuponus. Mēs izmantojām vienu no svarīgākajām dApp funkcijām, kas ļauj ierakstīt blokķēdē jebkura veida datus kā „atslēga-vērtība” pārus – datu darījums. Mēs to apvienojām ar jaunu darījumu, invokeScript, kas tiek izmantota, lai izsauktu dApp funkciju no ārpuses bloķēšanā.

Datu transakciju veids, ko mēs izmantojām kursa laikā, ir kuponu pievienošana tirgus vietnei:

letdatajson = {
    "title":        "t-krekls ar, balsojiet 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Visums",
    "description":  "Es vēlos, lai tu mīlētu, nevis karotu, es zinu, ka tu to jau esi dzirdējis",
    "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)
})

Šo datu apstrādei ar funkciju addItem un citu opciju izstrādei mēs izmantojām izsaucamo funkciju, kuru lietotājs var izsaukt ārpus blokķēdes. Rezultātā tā var veikt dažādas uzdevumus, piemēram, iniciēt līdzekļu pārsūtīšanu, ierakstīt vai atjaunināt dApp datu glabātavā u.tml.

Šis ir piemērs izsaucamās funkcijas, kas tiek izmantota funkcijā addItem:

@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
    letsupplierAddress = toBase58String(i.caller.bytes)
    letitem = getKeyItem(supplierAddress, title)
    if( price <= 0) thenthrow("pirkuma summa nevar būt mazāka par priekšmeta cenu")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("priekšmets jau pastāv")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Vēlāk mēs izstrādājām balsošanas sistēmu, kas ļauj balsot par noteiktu produktu popularizēšanu vai izslēgšanu. Lai novērstu ārēju ietekmi uz balsošanas procesu, tā izmanto 'Commit-Reveal' shēmu.

‘commit’ posms tiek izmantots, lai savāktu šifrētas balsis, izmantojot hash funkciju un ‘sāli’.

‘reveal’ posms tiek izmantots, lai savāktu šifrētas balsis un salīdzinātu to hash.

Šis ir piemērs izsaucamās funkcijas, kas tiek izmantota šeit:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >= VOTERS) thenthrow("sasniegts maksimālais balsotāju skaits")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("lietotājs jau ir piedalījies")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("priekšmets nepastāv")
    elseif(status !=NONE && status !=VOTING) thenthrow("balsošana nav iespējama")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item), if(commits == VOTERS) then REVEAL else VOTING)
        ])
    }
}
>

Ko jūs vēl uzzinājāt no kursa?

Kurss ietvēra arī tokenizāciju un non-fungible tokenus (NFT) – tokenus, kas attēlo kaut ko unikālu un tādēļ nav savstarpēji aizstājami.

Pēdējā nodarbība bija veltīta orakuliem. Tā kā blokķēde nevar iegūt datus no ārpasaules, mums nepieciešami orakuli, lai nosūtītu šos datus tai.

Mūsu tirgus vietnei orakuli bija vajadzīgi, lai verificētu un, ja nepieciešams, iekļautu melnajā sarakstā piegādātāju, kurš, piemēram, nepieņēma pārdoto kuponu.

Lūk, piemērs:

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

Kas jums bija visnoderīgākais?

Visnoderīgākā daļa bija uzdevumi. Pateicoties tiem, lekciju materiāls kļuva skaidrāks, un tikko iegūtās zināšanas tika nostiprinātas ar izmēģinājumiem un kļūdām. Ļoti noderīga bija arī praktiskā darba ar IDE, eksploreriem un orakuliem.

Kā plānojat izmantot to, ko esat iemācījušies, praksē?

No paša sākuma es gaidīju, ka kurss palīdzēs pacelt manu projektu jaunā līmenī. Ideja bija tāda, ka tagad jāraksta kods sign-web.app RIDE. Esošā versija jau ietver dokumentu sertifikācijas funkcijas, bet, pateicoties RIDE, to varēs ievērojami uzlabot. Jaunajā versijā būs vairāk elastības un skaidrības, vairāk funkciju, tostarp elektronisko vēstu sertifikācija, līgumu starp vairākiem dalībniekiem utt.

Kurss arī deva iedvesmu pārdomām, un man radās daudz jaunu ideju. Esmu pārliecināts, ka rezultāti parādīsies arī nākotnē.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster