Programer Christophe Verdot govori o online kursu '' koju je nedavno prošao.

Reci nam nešto o sebi. Šta vas je zanimalo na ovom kursu?
Web razvojem se bavim oko 15 godina, uglavnom kao freelancer.
Dok sam razvijao web aplikaciju za dugoročni registar za zemlje u razvoju za bankarsku grupu, suočio sam se sa zadatkom da u nju integrišem blockchain sertifikaciju. U to vrijeme nisam znao puno o blockchain sertifikaciji, iako sam već bio zainteresiran za kripto tehnologije, uglavnom kao investitor.
Kao rezultat toga, ova funkcija nije implementirana, ali, misleći da su organizacije i banke zainteresirane za takvo rješenje za svoje aplikacije, počeo sam proučavati problem i ubrzo pokrenuo projekat .
Razvio sam njegovu beta verziju, koja je već dostupna na glavnoj mreži. U to vrijeme nije postojao [programski jezik Waves] Ride, pa sam sve radio na najjednostavniji način, koristeći translacije prevođenja sa ugniježđenim JSON-om. Ali glavni cilj je bio dodati napredniju funkcionalnost nakon lansiranja Ridea. I ovo je glavni razlog zašto sam se pridružio kursu: sljedeća faza razvoja projekta uključivala je kreiranje decentralizirane aplikacije (dApp).
Koji aspekti kursa su vam bili najlakši, a koji najizazovniji?
Najjednostavnije je bilo da smo imali dovoljno vremena za sve zadatke. Smisao kursa je da se nešto nauči, a ne da se takmičimo jedni s drugima. Objašnjenja su bila vrlo pristupačna, a ilustracije jednostavne, ali sveobuhvatne. To je pomoglo da se vizualiziraju i razumiju različite teme.
Prilikom ispunjavanja zadataka podsticali smo se da samostalno razmišljamo, a ponekad i sami nešto učimo. Ovo je najbolji način za učenje i razumijevanje ideja obrađenih na času.
Nekoliko puta nisam u potpunosti razumio teorijski dio dok nisam počeo pisati kod dok sam ispunjavao zadatak. Nije nam bilo dozvoljeno da radimo 'copy/paste', morali smo sami da pišemo sav kod, a to nam je takođe pomoglo da sve bolje razumemo.
Najteže je bilo to što pitanja u zadatku višestrukog izbora nisu uvijek bila jasna. Moj engleski nije savršen, a pitanja je pisao ne maternji govornik, pa je ponekad dolazilo do nesporazuma.
Možda bi dio kursa posvećen proročanstvima i NFT mogao biti detaljniji. Ali, u svakom slučaju, glavni cilj kursa je zainteresovati programere. Zatim, da biste u potpunosti razumjeli sve njegove aspekte, morat ćete, naravno, provesti neko vrijeme eksperimentirajući i vježbajući.
Recite nam više o rješenju na kojem ste radili tokom cijelog kursa - 'Bazar kupona'? Mogu li vidjeti i neke primjere koda?
Da, radili smo na 'Bazaru kupona', ovo je pijaca na kojoj ljudi prodaju i kupuju kupone koji im daju pravo da kupuju robu i usluge po nižoj cijeni. Svaki kupon predstavlja digitalno sredstvo koje nudi poseban popust od dobavljača.

Bilo je potrebno razviti nekoliko komponenti aplikacije. Prvo je bilo potrebno napraviti sistem za registraciju dobavljača i upravljanje kuponima. Tada nam je bila potrebna funkcija verifikacije i mogućnost da korisnici traže kupone.

Tokom kursa smo takođe dodali nekoliko novih funkcija, uključujući sistem glasanja i funkciju koja vam omogućava da verifikujete dobavljače i stavljate ih na crnu listu.
Prvo smo naučili razliku između pametnih sredstava, pametnih naloga i dApp naloga i osnove rada sa funkcijama verifikatora. Funkcije verifikatora vam omogućavaju da promijenite zadano ponašanje vašeg računa. Podrazumevano oni provjeravaju potpise transakcija, ali funkcija verifikatora vam omogućava da postavite druga „pravila“.
{-# 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
}
}Zatim smo počeli sa dodavanjem kupona. Koristili smo jednu od najvažnijih funkcija dApp-a, koja vam omogućava da snimite podatke bilo koje vrste u blockchain u obliku parova ključ-vrijednost - transakcija podataka. Kombinirali smo ga s novom transakcijom, invokeScript, koja se koristi za pozivanje funkcije koja se može pozivati u dApp izvan blockchaina.
Vrsta transakcije podataka koju smo koristili tokom kursa je dodavanje kupona na tržište:
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)
})Za obradu ovih podataka s funkcijom addItem i razvoj funkcije kupovine i drugih opcija, koristili smo funkciju koja se može pozivati koju korisnik može pozvati izvan blockchaina. Kao rezultat toga, može obavljati različite zadatke, kao što je pokretanje prijenosa sredstava, pisanje ili ažuriranje podataka u dApp spremištu podataka, itd.
Evo primjera pozvane funkcije koja se koristi u funkciji 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)
])
}
}Kasnije smo razvili sistem glasanja koji vam omogućava da glasate za promoviranje ili uklanjanje određenih proizvoda. Kako bi se spriječio vanjski utjecaj na proces glasanja, koristi se shema 'Commit-Reveal'.
Faza "urezivanja" se koristi za prikupljanje šifriranih glasova koristeći hash funkciju i "sol".
Faza "otkrivanja" se koristi za prikupljanje šifriranih glasova i upoređivanje njihovih heševa.
Evo primjera pozvane funkcije koja se ovdje koristi:
@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)
])
}
}
>Šta ste još naučili na kursu?
Kurs je također uključivao tokenizaciju i nezamjenjive tokene (NFT) – tokene koji predstavljaju nešto jedinstveno i stoga nisu zamjenjivi.
Posljednja lekcija bila je posvećena proročanstvima. Budući da blockchain ne može primati podatke iz vanjskog svijeta, potrebni su nam orakuli da mu te podatke pošaljemo.
Za naše tržište, proročišta su bila potrebna za provjeru i, ako je potrebno, stavljanje na crnu listu dobavljača koji, na primjer, nije prihvatio prodati kupon.
Evo primjera:
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)
])
}
}
Šta vam je bilo najkorisnije?
Najkorisniji dio su zadaci. Zahvaljujući njima materijal predavanja je postao jasniji, a novostečeno znanje učvršćeno putem pokušaja i grešaka. Praktičan rad sa , и .
Kako planirate da primenite ono što ste naučili u praksi?
Od samog početka sam očekivao da će kurs pomoći da moj projekat podignem na viši nivo. Ideja je bila da se sada napiše kod na RIDE. Postojeća verzija već ima funkcije sertifikacije dokumenata, ali zahvaljujući RIDE može biti značajno poboljšana. Nova verzija će biti fleksibilnija i intuitivnija, te će imati više funkcija, uključujući certifikaciju e-pošte, višestranačke ugovore itd.
Kurs je također podstakao razmišljanje i dao mi je puno novih ideja. Uvjeren sam da će se rezultati nastaviti pojavljivati u budućnosti.
izvor: www.habr.com
