Rid på bølgen af Web 3.0

Udvikleren Christophe Verdo fortæller om onlinekurset ‘Mastering Web 3.0 with Waves’, som han for nylig har gennemført.

Rid på bølgen af Web 3.0

Fortæl lidt om dig selv. Hvad interesserede dig ved dette kursus?

Jeg har arbejdet med webudvikling i omkring 15 år, for det meste som freelancer.

Da jeg udviklede en langtidsholdbar webapplikation til udviklingslande for en bankgruppe, stødte jeg på udfordringen med at integrere blockchain-certificering. Dengang vidste jeg ikke meget om blockchain-certificering, selv om jeg allerede var interesseret i kryptoteknologier – primært som investor.

Som resultat blev denne funktion ikke implementeret, men da jeg overvejede, at organisationer og banker var interesseret i sådanne løsninger til deres applikationer, begyndte jeg at undersøge emnet og lancerede snart projektet Signature Chain.

Jeg har udviklet beta-versionen, som allerede er tilgængelig i hovednetværket. Dengang fandtes [programmeringssproget Waves] Ride endnu ikke, så jeg gjorde det på den nemmeste måde ved at bruge overførsels-transaktioner med indlejret JSON. Men hovedformålet var at tilføje mere avanceret funktionalitet efter lanceringen af Ride. Og det er hovedårsagen til, at jeg tilmeldte mig kurset: den næste fase af projektet involverede oprettelsen af en decentraliseret applikation (dApp).

Hvilke aspekter af kurset virkede mest enkle for dig, og hvilke var de mest udfordrende?

Det letteste var, at vi havde tilstrækkelig tid til alle opgaver. Formålet med kurset er at lære noget, ikke at konkurrere med hinanden. Forklaringerne var meget tilgængelige, og illustrationerne var enkle, men udførlige. Dette hjalp med at visualisere og forstå forskellige emner.

Når vi arbejdede på opgaver, blev vi opfordret til at tænke selvstændigt og nogle gange at studere noget for os selv. Det er den bedste måde at lære noget på og forstå de ideer, der blev diskuteret i lektionerne.

Flere gange forstod jeg ikke helt den teoretiske del, før jeg begyndte at skrive kode til opgaven. Vi måtte ikke lave ‘copy/paste’, al koden skulle skrives af os selv, og dette hjalp også med at få en bedre forståelse.

Det sværeste var, at spørgsmålene i opgaven med flere svarmuligheder ikke altid var klare. Mit engelsk er ikke perfekt, og spørgsmålene var skrevet af en person, der ikke er modersmålstaler, hvilket nogle gange førte til misforståelser.

Måske kunne den del af kurset, der handlede om orakler og NFT'er, have været mere detaljeret. Men uanset hvad, er kursusets primære mål at interessere udviklerne. Senere, for at forstå alle aspekter fuldstændigt, skal man naturligvis bruge tid på at eksperimentere og praktisere.

Fortæl os mere om løsningen, som du arbejdede på i løbet af kurset – ‘Coupon Bazaar’? Kan vi også se kodeeksempler?

Ja, vi arbejdede på ‘Coupon Bazaar’, det er en markedsplads, hvor folk køber og sælger kuponer, der giver mulighed for at købe varer og tjenester til en lavere pris. Hver kupon præsenteres som en digital aktiv, der indebærer en særlig rabat fra leverandøren.

Rid på bølgen af Web 3.0

Det var nødvendigt at udvikle flere komponenter til applikationen. For det første skulle der oprettes et system til registrering af leverandører og administration af kuponer. Derefter var der behov for en verifikationsfunktion og muligheden for, at brugerne kunne søge efter kuponer.

Rid på bølgen af Web 3.0

Under kurset tilføjede vi også flere nye funktioner, herunder et afstemningssystem og en funktion, der gør det muligt at verificere og sortere leverandører på en sortliste.

Først undersøgte vi forskellen mellem smarte aktiver, smarte konti og dApp-konti samt grundlaget for arbejdet med verifikationsfunktioner. Verifikationsfunktioner giver mulighed for at ændre den standardadfærd, der er angivet for kontoen. Som standard kontrollerer de transaktionssignaturer, men verifikationsfunktionen gør det muligt at angive andre “regler”.

{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
letownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M'
@Verifier(tx)
funcverify() = {
    matchtx {
        cases: SetScriptTransaction=>sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey)
        cased: DataTransaction=>true
        case_ =>false
    }
}

Derefter begyndte vi at tilføje kuponer. Vi brugte en af de mest essentielle funktioner i dApp, som gør det muligt at optage data af enhver type i blockchain som par af “nøgle-værdi” – datatransaktion. Vi kombinerede det med en ny transaktion, invokeScript, der bruges til at kalde en funktion i dApp fra uden for blokchain.

Den type data-transaktion, vi anvendte under kurset, er tilføjelsen af kuponer til markedspladsen:

letdatajson = {
    "title":        "t-shirt med , stem 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Universet",
    "description":  "Jeg vil have, at du elsker, ikke krig, jeg ved, du har hørt det før",
    "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)
})

For at behandle disse data med funktionen addItem og udvikle køb- og andre funktionaliteter, anvendte vi en kaldbar funktion, som brugeren kan kalde udefra blockchain. Som et resultat kan den udføre forskellige opgaver, såsom at initiere overførsel af midler, registrere eller opdatere data i dApp-databasen osv.

Her er et eksempel på den kaldbare funktion, der anvendes 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("købsbeløbet kan ikke være mindre end vareprisen")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("en vare findes allerede")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Senere udviklede vi et afstemningssystem, der gør det muligt at afgive stemmer for at promovere eller fjerne bestemte produkter. For at forhindre udenlandsk indflydelse på afstemningsprocessen anvender det 'Commit-Reveal' skemaet.

Commit-fasen bruges til at indsamle krypterede stemmer ved hjælp af en hash-funktion og 'salt'.

Reveal-fasen bruges til at indsamle krypterede stemmer og sammenligne deres hashes.

Her er et eksempel på den kaldbare funktion, der anvendes her:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >=VOTERS) thenthrow("maksi antal af stemmer er nået")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("brugeren har allerede deltaget")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("varen eksisterer ikke")
    elseif(status !=NONE && status !=VOTING) thenthrow("afstemning er ikke mulig")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
        ])
    }
}
>

Hvad har du ellers lært fra kurset?

Kurset omfattede også tokenisering og non-fungible tokens (NFT) – tokens, der repræsenterer noget unikt og derfor ikke kan byttes.

Den sidste lektion handlede om orakler. Da blockchain ikke kan modtage data fra den ydre verden, har vi brug for orakler til at sende disse data ind i den.

For vores markedsplads var orakler nødvendige for at verificere og, hvis nødvendigt, sortliste en leverandør, der for eksempel ikke har accepteret den solgte kupon.

Here is an example:

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("kun orakel verificatorer kan administrere whitelist")
    elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("forkert status")
    else{
        WriteSet([
           DataEntry(getExtValueItemWhiteListStatus(supplier), status)
        ])
    }
}

Hvad har været mest nyttigt for dig?

Den mest nyttige del var opgaverne. Takket være dem blev undervisningsmaterialet mere forståeligt, og de netop erhvervede færdigheder blev cementeret gennem forsøg og fejl. Det var også meget nyttigt at arbejde praktisk med IDE, exploreren og oraklerne.

Hvordan planlægger du at bruge det, du har lært, i praksis?

Fra starten forventede jeg, at kurset ville hjælpe med at tage mit projekt til det næste niveau. Ideen var at nu skrive koden sign-web.app i RIDE. Den eksisterende version har allerede funktioner til dokumentcertificering, men takket være RIDE kan den forbedres betydeligt. Den nye version vil være mere fleksibel og forståelig, med flere funktioner, herunder certificering af e-mails, aftaler mellem flere parter osv.

Kurset gav også stof til eftertanke, og jeg fik mange nye idéer. Jeg er sikker på, at resultaterne vil vise sig i fremtiden.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster