Rida pÄ vÄgen Web 3.0

Utvecklaren Christophe Verdo pratar om onlinekursen ‘Mastering Web 3.0 with Waves’, som han nyligen har genomfört.

Rida pÄ vÄgen Web 3.0

BerÀtta lite om dig sjÀlv. Vad fick dig att bli intresserad av denna kurs?

Jag har hÄllit pÄ med webbprogrammering i cirka 15 Är, huvudsakligen som frilansare.

NÀr jag utvecklade en lÄngsiktig registreringswebbapplikation för utvecklingslÀnder pÄ uppdrag av en bankgrupp, stötte jag pÄ utmaningen att integrera blockchain-certifiering i den. Vid den tidpunkten visste jag inte mycket om blockchain-certifiering, Àven om jag redan var intresserad av kryptotekniker - mest som investerare.

Det slutade med att denna funktion inte blev genomförd, men efter att ha funderat över att organisationer och banker Àr intresserade av en sÄdan lösning för sina applikationer, började jag undersöka frÄgan och snart lanserade jag projektet Signature Chain.

Jag har utvecklat dess beta-version, som redan Àr tillgÀnglig i huvudnÀtet. Vid den tiden fanns inte [programmeringssprÄket Waves] Ride, och jag gjorde allt pÄ det enklaste sÀttet, genom att anvÀnda överföringstransaktioner med inbÀddad JSON. Men huvudsyftet var att lÀgga till mer avancerad funktionalitet efter lanseringen av Ride. Och det Àr den frÀmsta anledningen till att jag gick med i kursen: nÀsta steg i projektets utveckling syftade till att skapa en decentraliserad applikation (dApp).

Vilka aspekter av kursen fann du enklast och vilka svÄrast?

Det enklaste var att vi hade gott om tid för alla uppgifter. Syftet med kursen Àr att lÀra sig nÄgot, inte att tÀvla med varandra. Förklaringarna var mycket tillgÀngliga, och illustrationerna var enkla, men uttömmande. Detta hjÀlpte till att visualisera och förstÄ olika Àmnen.

NÀr vi utförde uppgifterna uppmanades vi att tÀnka sjÀlvstÀndigt och ibland studera nÄgot pÄ egen hand. Detta Àr det bÀsta sÀttet att lÀra sig nÄgot och förstÄ de idéer som diskuteras i klasserna.

Flera gĂ„nger förstod jag inte den teoretiska delen fullt ut förrĂ€n jag började skriva kod för att utföra uppgiften. Vi fick inte lov att göra ‘copy/paste’, all kod mĂ„ste skrivas av oss sjĂ€lva, och det hjĂ€lpte ocksĂ„ till förstĂ„ allt bĂ€ttre.

Det svÄraste var att frÄgorna i uppgiften med flera svarsalternativ inte alltid var tydliga. Min engelska Àr inte perfekt, och frÄgorna var skrivna av nÄgon som inte Àr modersmÄlstalare, sÄ ibland uppstod missförstÄnd.

Kanske kunde den del av kursen som handlar om orakler och NFT:er ha varit mer detaljerad. Men oavsett, huvudsyftet med kursen Àr att vÀcka intresse hos utvecklarna. För att helt förstÄ alla aspekter kommer man förstÄs behöva lÀgga ner tid pÄ att experimentera och öva.

BerĂ€tta mer om lösningen som ni arbetade med under hela kursen – ‘Coupon Bazaar’? Kan vi ocksĂ„ fĂ„ se exempel pĂ„ kod?

Ja, vi arbetade pĂ„ ‘Coupon Bazaar’, det Ă€r en marknadsplats dĂ€r folk kan sĂ€lja och köpa kuponger som ger rĂ€tt att köpa varor och tjĂ€nster till ett lĂ€gre pris. Varje kupong representeras av en digital tillgĂ„ng som innebĂ€r en speciell rabatt frĂ„n leverantören.

Rida pÄ vÄgen Web 3.0

Det var nödvÀndigt att utveckla flera komponenter av applikationen. Först och frÀmst behövdes ett system för registrering av leverantörer och hantering av kuponger. Sedan behövdes en verifieringsfunktion och möjlighet för anvÀndare att söka kuponger.

Rida pÄ vÄgen Web 3.0

Under kursen la vi ocksÄ till flera nya funktioner, inklusive ett röstningssystem och en funktion som gör det möjligt att verifiera och svarta listan leverantörer.

Först studerade vi skillnaden mellan smarta tillgÄngar, smarta konton och dApp-konton samt hur verifieringsfunktionerna fungerar. Verifieringsfunktionerna gör det möjligt att Àndra det förvalda beteendet för ett konto. Som standard kontrollerar de transaktionssignaturer, men verifieringsfunktionen tillÄter att stÀlla in andra "regler".

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

Sedan började vi lĂ€gga till kuponger. Vi anvĂ€nde en av de viktigaste funktionerna i dApp som gör att vi kan skriva data av alla typer till blockkedjan i form av nyckel-vĂ€rde-par – datatransaktion. Vi kombinerade det med en ny transaktion, invokeScript, som anvĂ€nds för att anropa en funktion i dApp utanför blockkedjan.

Typ av datatransaktioner som vi anvÀnde under kursens gÄng Àr att lÀgga till kuponger pÄ marknadsplatsen:

letdatajson = {
    "title":        "t-shirt med, rösta 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Universum",
    "description":  "Jag vill att du ska göra kÀrlek, inte krig, jag vet att du har hört det förut",
    "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)
})

För att bearbeta dessa data med addItem-funktionen och utveckla köp- och andra alternativ anvÀnde vi en anropbar funktion som anvÀndaren kan kalla utanför blockkedjan. Som ett resultat kan den utföra olika uppgifter, exempelvis initiera överföring av medel, lagra eller uppdatera data i dApp-lagringen etc.

HÀr Àr ett exempel pÄ en anropbar funktion som anvÀnds i funktionen addItem:

@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
    letsupplierAddress = toBase58String(i.caller.bytes)
    letitem = getKeyItem(supplierAddress, title)
    if( price <= 0) thenthrow("inköpsbeloppet kan inte vara mindre Àn varans pris")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("en vara finns redan")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Senare utvecklade vi ett röstningssystem som tillÄter anvÀndare att rösta för att frÀmja eller ta bort specifika produkter. För att förhindra extern pÄverkan pÄ röstningsprocessen anvÀnder det en 'Commit-Reveal'-strategi.

Commit-fasen anvÀnds för att samla in krypterade röster med hjÀlp av en hash-funktion och 'salt'.

Reveal-fasen anvÀnds för att samla in krypterade röster och jÀmföra deras hashes.

HÀr Àr ett exempel pÄ en anropbar funktion som anvÀnds hÀr:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >=VOTERS) thenthrow("max antal röstare har nÄtts")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("anvÀndaren har redan deltagit")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("varan existerar inte")
    elseif(status !=NONE && status !=VOTING) thenthrow("röstning Àr inte möjlig")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
        ])
    }
}
>

Vad mer har du lÀrt dig frÄn kursen?

Kursen inkluderade Ă€ven tokenisering och icke-fungibla tokens (NFT) – tokens som representerar nĂ„got unikt och dĂ€rför inte Ă€r utbytbara.

Det sista lektionen handlade om oraklar. Eftersom blockkedjan inte kan ta emot data frÄn den externa vÀrlden behöver vi oraklar för att skicka in dessa data.

För vÄr marknadsplats behövdes oraklar för att verifiera och, vid behov, svartlista en leverantör som till exempel inte accepterade en sÄld kupong.

HÀr Àr ett exempel:

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

Vad var mest anvÀndbart för dig?

Den mest anvÀndbara delen var uppgifterna. Tack vare dem blev förelÀsningsmaterialet tydligare, och de nya kunskaperna befÀstes genom trial and error. Den praktiska jobbet med IDE, utforskaren och oraklarna.

Hur planerar du att anvÀnda det du lÀrt dig i praktiken?

FrÄn början förvÀntade jag mig att kursen skulle ta mitt projekt till en ny nivÄ. Idén var att nu skriva kod sign-web.app i RIDE. Den nuvarande versionen har redan funktioner för dokumentcertifiering, men tack vare RIDE kommer den att kunna förbÀttras avsevÀrt. Den nya versionen blir mer flexibel och lÀttförstÄelig, med fler funktioner, inklusive certifiering av elektroniska brev, avtal mellan flera parter osv.

Kursen gav ocksÄ inspiration och jag fick mÄnga nya idéer. Jag Àr sÀker pÄ att resultaten kommer att visas Àven i framtiden.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster