A fejlesztő, Christophe Verdo mesél az online tanfolyamról „”, amelyet nemrégiben elvégzett.

Mesélj kicsit magadról. Miért érdekel ez a kurzus?
Körülbelül 15 éve foglalkozom webfejlesztéssel, főként szabadúszóként.
Egy hosszú távú nyilvántartási webalkalmazást fejlesztettem ki fejlődő országok számára egy bankcsoport megbízásából, és találkoztam a blockchain-hitelesítés integrálásának kihívásával. Akkoriban nem sokat tudtam a blockchain-hitelesítésről, de már érdekelt a kripto-technológiák – főként mint befektető.
Végül ez a funkció nem valósult meg, de elgondolkodva azon, hogy a szervezetek és bankok érdeklődnek egy ilyen megoldás iránt az alkalmazásaik számára, elkezdtem tanulmányozni a lehetőségeket, és hamarosan elindítottam a projektet .
Kifejlesztettem annak bétaverzióját, amely már elérhető a fő hálózaton. Akkoriban [a Waves programozási nyelv] Ride még nem létezett, és a legegyszerűbb módon dolgoztam, használva az átutalási tranzakciókat beágyazott JSON-nal. De a fő cél az volt, hogy a Ride bevezetése után fejlettebb funkciót adjak hozzá. Ez volt az elsődleges ok, amiért csatlakoztam a kurzushoz: a projekt következő fejlesztési szakasza egy decentralizált alkalmazás (dApp) létrehozását jelölte.
Mely aspektusai tűntek a legkönnyebbnek, és melyek a legnehezebbnek a kurzus során?
A legkönnyebb az volt, hogy elegendő időnk volt minden feladatra. A kurzus célja, hogy tanuljunk valamit, nem pedig versenyezzünk egymással. A magyarázatok nagyon érthetők voltak, az illusztrációk pedig egyszerűek, de kimerítőek. Ez segített vizualizálni és megérteni a különböző témákat.
A feladatok elvégzése során arra ösztönöztek minket, hogy függetlenül gondolkodjunk, és néha önállóan tanulmányozzunk valamit. Ez a legjobb módja annak, hogy tanuljunk, és megértsük az órákon tárgyalt ötleteket.
Többször is csak akkor értettem meg teljesen az elméleti részt, amikor elkezdtem kódolni a feladatot. Nem volt megengedett a 'másolás/beillesztés', minden kódot magunknak kellett megírni, és ez is segített jobban megérteni mindent.
A legnehezebb az volt, hogy a több választási lehetőséggel rendelkező kérdések néha nem voltak egyértelműek. Az angolom nem tökéletes, és a kérdéseket nem anyanyelvi beszélő írta, ezért néha félreértések adódtak.
Lehetséges, hogy a kurzusnak az orákulumokkal és az NFT-kkel foglalkozó része részletesebb lehetett volna. De mindenesetre a kurzus fő célja a fejlesztők érdeklődésének felkeltése. Aztán, hogy teljesen megértsük annak minden aspektusát, természetesen szükség lesz arra, hogy időt fordítsunk a kísérletezésre és a gyakorlásra.
Meséljen részletesebben az Ön által a kurzus során kidolgozott megoldásról - 'Coupon Bazaar'? Megnézhetnénk a kód példáit is?
Igen, a 'Coupon Bazaar'-on dolgoztunk, ez egy piactér, ahol az emberek vásárolnak és adnak el kuponokat, amelyek lehetővé teszik termékek és szolgáltatások olcsóbb áron történő megvásárlását. Minden kupon digitális eszközként van megjelenítve, amely egy különleges kedvezményt biztosít a szolgáltatótól.

Több alkalmazáskomponens kidolgozására volt szükség. Először is, létre kellett hozni egy rendszert a szolgáltatók regisztrációjára és a kuponok kezelésére. Ezt követően szükség volt egy hitelesítési funkcióra és arra, hogy a felhasználók keresni tudjanak a kuponok között.

A kurzus során néhány új funkciót is hozzáadtunk, beleértve a szavazási rendszert és egy funkciót, amely lehetővé teszi a szolgáltatók hitelesítését és feketelistára tételét.
Először megvizsgáltuk a különbséget a smart assetek, smart accountok és dApp accountok között, valamint a hitelesítési funkciók működését. A hitelesítési funkciók lehetővé teszik a fiók alapértelmezett viselkedésének megváltoztatását. Alapértelmezés szerint a tranzakciók aláírásait ellenőrzik, de a hitelesítési funkció különböző "szabályokat" enged megalkotni.
{-# 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
}
}Ezután elkezdtük a kuponok hozzáadását. Használtuk az egyik legfontosabb dApp funkciót, amely lehetővé teszi bármilyen típusú adat blokkba való rögzítését kulcs-érték párok formájában - adat tranzakciót. Ezt összekapcsoltuk egy új tranzakcióval, az invokeScript-tel, amelyet arra használnak, hogy a dApp hívható funkcióját kívülről a blokkláncon belülről hívják meg.
Adata-transzakció típusa, amelyet a kurzus során használtunk, a kuponok hozzáadása a piachoz:
letdatajson = {
"title": "póló, szavazz 1-re",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Univerzium",
"description": "Azt akarom, hogy szeress, ne háborúzz, tudom, hogy már hallottad",
"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)
})Az addItem funkcióval és különböző vásárlási lehetőségekkel kapcsolatos adatok feldolgozásához egy hívható funkciót használtunk, amelyet a felhasználó a blokkláncon kívülről hívhat meg. Ennek eredményeként különféle feladatokat végezhet, például kezdeményezheti a pénzátutalást, vagy adatait tárolhatja vagy frissítheti a dApp adatbázisában stb.
Íme egy példa a hívható funkcióra, amelyet az addItem funkciónál használtunk:
@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, title)
if( price <= 0) thenthrow("a vásárlás összegének nem lehet kevesebbnek lennie a termék áránál")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("a termék már létezik")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}Később kifejlesztettük a szavazási rendszert, amely lehetővé teszi a bizonyos termékek előmozdítására vagy eltávolítására vonatkozó szavazások leadását. A szavazási folyamat külső befolyástól való védelme érdekében a 'Commit-Reveal' sémát alkalmazza.
A „commit” fázis az elfedett szavazatok gyűjtésére szolgál, amelyet hash-funkcióval és „sóval” végeznek.
A „reveal” fázis az elfedett szavazatok összegyűjtésére és a hash-ek összehasonlítására szolgál.
Íme egy példa a hívható funkcióra, amelyet itt használtunk:
@Callable(i)
funcvoteCommit(item: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(item)
letstatus = getValueItemStatus(item)
if( commits >= VOTERS) thenthrow("elértük a maximális szavazók számát")
elseif(getValueCommit(item, user) !=NONE) thenthrow("a felhasználó már részt vett")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("a termék nem létezik")
elseif(status !=NONE && status !=VOTING) thenthrow("a szavazás nem lehetséges")
else{
WriteSet([
DataEntry(getKeyCommit(item, user), hash),
DataEntry(getKeyCommitsCount(item), commits +1),
DataEntry(getKeyItemStatus(item),if(commits == VOTERS) then REVEAL else VOTING)
])
}
}
>Mit tanultál még a kurzus során?
A kurz magában foglalta a tokenizációt és a nem helyettesíthető tokeneket (NFT) – tokent, amelyek valami egyedit képviselnek, ezért nem helyettesíthetők.
Az utolsó óra az oracle-oknak volt szentelve. Mivel a blokklánc nem képes adatokat szerezni a külső világból, oracle-ok szükségesek ezeknek az adatoknak a továbbításához.
A mi piacterünknek oracle-ok voltak szükségesek a beszállító azonosítására, és szükség esetén fekete listára helyezésére, aki például nem fogadta el az eladott kupont.
Ez egy példa:
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("csak az oracle ellenőrözők kezelhetik a fehérlistát")
elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("rossz státusz")
else{
WriteSet([
DataEntry(getExtValueItemWhiteListStatus(supplier), status)
])
}
}
Mi volt a leghasznosabb számodra?
A leghasznosabb rész a feladatok voltak. Ezeknek köszönhetően a leckék anyaga érthetőbbé vált, és az éppen megszerzett tudás megerősödött a próbák és a hibák által. Nagyon hasznos volt a gyakorlati munka is az , és .
Hogyan tervezed, hogy felhasználod a tanultakat a gyakorlatban?
A kezdetektől fogva azt vártam, hogy a kurzus segít a projektemet egy új szintre emelni. Az ötlet az volt, hogy most már kódot írjak RIDE-on. A meglévő verzió már rendelkezik dokumentumok hitelesítési funkcióival, de a RIDE-nak köszönhetően jelentősen javítható. Az új verzió rugalmasabb és érthetőbb lesz, több funkcióval, beleértve az elektronikus levelek, több fél közötti megállapodások hitelesítését stb.
A kurzus szintén táplálékot adott a gondolkodásra, és sok új ötletem lett. Biztos vagyok benne, hogy az eredmények a jövőben is meg fognak jelenni.
Forrás: habr.com
