Arendaja Christophe Verdo rÀÀgib veebikursusest' mille ta hiljuti lÀbis.

RÀÀgi meile natuke endast. Mis teid sellel kursusel huvitas?
Olen olnud veebiarendaja umbes 15 aastat, enamasti vabakutselisena.
Pangagrupi jaoks arengumaade pikaajalise registri veebirakendust arendades seisin silmitsi ĂŒlesandega integreerida sinna plokiahela sertifikaat. Sel ajal ei teadnud ma plokiahela sertifikaadist suurt midagi, kuigi olin juba varem huvitatud krĂŒptotehnoloogiatest â peamiselt investorina.
Selle tulemusel seda funktsiooni ei rakendatud, kuid arvates, et organisatsioonid ja pangad on huvitatud sellisest lahendusest oma rakenduste jaoks, hakkasin seda probleemi uurima ja kÀivitasin peagi projekti. .
Olen vÀlja töötanud selle beetaversiooni, mis on juba vÔrgus saadaval. Sel ajal [Waves'i programmeerimiskeelt] Ride veel ei eksisteerinud ja ma tegin kÔike kÔige lihtsamal viisil, kasutades tÔlketehinguid pesastatud JSON-iga. Kuid peamine eesmÀrk oli lisada pÀrast Ride'i kÀivitamist rohkem tÀiustatud funktsioone. Ja see on peamine pÔhjus, miks ma kursusega liitusin: projekti arenduse jÀrgmine etapp hÔlmas detsentraliseeritud rakenduse (dApp) loomist.
Millised kursuse aspektid tundusid teile kÔige lihtsamad ja millised kÔige raskemad?
KĂ”ige lihtsam oli see, et meil oli kĂ”igi ĂŒlesannete jaoks piisavalt aega. Kursuse mĂ”te on midagi Ă”ppida, mitte omavahel konkureerida. Selgitused olid vĂ€ga arusaadavad ja illustratsioonid lihtsad, kuid kĂ”ikehĂ”lmavad. See aitas visualiseerida ja mĂ”ista erinevaid teemasid.
Ălesandeid tĂ€ites julgustati meid iseseisvalt mĂ”tlema ja vahel ka ise asju Ă”ppima. See on parim viis millegi Ă”ppimiseks ja tunnis arutatud ideede mĂ”istmiseks.
Mitu korda ei saanud ma teoreetilisest osast lĂ”puni aru, kuni hakkasin ĂŒlesande tĂ€itmisel koodi kirjutama. Copy/pasteâi teha ei tohtinud, kogu kood tuli ise kirjutada ja see aitas ka kĂ”igest paremini aru saada.
KĂ”ige keerulisem oli see, et valikvastustega ĂŒlesande kĂŒsimused ei olnud alati selged. Minu inglise keel ei ole tĂ€iuslik ja kĂŒsimused kirjutas mitte emakeelena kĂ”neleja, nii et aeg-ajalt tuli ette arusaamatusi.
VĂ”ib-olla vĂ”iks olla ĂŒksikasjalikum kursuse oraaklitele ja NFT-dele pĂŒhendatud osa. Kuid igal juhul on kursuse peamine ĂŒlesanne arendajatele huvi pakkuda. SeejĂ€rel peate selle kĂ”igi aspektide tĂ€ielikuks mĂ”istmiseks kulutama natuke aega katsetamiseks ja harjutamiseks.
Kas saate meile rohkem rÀÀkida lahendusest, mille kallal kogu kursuse jooksul töötasite â Kupongibasaar? Kas ma saan nĂ€ha ka koodinĂ€iteid?
Jah, oleme töötanud kupongituruga, mis on turg, kus inimesed mĂŒĂŒvad ja ostavad kuponge, mis annavad neile Ă”iguse osta kaupu ja teenuseid madalama hinnaga. Iga kupong on esindatud digitaalse varaga, mis pakub tarnijalt erisoodustust.

Vaja oli vĂ€lja töötada mitu rakenduse komponenti. Esiteks tuli luua sĂŒsteem tarnijate registreerimiseks ja kupongide haldamiseks. Siis vajasime kinnitusfunktsiooni ja kasutajatele vĂ”imalust kuponge otsida.

Kursuse kĂ€igus lisasime ka mitmeid uusi funktsioone, sealhulgas hÀÀletussĂŒsteemi ja funktsiooni, mis vĂ”imaldab hankijaid kinnitada ja musta nimekirja lisada.
KÔigepealt Ôppisime arukate varade, nutikate kontode ja dApp-kontode erinevust ning kontrollimisfunktsioonidega töötamise pÔhitÔdesid. Kontrollimisfunktsioonid vÔimaldavad teil muuta konto vaikekÀitumist. Vaikimisi kontrollivad nad tehingute allkirju, kuid kontrollimisfunktsioon vÔimaldab mÀÀrata muid "reegleid".
{-# 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
}
}Siis hakkasime kuponge lisama. Kasutasime ĂŒhte olulisemat dApp funktsiooni, mis vĂ”imaldab kirjutada plokiahelasse mis tahes tĂŒĂŒpi andmeid vĂ”tme-vÀÀrtuste paaride kujul â andmetehing. Ăhendasime selle uue tehinguga invokeScript, mida kasutatakse vĂ€ljakutsutud funktsiooni kutsumiseks dAppis vĂ€ljastpoolt plokiahelat.
Andmetehingu tĂŒĂŒp, mida kursusel kasutasime, on kupongide lisamine turule:
letdatajson = {
"title": "t-shirt with , vote 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Universe",
"description": "I want you to make love, not war, i know you've heard it before",
"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)
})Nende andmete töötlemiseks funktsiooniga addItem ning ostufunktsiooni ja muude vĂ”imaluste arendamiseks kasutasime vĂ€ljakutsutavat funktsiooni, millele kasutaja saab helistada vĂ€ljastpoolt plokiahelat. TĂ€nu sellele saab see tĂ€ita erinevaid ĂŒlesandeid, nagu nĂ€iteks rahaĂŒlekande algatamine, andmete kirjutamine vĂ”i vĂ€rskendamine dApp andmesalves jne.
Siin on nÀide vÀljakutsutavast funktsioonist, mida kasutatakse funktsioonis addItem:
@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, title)
if( price <= 0) thenthrow("purchase amount cannot be less than item price")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("an item is already exist")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}Hiljem töötasime vĂ€lja hÀÀletussĂŒsteemi, mis vĂ”imaldab teil hÀÀletada teatud toodete reklaamimiseks vĂ”i eemaldamiseks. HÀÀletusprotsessi vĂ€lismĂ”jude vĂ€ltimiseks kasutab see skeemi âKinnita-avaldaâ.
"Kinnistamise" faasi kasutatakse krĂŒpteeritud hÀÀlte kogumiseks, kasutades rĂ€sifunktsiooni ja "soola".
"Avaldamise" faasi kasutatakse krĂŒpteeritud hÀÀlte kogumiseks ja nende rĂ€side vĂ”rdlemiseks.
Siin on nÀide siin kasutatud kutsutud funktsioonist:
@Callable(i)
funcvoteCommit(item: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(item)
letstatus = getValueItemStatus(item)
if( commits >=VOTERS) thenthrow("reached max num of voters")
elseif(getValueCommit(item, user) !=NONE) thenthrow("user has already participated")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("item does not exist")
elseif(status !=NONE && status !=VOTING) thenthrow("voting is not possible")
else{
WriteSet([
DataEntry(getKeyCommit(item, user), hash),
DataEntry(getKeyCommitsCount(item), commits +1),
DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
])
}
}
>Mida sa veel kursuselt Ôppisid?
Kursus hĂ”lmas ka tokeniseerimist ja mitteasendatavaid ĆŸetoone (NFT) â tokeneid, mis esindavad midagi ainulaadset ja seetĂ”ttu ei ole omavahel asendatavad.
Viimane tund oli pĂŒhendatud oraaklitele. Kuna plokiahel ei saa vĂ€lismaailmalt andmeid vastu vĂ”tta, on meil vaja oraakleid, et need andmed talle saata.
Meie turuplatsi jaoks oli vaja oraakleid, et kontrollida ja vajadusel lisada musta nimekirja tarnija, kes nĂ€iteks ei aktsepteerinud mĂŒĂŒdud kupongi.
Siin on nÀide:
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)
])
}
}
Mis oli teile kÔige kasulikum?
KĂ”ige kasulikum osa on ĂŒlesanded. TĂ€nu neile sai loengumaterjal selgemaks ning Ă€sja omandatud teadmised kinnistati katse-eksituse meetodil. Praktiline töö koos , Đž .
Kuidas kavatsete Ôpitut praktikas rakendada?
Algusest peale eeldasin, et kursus aitab viia mu projekti jĂ€rgmisele tasemele. Idee oli nĂŒĂŒd kood kirjutada kohta RIDE. Olemasoleval versioonil on juba dokumentide sertifitseerimise funktsioonid, kuid tĂ€nu RIDE-le saab seda oluliselt tĂ€iustada. Uus versioon on paindlikum ja arusaadavam ning sisaldab rohkem funktsioone, sealhulgas meilisertifikaadi, mitme osapoole lepingud ja palju muud.
Kursus andis ka mÔtlemisainet ja sain palju uusi ideid. Olen kindel, et tulemused ilmnevad ka tulevikus.
Allikas: www.habr.com
