Arendaja Christoph Verdo rÀÀgib veebikursist ââ, mille ta hiljuti lĂ€bis.

RÀÀkige natuke endast. Mis teid selle kursuse juures huvitas?
Olen tegelenud veebiarendusega umbes 15 aastat, peamiselt vabakutselisena.
Töötades vĂ€lja pikaajalist registreeringu veebi rakendust arengumaade jaoks ĂŒhe pankade grupi tellimusel, seisn ma silmitsi ĂŒlesande integreerida sellesse blockchain-sertifikaat. Sel ajal ei teadnud ma palju blockchain-sertifikaadist, kuigi olin juba huvitatud krĂŒptotehnoloogiatest â peamiselt investori vaatenurgast.
LÔpuks seda funktsiooni ei teostatud, kuid mÔeldes sellele, et organisatsioonid ja pangad on sellise lahenduse pÀrast huvitatud oma rakendustes, hakkasin uurima teemat ja peagi kÀivitasin projekti .
Ma olen vĂ€lja töötanud selle beetaversiooni, mis on juba peavĂ”rgus saadaval. Sel ajal [programmeerimiskeel Waves] Ride'i veel ei eksisteerinud, ja ma kasutasin kĂ”ige lihtsamat lĂ€henemist, kasutades tehingute ĂŒlekandeid koos manustatud JSON-iga. Kuid peamine eesmĂ€rk oli lisada pĂ€rast Ride'i vĂ€ljalaskmist tĂ€iustatud funktsionaalsus. Ja see on peamine pĂ”hjus, miks liitusin kursusega: projekti jĂ€rgmine arenguetapp eeldas detsentraliseeritud Ă€ppide (dApp) loomist.
Millised kursuse aspektid tundusid teile kÔige lihtsamad ja millised kÔige keerulisemad?
KĂ”ige lihtsam oli see, et meil oli piisavalt aega kĂ”ikide ĂŒlesannete jaoks. Kursuse mĂ”te on Ă”ppida midagi, mitte ĂŒksteisega vĂ”istelda. Selgitused olid vĂ€ga arusaadavad ja illustratsioonid olid lihtsad, aga pĂ”hjalikud. See aitas visualiseerida ja mĂ”ista erinevaid teemasid.
Ălesandeid tĂ€ites suunati meid mĂ”tlema iseseisvalt ja mĂ”nikord iseseisvalt midagi uurima. See on parim viis millegi Ă”ppimiseks ja tundma Ă”ppimiseks ideedest, mida tundides kĂ€sitleti.
Korduvalt ei mĂ”istnud ma teooriat tĂ€ielikult enne, kui hakkasin ĂŒlesandeid kirjutama. Meile ei lubatud kasutada 'copy/paste', kogu kood pidi olema ise kirjutatud, ja see aitas mul kĂ”ike paremini mĂ”ista.
KĂ”ige raskem oli see, et valikvastustega kĂŒsimused ei olnud alati selged. Minu inglise keel ei ole ideaalne ja kĂŒsimused olid kirjutatud inimese poolt, kes ei ole emakeelena inglise keelt rÀÀkiv, mistĂ”ttu tekkis vahel arusaamatus.
VĂ”ib-olla vĂ”iks kursuse osa, mis kĂ€sitleb oraakleid ja NFT-sid, olla detailsem. Kuid igal juhul on kursuse peamine ĂŒlesanne Ă€ratada arendajate huvi. Hiljem, et tĂ€ielikult mĂ”ista kĂ”iki selle aspekte, tuleb kindlasti kulutada veidi aega katsetamiseks ja harjutamiseks.
RÀÀkige lĂ€hemalt lahendusest, mille kallal töötasite kogu kursuse jooksul â 'Coupon Bazaar'? Kas saaksime ka koodinĂ€ite nĂ€ha?
Jah, me töötasime âCoupon Bazaarâi kallal, mis on turupind, kus inimesed mĂŒĂŒvad ja ostavad kupongi, mis vĂ”imaldab osta kaupu ja teenuseid madalama hinnaga. Iga kupong esindab digitaalset vara, mis hĂ”lmab pakkuja poolt antud eripakkumist.

Vajalik oli arendada mitmeid rakenduse komponente. Esiteks tuli luua sĂŒsteem pakkujate registreerimiseks ja kupongide haldamiseks. SeejĂ€rel oli vajalik tĂ”endamise funktsioon ja vĂ”imalus, et kasutajad saaksid kupongi otsida.

Kursuse jooksul lisasime ka mitmeid uusi funktsioone, sealhulgas hÀÀletussĂŒsteem ja funktsioon, mis vĂ”imaldab tĂ”endada ja musta nimekirja lisada pakkujaid.
Alustasime nuti- ja dApp-kontode ning nutivaradevahelist erinevust uurimisest ja tÔendaja funktsioonide toimimisest. TÔendaja funktsioonid vÔimaldavad muuta konto toimimist, nagu see on vaikimisi mÀÀratud. Vaikimisi kontrollivad nad tehingute allkirju, kuid tÔendaja funktsioon vÔimaldab seadistada teisi '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
}
}SeejĂ€rel hakkasime lisama kupone. Kasutasime ĂŒht olulist dApp funktsiooni, mis vĂ”imaldab salvestada plokiahelasse mis tahes tĂŒĂŒpi andmeid paaridena âvĂ”ti-vÀÀrtusâ â andmetransaktsiooni. Ăhendasime selle uue tehinguga, invokeScript, mis kasutatakse dApp-i vĂ€ljast plokiahelast vĂ€ljakutsumiseks.
Andmetransaktsioonide tĂŒĂŒp, mida kasutasime kursuse lĂ€bimise ajal, on kupongide lisamine turule:
letdatajson = {
"title": "t-sÀrk koos, hÀÀleta 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Universum",
"description": "Ma tahan, et sa armastaksid, mitte sÔda, ma tean, et oled seda enne kuulnud",
"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)
})Andmete töötlemiseks addItem-funktsiooni ja ostu ning teiste valikute arendamiseks kasutasime vĂ€liselt kutsutavat funktsiooni, mida kasutaja saab vĂ€lja blockchainist kutsuda. Selle tulemusena vĂ”ib see tĂ€ita erinevaid ĂŒlesandeid, nĂ€iteks kĂ€ivitada rahade edastamist, salvestada vĂ”i vĂ€rskendada andmeid dApp andmehoidlas jne.
Siin on nÀide kutsutavast funktsioonist, mida kasutatakse addItem-funktsioonis:
@Callable(i)
func addItem(title: String, price: Int, data: String) = {
let supplierAddress = toBase58String(i.caller.bytes)
let item = getKeyItem(supplierAddress, title)
if (price <= 0) then throw("ostusumma ei saa olla vÀiksem kui kauba hind")
elseif (getValueItemSupplier(item) != NONE) then throw("ese on juba olemas")
else {
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}Hiljem arendasime vĂ€lja hÀÀletussĂŒsteemi, mis vĂ”imaldab anda hÀÀli teatud toodete edendamiseks vĂ”i eemaldamiseks. VĂ€lise mĂ”ju vĂ€ltimiseks hÀÀletusprotsessis kasutab see âCommit-Revealâ skeemi.
Faas âcommitâ kasutatakse krĂŒptitud hÀÀlte kogumiseks, kasutades hash-funktsiooni ja 'soola'.
Faas ârevealâ kasutatakse krĂŒptitud hÀÀlte kogumiseks ja nende hashide vĂ”rdlemiseks.
Siin on nÀide kutsutud funktsioonist, mida siia kasutatakse:
@Callable(i)
funcvoteCommit(item: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(item)
letstatus = getValueItemStatus(item)
if( commits >=VOTERS) thenthrow("maksimaalne hÀÀlte arv on saavutatud")
elseif(getValueCommit(item, user) !=NONE) thenthrow("kasutaja on juba osalenud")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("ese ei eksisteeri")
elseif(status !=NONE && status !=VOTING) thenthrow("hÀÀletamine ei ole vÔimalik")
else{
WriteSet([
DataEntry(getKeyCommit(item, user), hash),
DataEntry(getKeyCommitsCount(item), commits +1),
DataEntry(getKeyItemStatus(item), if(commits ==VOTERS) thenREVEAL elseVOTING)
])
}
}
>Mida veel olete kursusest Ôppinud?
Kursus hĂ”lmas ka tokeniseerimist ja mittevahetatavaid tokeneid (NFT) â tokenid, mis esindavad midagi ainulaadset ja seetĂ”ttu mittevahetatavad.
Viimane tund oli pĂŒhendatud oraaklitele. Kuna plokiahel ei saa vĂ€listest allikatest andmeid, vajame oraakleid, et saata need andmed sinna.
Meie turu jaoks olid oraaklid vajalikud, et kontrollida ja vajadusel musta nimekirja kanda tarnija, kes nĂ€iteks ei aktsepteerinud mĂŒĂŒdud kupongi.
Siin on nÀidis:
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 olid teie jaoks kÔige kasulikum?
KĂ”ige kasulikum osa olid ĂŒlesanded. TĂ€nu neile muutus loengute materjal arusaadavamaks ja vĂ€rskelt omandatud teadmised kinnistusid katse-eksituse meetodil. Samuti oli vĂ€ga kasulik praktiline töö , ja .
Kuidas plaanite kasutada Ôppitut praktikas?
Algusest peale ootasin, et kursus aitab mul viia minu projekti uuele tasemele. Idee oli nĂŒĂŒd kirjutada kood RIDE-s. Olemasolev versioon omab juba dokumentide sertifitseerimise funktsioone, kuid RIDE abil saab seda oluliselt tĂ€iustada. Uus versioon on paindlikum ja arusaadavam ning seal on rohkem funktsioone, sealhulgas e-kirjade, mitme osapoole vaheliste lepingute sertifitseerimine jne.
Kursus andis inspiratsiooni ja mul tekkis palju uusi mÔtteid. Olen kindel, et tulemused ilmnevad ka tulevikus.
Allikas: habr.com
