Jazdite na vlne Web 3.0

Vývojár Christoph Verdo hovorí o online kurze ‘Mastering Web 3.0 with Waves’, ktorý nedávno absolvoval.

Jazdite na vlne Web 3.0

Povedzte nám niečo o sebe. Čo vás na tomto kurze zaujalo?

Zameriavam sa na webový vývoj už približne 15 rokov, prevažne ako freelancer.

Pri vývoji webovej aplikácie dlhodobého registru pre rozvojové krajiny na objednávku jednej bankovej skupiny som sa stretol s úlohou integrácie blockchainovej certifikácie. V tej dobe som o blockchainovej certifikácii nevedel veľa, aj keď som sa už zaujímal o krypto-technológie – prevažne ako investor.

Nakoniec sa táto funkcia nerealizovala, ale zamyslel som sa nad tým, že organizácie a banky by o takéto riešenie mohli mať záujem pre svoje aplikácie, a začal som sa tejto téme venovať a čoskoro spustil projekt Signature Chain.

Vyvinul som jeho beta verziu, ktorá je už dostupná v hlavnej sieti. V tej dobe [programovacieho jazyka Waves] Ride ešte neexistovalo, a všetko som robil najjednoduchším spôsobom, používajúc prevody transakcií s vloženým JSON. Hlavným cieľom však bolo pridať pokročilejšiu funkcionalitu po spustení Ride. A to je hlavný dôvod, prečo som sa pridal k kurzu: ďalšia fáza vývoja projektu predpokladala vytvorenie decentralizovanej aplikácie (dApp).

Ktoré aspekty kurzu sa vám zdali najjednoduchšie a ktoré najťažšie?

Najjednoduchšie bolo, že sme mali dosť času na všetky úlohy. Zmyslom kurzu bolo naučiť sa niečo, a nie súťažiť medzi sebou. Vysvetlenia boli veľmi prístupné a ilustrácie jednoduché, ale vyčerpávajúce. Pomohlo to vizualizovať a pochopiť rôzne témy.

Pri plnení úloh nás povzbudzovali, aby sme mysleli samostatne a niekedy sa niečo naučili sami. To je najlepší spôsob, ako sa niečo naučiť a porozumieť myšlienkam, ktoré sa preberajú na hodinách.

Niekoľkokrát som úplne nerozumel teoretickej časti, kým som nezačal písať kód pri plnení úlohy. Nemohli sme robiť ‘copy/paste’, celý kód sme museli písať sami, a to tiež pomohlo lepšie sa orientovať vo všetkom.

Najťažšie bolo, že otázky v úlohe s viacerými možnosťami odpovede neboli vždy jasné. Moja angličtina nie je dokonalá a otázky boli napísané niekým, kto nie je rodeným hovorcom jazyka, preto občas vznikali nedorozumenia.

Možno by mohla byť časť kurzu venovaná oráklom a NFT podrobnejšia. Ale v každom prípade je hlavnou úlohou kurzu zaujať vývojárov. Následne, aby sme úplne pochopili všetky jeho aspekty, bude potrebné stráviť nejaký čas experimentovaním a praktizovaním.

Porozprávajte nám viac o riešení, na ktorom ste pracovali počas celého kurzu – 'Coupon Bazaar'? Môžeme tiež vidieť príklady kódu?

Áno, pracovali sme na 'Coupon Bazaar', to je trhovisko, kde ľudia predávajú a kupujú kupóny, ktoré dávajú právo na nákup tovaru a služieb za nižšiu cenu. Každý kupón je predstavovaný digitálnym aktívom, ktoré predpokladá špeciálnu zľavu od dodávateľa.

Jazdite na vlne Web 3.0

Bolo potrebné vyvinúť niekoľko komponentov aplikácie. Predovšetkým bolo potrebné vytvoriť systém na registráciu dodávateľov a správu kupónov. Potom bola potrebná funkcia verifikácie a možnosť vyhľadávať kupóny užívateľmi.

Jazdite na vlne Web 3.0

Počas kurzu sme tiež pridali niekoľko nových funkcií, vrátane systému hlasovania a funkcie, ktorá umožňuje overovať a umiestňovať dodávateľov na čiernu listinu.

Najprv sme študovali rozdiel medzi smart assetmi, smart účtami a dApp účtami a základy práce s funkciami verifikátora. Funkcie verifikátora umožňujú meniť správanie účtu, ktoré je nastavené predvolene. Predvolene kontrolujú podpisy transakcií, ale funkcia verifikátora umožňuje nastavovať iné „pravidlá“.

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

Potom sme začali pridávať kupóny. Použili sme jednu z najdôležitejších funkcií dApp, ktorá umožňuje zapisovať do blockchainu údaje akéhokoľvek typu vo forme párov „kľúč-hodnota“ – transakciu údajov. Spojili sme ju s novou transakciou, invokeScript, ktorá sa používa na volanie vyvolanej funkcie v dApp zvonka blockchainu.

Typ transakcií údajov, ktorý sme použili počas prechodu kurzom, je pridávanie kupónov na trh:

letdatajson = {
    "title":        "tričko s , hlasuj 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Vesmír",
    "description":  "Chcem, aby ste sa milovali, nie vojovali, viem, že ste to už počuli",
    "image":        "https://bit.ly/2EXTghg"
}
it('add item', async function(){
    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 = await broadcast(ts)
    await waitForTx(tx.id)
})

Na spracovanie týchto údajov funkcionalitou addItem a vývoj funkcie nákupu a iných možností sme použili vyvolávanú funkciu, ktorú môže používateľ zavolať zvonku blockchainu. V dôsledku toho môže vykonávať rôzne úlohy, ako napríklad iniciovať převod prostriedkov, zapisovať alebo aktualizovať údaje v úložisku údajov dApp atď.

Tu je príklad vyvolávanej funkcie, ktorá sa používa vo funkcii addItem:

@Callable(i)
func addItem(title: String, price: Int, data: String) = {
    let supplierAddress = toBase58String(i.caller.bytes)
    let item = getKeyItem(supplierAddress, title)
    if (price <= 0) then throw("nákupná suma nemôže byť menšia ako cena položky")
    elseif (getValueItemSupplier(item) != NONE) then throw("položka už existuje")
    else {
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Neskôr sme vyvinuli systém hlasovania, ktorý umožňuje odovzdávať hlasy na podporu alebo odstránenie určitých produktov. Aby sme zabránili vonkajšiemu vplyvu na proces hlasovania, používa schému 'Commit-Reveal'.

Fáza "commit" sa používa na zhromažďovanie zašifrovaných hlasov pomocou hash-funkcie a "soľou".

Fáza "reveal" sa používa na zhromažďovanie zašifrovaných hlasov a porovnávanie ich hash.

Tu je príklad vyvolávanej funkcie, ktorá sa používa tu:

@Callable(i)
func voteCommit(item: String, hash: String) = {
    let user = toBase58String(i.caller.bytes)
    let commits = getValueCommitsCount(item)
    let status = getValueItemStatus(item)
    if (commits >= VOTERS) then throw("dosiahli sme maximálny počet voličov")
    elseif (getValueCommit(item, user) != NONE) then throw("používateľ sa už zúčastnil")
    elseif (getKeyItemSupplier(item) == NONE) then throw("položka neexistuje")
    elseif (status != NONE && status != VOTING) then throw("hlasovanie nie je možné")
    else {
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits + 1),
           DataEntry(getKeyItemStatus(item), if (commits == VOTERS) then REVEAL else VOTING)
        ])
    }
}
>

Čo ešte ste sa naučili z kurzu?

Kurz zahŕňal aj tokenizáciu a non-fungible tokeny (NFT) – tokeny, ktoré zastupujú niečo jedinečné a preto nie sú zamenné.

Posledná lekcia bola venovaná oráklom. Keďže blockchain nemôže získavať údaje z vonkajšieho sveta, potrebujeme orákly na posielanie týchto údajov do neho.

Pre náš trh boli orákly potrebné na overenie a, ak je to potrebné, zaradenie dodávateľa, ktorý napríklad neprijal predaný kupón, na čiernu listinu.

Tu je príklad:

funcgetExtValueItemWhiteListStatus(item:String) = {
    item +"_verifier_status"
}
 
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "overené"
letBLACKLISTED = "čierna listina"
@Callable(i)
funcsetstatus(dodávateľ: String, status: String) = {
    letaccount = toBase58String(i.caller.bytes)
    if( account !=verifier ) thenthrow("iba oráklový verifikátor môže spravovať bielu listinu")
    elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("nesprávny status")
    else{
        WriteSet([
           DataEntry(getExtValueItemWhiteListStatus(dodávateľ), status)
        ])
    }
}

Čo bolo pre vás najviac užitočné?

Najužitočnejšia časť boli úlohy. Vďaka nim bol materiál prednášok zrozumiteľnejší a novonadobudnuté vedomosti sa upevňovali metódou pokusov a omylov. Veľmi užitočná bola aj praktická práca s IDE, prieskumníkom a orákľami.

Ako plánujete prakticky využiť to, čo ste sa naučili?

Už od začiatku som očakával, že kurz pomôže posunúť môj projekt na novú úroveň. Myšlienka spočívala v tom, že teraz napíšem kód sign-web.app v RIDE. Existujúca verzia už má funkcie certifikácie dokumentov, ale vďaka RIDE ju bude možné výrazne vylepšiť. Nová verzia bude flexibilnejšia a zrozumiteľnejšia, bude mať viac funkcií, vrátane certifikácie elektronických správ, zmlúv medzi viacerými stranami atď.

Kurz tiež poskytol podnety na zamyslenie a získal som množstvo nových nápadov. Som presvedčený, že výsledky sa prejavia aj v budúcnosti.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster