Zhvilluesi Kristof Verdo flet pĂ«r kursin online ââ, qĂ« ai sapo ka pĂ«rfunduar.

Na tregoni pak pĂ«r veten tuaj. ĂfarĂ« ju tĂ«rhoqi nĂ« kĂ«tĂ« kurs?
Bashkëpunoj me zhvillimin e uebit për rreth 15 vjet, kryesisht si freelancer.
GjatĂ« zhvillimit tĂ« njĂ« aplikacioni web pĂ«r regjistrin afatgjatĂ« pĂ«r vendet nĂ« zhvillim pĂ«r njĂ« grup bankar, u pĂ«rballa me sfidĂ«n e integrimit tĂ« certifikimit nĂ« blockchain. NĂ« atĂ« kohĂ« nuk dija shumĂ« rreth certifikimit nĂ« blockchain, ndonĂ«se isha tashmĂ« i interesuar pĂ«r teknologjitĂ« kripto â kryesisht si investitor.
Si pasojë, kjo funksionalitet nuk u realizua, por pasi mendoja se organizatat dhe bankat ishin të interesuara për një zgjidhje të tillë për aplikacionet e tyre, fillova të studioj çështjen dhe së shpejti lansova projektin .
Kam zhvilluar versionin e tij beta, që është tashmë i disponueshëm në rrjetin kryesor. Atëherë [gjuha e programimit Waves] Ride nuk ekzistonte, dhe e bëja gjithçka në mënyrën më të thjeshtë, duke përdorur transaksione transferimi me JSON të përcjellë. Por qëllimi kryesor ishte për të shtuar funksionalitet më të avancuar pas lansimit të Ride. Dhe kjo është arsyeja kryesore pse u bashkova me kursin: faza e ardhshme e zhvillimit të projektit parashikonte krijimin e një aplikacioni të decentralizuar (dApp).
Cilat aspekte të kursit ju dukeshin më të lehta dhe cilat më të vështira?
MĂ« e lehta ishte se kishim mjaft kohĂ« pĂ«r tĂ« gjitha detyrat. QĂ«llimi i kursit Ă«shtĂ« tĂ« mĂ«sojmĂ« diçka, jo tĂ« garojmĂ« me njĂ«ri-tjetrin. Shpjegimet ishin shumĂ« tĂ« aksesueshme dhe ilustrimet â tĂ« thjeshta, por pĂ«rmbajtĂ«sore. Kjo ndihmoi nĂ« vizualizimin dhe kuptimin e temave tĂ« ndryshme.
Gjatë kryerjes së detyrave, na nxitnin të mendojmë në mënyrë të pavarur dhe ndonjëherë të studiojmë diçka vetë. Kjo është mënyra më e mirë për të mësuar diçka dhe për të kuptuar idetë që shqyrtohen në mësime.
Disa herĂ« nuk e kuptoja plotĂ«sisht pjesĂ«n teorike deri sa nuk filloja tĂ« shkruaja kodin pĂ«r tĂ« pĂ«rfunduar detyrĂ«n. Nuk na lejohej tĂ« bĂ«nim âkopjim/pastimâ, gjithĂ« kodi duhet tĂ« shkruhej vetĂ«, dhe kjo gjithashtu ndihmoi pĂ«r tĂ« kuptuar mĂ« mirĂ« gjithçka.
Më e vështirë ishte që pyetjet në detyrë me disa variante përgjigjesh nuk ishin gjithmonë të qarta. Anglishtja ime nuk është perfekte dhe pyetjet ishin shkruar nga një person që nuk është gjuhëtar i natyrshëm, prandaj ndonjëherë kishte keqkuptime.
Ndoshta, pjesa e kursit që i dedikohet orakujve dhe NFT-ve mund të ishte më e detajuar. Por, sërish, objekti kryesor i kursit është të ngjallë interesin e zhvilluesve. Më pas, për të kuptuar plotësisht të gjitha aspektet, do të nevojitet sigurisht koha për të eksperimentuar dhe praktikuar.
Tregoni mĂ« shumĂ« rreth zgjidhjes mbi tĂ« cilĂ«n keni punuar gjatĂ« gjithĂ« kursit â âCoupon Bazaarâ? A mund tĂ« shohim gjithashtu disa shembuj kodi?
Po, ne punuam mbi âCoupon Bazaarâ, qĂ« Ă«shtĂ« njĂ« treg ku njerĂ«zit shesin dhe blejnĂ« kupona qĂ« japin tĂ« drejtĂ«n pĂ«r tĂ« blerĂ« produkte dhe shĂ«rbime me çmime mĂ« tĂ« ulĂ«ta. Ădo kupon pĂ«rfaqĂ«sohet si njĂ« aset digjital qĂ« ofron njĂ« zbritje speciale nga ofruesi.

Duhej të zhvillonim disa komponente të aplikacionit. Së pari, duhej të krijonim një sistem për regjistrimin e ofruesve dhe menaxhimin e kuponave. Më pas, na nevojitej një funksion verifikimi dhe mundësia për të kërkuar kupona nga përdoruesit.

Gjatë kursit ne gjithashtu shtuam disa funksione të reja, duke përfshirë një sistem votimi dhe një funksion që lejon verifikimin dhe vendosjen në listë të zezë të ofruesve.
Fillimisht ne studiuam ndryshimin midis aseteve të mençura, llogarive të mençura dhe llogarive dApp dhe bazat e funksioneve të verifikuesit. Funksionet e verifikuesit lejojnë të ndryshojnë sjelljen e llogarisë siç është parashikuar nga default. Të parat verifikojnë nënshkrimet e transaksioneve, por funksioni i verifikuesit lejon të vendosë rregulla të tjera.
{-# 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
}
}Pastaj filluam tĂ« shtonim kuponat. Kemi pĂ«rdorur njĂ« nga funksionet mĂ« tĂ« rĂ«ndĂ«sishme tĂ« dApp, qĂ« lejon regjistrimin nĂ« blockchain tĂ« tĂ« dhĂ«nave tĂ« çdo lloji nĂ« formĂ«n e çiftĂ«ve «çelĂ«s-vlerë» â njĂ« transaksion tĂ« dhĂ«nash. E kemi kombinuar atĂ« me njĂ« transaksion tĂ« ri, invokeScript, qĂ« pĂ«rdoret pĂ«r tĂ« thirrur funksionin e thirrur nĂ« dApp nga jashtĂ« blockchain.
Lloji i transaksioneve të të dhënave që përdorëm gjatë kursit është shtimi i kuponëve në tregun e përbashkët:
letdatajson = {
"title": "t-shirt me , voto 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Universi",
"description": "Dua që ti të bësh dashuri, jo luftë, e di që e ke dëgjuar më parë",
"image": "https://bit.ly/2EXTghg"
}
it('shto artikull', 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)
})Për të përpunuar këto të dhëna me funksionin addItem dhe për të zhvilluar funksionin e blerjes dhe opsione të tjera, përdorëm një funksion të thirrur, të cilin përdoruesi mund ta thërrasë nga jashtë bllokut të zinxhirit. Si rezultat, ai mund të ekzekutojë detyra të ndryshme, për shembull, të inicojë transferimin e fondeve, të regjistrojë ose të përditësojë të dhëna në ruajtjen e të dhënave të dApp etj.
Këtu është një shembull i funksionit të thirrur, i përdorur në funksionin addItem:
@Callable(i)
funcaddItem(titulli: String, çmimi: Int, të dhënat: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, titulli)
if( çmimi <= 0) thenthrow("shuma e blerjes nuk mund të jetë më e vogël se çmimi i artikullit")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("një artikull tashmë ekziston")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), çmimi),
DataEntry(getKeyItemData(item), të dhënat)
])
}
}Më vonë, zhvilluam një sistem votimi, i cili lejon dhënien e votave për promovimin ose heqjen e produkteve të caktuara. Për të parandaluar ndonjë ndikim të jashtëm në procesin e votimit, ai përdor një skemë 'Commit-Reveal'.
Faza 'commit' përdoret për të mbledhur votat e koduara me një funksion hesh dhe 'kripë'.
Faza 'reveal' përdoret për të mbledhur votat e koduara dhe për të krahasuar heshat e tyre.
Këtu është një shembull i funksionit të thirrur, i përdorur këtu:
@Callable(i)
funcvoteCommit(artikulli: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(artikulli)
letstatus = getValueItemStatus(artikulli)
if( commits >= VOTERS) thenthrow("numri maksimal i votuesve është arritur")
elseif(getValueCommit(artikulli, user) !=NONE) thenthrow("përdoruesi ka marrë pjesë tashmë")
elseif(getKeyItemSupplier(artikulli) ==NONE) thenthrow("artikulli nuk ekziston")
elseif(status !=NONE && status !=VOTING) thenthrow("votimi nuk është i mundur")
else{
WriteSet([
DataEntry(getKeyCommit(artikulli, user), hash),
DataEntry(getKeyCommitsCount(artikulli), commits +1),
DataEntry(getKeyItemStatus(artikulli), if(commits == VOTERS) then REVEAL else VOTING)
])
}
}
>ĂfarĂ« tjetĂ«r keni mĂ«suar nga kursi?
Kurset gjithashtu pĂ«rfshiu tokenizimin dhe tokenet non-fungible (NFT) â tokenet qĂ« pĂ«rfaqĂ«sojnĂ« diçka unike dhe pĂ«r kĂ«tĂ« arsye nuk janĂ« tĂ« ndĂ«rrueshme.
Klasë e fundit ishte e dedikuar orakujve. Duke qenë se blockchain nuk mund të marrë të dhëna nga bota jashtë, na nevojiten orakuj për t'i dërguar këto të dhëna.
Për tregun tonë, orakujt ishin të nevojshëm për të verifikuar dhe, nëse është e nevojshme, për të futur në listën e zezë një furnizues që, për shembull, nuk ka pranuar bonin e shitur.
Ja një shembull:
funcgetExtValueItemWhiteListStatus(item:String) = {
item +"_verifier_status"
}
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "i verifikuar"
letBLACKLISTED = "në listën e zezë"
@Callable(i)
funcsetstatus(supplier: String, status: String) = {
letaccount = toBase58String(i.caller.bytes)
if( account !=verifier ) thenthrow("vetëm verifikuesit e orakujve janë në gjendje të menaxhojnë listën e bardhë")
elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("status i gabuar")
else{
WriteSet([
DataEntry(getExtValueItemWhiteListStatus(supplier), status)
])
}
}
ĂfarĂ« ishte mĂ« e dobishme pĂ«r ju?
Pjesa më e dobishme ishte detyrat. Falë tyre, materiali i ligjëratave bëhej më i kuptueshëm, dhe njohuritë e sapofituara konsolidoheshin përmes provave dhe gabimeve. Ishte shumë e dobishme gjithashtu puna praktike me , dhe .
Si planifikoni ta përdorni atë që keni mësuar në praktikë?
Që nga fillimi, kam pritur që kursi do të ndihmojë në avancimin e projektit tim në një nivel të ri. Ideja ishte që tani të shkruaj kodin në RIDE. Versioni ekzistues tashmë ka funksione për certifikimin e dokumenteve, por falë RIDE, ai do të përmirësohet ndjeshëm. Versioni i ri do të jetë më fleksibël dhe më i kuptueshëm, do të ketë më shumë funksione, duke përfshirë certifikimin e emaileve të elektronicëve, marrëveshjeve ndërmjet palëve të shumta etj.
Kursi gjithashtu dha ide për reflektim, dhe kam fituar shumë ide të reja. Jam i sigurt se rezultatet do të shfaqen edhe në të ardhmen.
Burimi: habr.com
