Utviklaren Kristof Verdo snakker om nettkurset ‘’, som han nylig har fullført.

Fortell litt om deg selv. Hva vekket interessen din for dette kurset?
Jeg har jobbet med webutvikling i omtrent 15 år, for det meste som frilanser.
Da jeg utviklet en webapplikasjon for langsiktig registrering for utviklingsland på oppdrag fra en bankgruppe, støtte jeg på oppgaven med å integrere blockchain-sertifisering. På den tiden visste jeg ikke mye om blockchain-sertifisering, selv om jeg allerede var interessert i kryptoteknologier – hovedsakelig som investor.
Resultatet var at denne funksjonen ikke ble implementert, men etter å ha tenkt på at organisasjoner og banker er interessert i en slik løsning for sine applikasjoner, begynte jeg å studere saken og startet snart prosjektet .
Jeg utviklet beta-versjonen, som allerede er tilgjengelig i hovednettet. På den tiden fantes ikke [programmeringsspråket Waves] Ride, så jeg gjorde alt på den enkleste måten ved hjelp av overføringstransaksjoner med innebygd JSON. Men hovedmålet var å legge til mer avansert funksjonalitet etter lanseringen av Ride. Og dette er hovedgrunnen til at jeg ble med i kurset: den neste utviklingsfasen av prosjektet innebar å lage en desentralisert applikasjon (dApp).
Hvilke aspekter ved kurset syntes du var enklest, og hvilke var vanskeligst?
Det enkleste var at vi hadde nok tid til alle oppgavene. Poenget med kurset er å lære noe, ikke å konkurrere med hverandre. Forklaringene var lettfattelige, og illustrasjonene var enkle, men dekkende. Dette hjalp til med å visualisere og forstå forskjellige temaer.
Når vi utførte oppgavene, ble vi oppfordret til å tenke selvstendig og noen ganger lære noe på egen hånd. Dette er den beste måten å lære noe på og forstå idéene som ble diskutert i timene.
Flere ganger forstod jeg ikke den teoretiske delen fullt ut før jeg begynte å skrive kode for oppgaven. Vi fikk ikke lov til å gjøre ‘copy/paste’, all koden måtte skrives selv, og dette hjalp også med å forstå alt bedre.
Den største utfordringen var at spørsmålene i oppgaven med flervalg ikke alltid var klare. Engelskferdighetene mine er ikke perfekte, og spørsmålene var skrevet av en som ikke er morsmålstalende, så det oppstod noen ganger misforståelser.
Kanskje delen av kurset som handler om orakler og NFT-er kunne vært mer detaljert. Men uansett er den viktigste oppgaven med kurset å vekke interesse hos utviklerne. For å fullt ut forstå alle aspektene må man selvsagt bruke tid på å eksperimentere og praktisere.
Kan du fortelle mer om løsningen du jobbet med gjennom hele kurset – 'Coupon Bazaar'? Kan vi også se kodeeksempler?
Ja, vi arbeidet med 'Coupon Bazaar'; det er en markedsplass hvor folk kjøper og selger kuponger som gir rett til å kjøpe varer og tjenester til lavere priser. Hver kupong presenteres som en digital eiendel som gir spesielle rabatter fra leverandøren.

Vi måtte utvikle flere komponenter av applikasjonen. Først måtte vi lage et system for registrering av leverandører og administrering av kuponger. Deretter trengtes en verifikasjonsfunksjon og muligheten for brukerne til å søke etter kuponger.

I løpet av kurset la vi også til flere nye funksjoner, inkludert et stemmesystem og en funksjon som lar oss verifisere og svarteliste leverandører.
Først studerte vi forskjellen mellom smarte eiendeler, smarte kontoer og dApp-kontoer, samt hvordan verifikasjonsfunksjoner fungerer. Verifikasjonsfunksjoner lar oss endre standardadferden til kontoen. Som standard sjekker de signaturer på transaksjoner, men verifikasjonsfunksjonen lar oss sette 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
}
}Deretter begynte vi å legge til kuponger. Vi brukte en av de viktigste funksjonene til dApp som lar oss lage blokkjeder med data av enhver type i form av nøkkel-verdi-par – en datatransaksjon. Vi kombinerte dette med en ny transaksjon, invokeScript, som brukes til å kalle funksjonen i dApp fra utenfor blokkjeden.
Datatyper som vi brukte under kurset var å legge til kuponger på markedsplassen:
letdatajson = {
"title": "t-skjorte med, stem 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Univers",
"description": "Jeg vil at du skal elske, ikke krige, jeg vet 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 å behandle disse dataene med funksjonen addItem og utvikle funksjonen for kjøp og andre alternativer, brukte vi en kallbar funksjon som brukeren kan kalle utenfor blokkjeden. Som et resultat kan den utføre ulike oppgaver, for eksempel å initiere overføring av midler, skrive eller oppdatere data i dApp-databasen, osv.
Her er et eksempel på den kallbare funksjonen som brukes i funksjonen addItem:
@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, title)
if( price <= 0) thenthrow("kjøpsbeløpet kan ikke være mindre enn vareprisen")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("elementet finnes allerede")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}Senere utviklet vi et stemmesystem som lar brukerne stemme for å fremme eller fjerne bestemte produkter. For å forhindre påvirkning utenfra under stemmeprosessen, bruker den en
«commit»-fasen brukes til å samle inn krypterte stemmer ved hjelp av en hash-funksjon og
salt.
«reveal»-fasen brukes til å samle inn de krypterte stemmene og sammenligne hashene.
Her er et eksempel på den kallbare funksjonen som brukes her:@Callable(i) funcvoteCommit(item: String, hash: String) = { letuser = toBase58String(i.caller.bytes) letcommits = getValueCommitsCount(item) letstatus = getValueItemStatus(item) if( commits >= VOTERS) thenthrow("maks antall stemmer er nådd") elseif(getValueCommit(item, user) !=NONE) thenthrow("brukeren har allerede deltatt") elseif(getKeyItemSupplier(item) ==NONE) thenthrow("elementet eksisterer ikke") elseif(status !=NONE && status !=VOTING) thenthrow("stemming er ikke mulig") else{ WriteSet([ DataEntry(getKeyCommit(item, user), hash), DataEntry(getKeyCommitsCount(item), commits + 1), DataEntry(getKeyItemStatus(item), if(commits == VOTERS) then REVEAL else VOTING) ]) } } >" ,
Kurset inkluderte også tokenisering og non-fungible tokens (NFT) – tokens som representerer noe unikt og derfor ikke er utskiftbare.
Det siste kurset handlet om orakler. Siden blockchain ikke kan motta data fra den eksterne verden, trenger vi orakler for å sende disse dataene inn.
For vår markedsplass var orakler nødvendige for å verifisere og, om nødvendig, svarteliste leverandøren som for eksempel ikke aksepterte det solgte kupongen.
Here’s 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("only oracle verifier are able to manage whitelist")
elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status")
else{
WriteSet([
DataEntry(getExtValueItemWhiteListStatus(supplier), status)
])
}
}
Hva har vært mest nyttig for deg?
Den mest nyttige delen – var oppgavene. Takket være dem ble forelesningsmaterialet klarere, og nyervervet kunnskap ble forankret gjennom prøving og feiling. Det var også veldig nyttig med praktisk arbeid med , og .
Hvordan planlegger du å bruke det du har lært i praksis?
Fra starten av forventet jeg at kurset ville hjelpe meg med å ta prosjektet mitt til et nytt nivå. Ideen var å nå skrive koden i RIDE. Den eksisterende versjonen har allerede funksjoner for sertifisering av dokumenter, men takket være RIDE kan den forbedres betydelig. Den nye versjonen vil være mer fleksibel og forståelig, og den vil ha flere funksjoner, inkludert sertifisering av e-poster, avtaler mellom flere parter, osv.
Kurset har også gitt mye å tenke på, og jeg har fått mange nye ideer. Jeg er sikker på at resultatene vil vise seg i fremtiden.
Kilde: habr.com
