DAppok és event-ek az okosszerződésekben (avagy kapcsolat a külvilággal) #ethereumtudas

Az előző részben kicsit belemásztunk az embark által generált okosszerződés kódjába. Ebben a részben vetünk egy pillantást a kód másik…

DAppok és event-ek az okosszerződésekben (avagy kapcsolat a külvilággal) #ethereumtudas

Az előző részben kicsit belemásztunk az embark által generált okosszerződés kódjába. Ebben a részben vetünk egy pillantást a kód másik felére, ami a felhasználói felület vezérléséért felelős, aztán picit bele is nyúlunk mindkét részbe és megismerkedünk az eseményekkel (eventekkel). Az események önmagukban is érdekes dolgok (olyanokról fogunk szót ejteni, mint önmagukat bérbe adni képes autók és lakások), de ismeretük nagyon fontos például szabványos (ERC20-as) tokenek létrehozásához.

Csapjunk is bele a közepébe. Az előző részben említettük, hogy az Ethereumot egyfajta új webnek (web3) tekinthetjük. Ezen az elosztott hálózaton futnak a DApp-ok (decentralizált alkalmazások), ahol a backendet az okosszerződések képezik, amik fölé húzhatunk egy felhasználóbarát frontendet. Az embark által generált demo projektben ez a frontend az a weboldal, amin gombok segítségével beállíthatjuk, illetve lekérdezhetjük a tárolt változó értékét. Vessünk egy pillantást az embark által generált JavaScript kód (embark_demo/app/js/index.js) kód elejére.

Gabriel: A backend az ami mondjuk egy weboldal nem látható részében történik (egy online bank esetében ezek adatbázisok és egyéb pl. biztonsági részek halmaza és az ezeket lekezelő programok). A frontent pedig az amit látunk pl. egy weboldal, blog, webshop, stb.

Aki járatos a JavaScriptben, az rögtön láthatja, hogy az embark rendkívüli módon megkönnyíti a fejlesztést, hiszen létrehoz egy JavaScript osztályt az okosszerződéshez (SimpleStorage néven), amin keresztül szimpla metódus hívásokkal kommunikálhatunk a szerződéssel. Tulajdonképpen ennél egyszerűbb dolgunk már talán nem is lehetne.

Aki nem annyira járatos a JavaScript világában, az se keseredjen el, hiszen az okos szerződések programozásához nem feltétlenül van erre szükség. Azért ejtsünk erről pár szót, hogy teljes legyen a kép. Amit mindebből érdemes kiemelni, hogy az érték beállítása a SimpleStorage.set(value); sorral történik, ami automatikusan lefuttatja a szükséges tranzakciót, míg a kiolvasásért a SimpleStorage.get() kezdetű sor a felelős. Itt az eredmény aszinkron módon (nem rögtön) áll rendelkezésre (ki kell szólni az Ethereum kliensnek, ami feldolgozza a kérést, majd ha kész, akkor szól vissza). Ha megjött az eredmény, a kód beírja azt az edit mezőbe. Erről a részről többet nem is írnék. Aki járatos a HTML és a JavaScript világában, az ennyiből érti már, hogy miről van szó, a vonatkozó rész pontos elemzése viszont túlmutatna tananyagunk keretein (JavaScript, JQuery és HTML ismeretek). Még egyszer hangsúlyoznám, hogy az okosszerződések programozásához nem feltétlen szükséges JavaScript tudás. Mi ezt a későbbiekben csak az okosszerződés teszteléséhez fogjuk használni.

Események (eventek)

Térjünk inkább rá a cikk fő témájára, vagyis az eseményekre (eventekre). Bizonyára sokakban felmerül a kérdés, hogy szép dolog egy ilyen okos szerződés, de mégis hogyan kommunikál egy ilyen a külvilággal? Amíg információt akarunk közölni egy okos szerződéssel, addig nincs gond, hiszen csak meg kell hívnunk egy adott funkciót (jelen esetben például a set-et). No de hogy történik a másik irányba való kommunikáció, vagyis amikor az okos szerződésnek kellene a külvilág felé információt közölnie?

Rögtön említsünk is egy példát, hogy érthető legyen a dolog. Tegyük fel, hogy van egy lakásunk, aminek a kiadását mindenféle ügynökök helyett inkább egy okos szerződésre bíznánk. Felszerelünk a lakásra egy intelligens zárat, és kiragasztunk az ajtóra egy matricát egy Ethereum címmel. Ha valaki erre a címre elutalja a megadott összeget, a zár kinyílik, és be lehet menni a lakásba. Nos, egy ilyen rendszer elvileg simán megvalósítható Ethereumon okosszerződések segítségével. (Üdv a jövőben, ami a jelen technológiájára épül.) Az okosszerződés kb. úgy nézne ki ebben az esetben, hogy mikor pénzt utalunk neki, az ellenőrzi az összeget. Ha nem elegendő, visszautalja, ha elegendő, szól a zárnak, hogy nyíljon ki. No de hogy tud egy okos szerződés kiszólni a külvilágban található okos zárnak? Nos, erre szolgálnak az események.

Bármilyen okosszerződés definiálhat eseményeket, amiket képes kiküldeni. Ha egy funkció eseményt generál, az ugyanúgy beíródik a blokkláncba. Ezeket az eseményeket az egyes kliensek képesek figyelni és végrehajtani valamilyen funkciót, ha az előzőleg beállított szűrőfeltételeknek megfelelő esemény bekövetkezik. A megfelelő esemény (talán szerencsésebb lenne üzenetnek hívni) kinyithat egy zárat, elindíthat egy pénzügyi tranzakciót (pl. robotizált tőzsde esetén token visszavásárlás), vagy bármilyen más folyamatot. Például utasíthat egy önjáró autót, hogy a megadott címre menjen, ezzel megvalósítva akár a decentralizált Ubert. Ugyanilyen eseményeknek köszönhetően képesek érzékelni az egyes digitális pénztárcák, hogy valamilyen token érkezett a tárcába. Ezért írtam az elején, hogy az ERC20-as token szabványban is szerepet kapnak az események.

Gabriel: A lakás bérbeadása és a digitális pénztárcák nagyon jó példák arra, hogy megértsük az eventek lényegét és az ERC20-as token szabványt. Nagyon sokan kérdezik, hogy pl. tokent miért nem lehet Coinbase, Bittrex vagy egyéb cryptovaluta kereskedő rendszerekkel vásárolni. Nos azért, mivel ezek nem támogatják ERC20-at (joggal, mert más célt szolgálnak).

Az elmélet után térjünk át a gyakorlatra: Egy eseményt az event kulcsszóval definiálhatunk. Meg kell adnunk az esemény nevét és paramétereit, amelyek az esemény által hordozott adatok. Hozzunk is létre egy teszt eseményt, ami az eseményt kiváltó személy Ethereum címét és egy pozitív egész számot tartalmazhat. Ez így néz ki:

event TestEvent(address from, uint value);

Kössük is be a meglévő smart contractunkba, ami a módosítások után így fog kinézni:

Az esemény meghívása a set metódusban történik, tehát akkor fog kiváltódni, ha beállítunk egy értéket. Ez esetben az esemény cím paraméterébe az msg.sender értéke kerül, ami a metódust hívó felhasználó Ethereum címe, míg az érték paraméterbe a set-nek küldött érték. Tehát ezek után ha valamilyen értéket beálltunk a smart contract-ban, az generálni fog egy ilyen TestEvent eseményt. Hogy valami értelme is legyen a dolognak, ültessünk rá egy figyelőt, ami most annyit fog csinálni, hogy feldob egy alert ablakot, amibe kiírja az eseményben érkező címet és értéket. Ez így néz ki:

Ezzel együtt a teljes javascript kód ilyen lett:

Az emberknak hála elég ha átírjuk a megfelelő részeket, és elmentjük. Nem kell semmit újrafordítani, újraindítani, az embark megcsinál mindent a háttérben. Elég ha a böngészőben ráfrissítünk az oldalra, és ha minden jól megy, működni fog a dolog. Tehát ha beírunk egy számot az okosszerződésbe, fel fog ugrani egy alert ablak, ahol láthatóak az eseményben megadott információk. Igazából ennyit szántam mára.

Gabriel: Ha nem világos minden, jobb inkább elidőzni és újraolvasni az egész bejegyzést és kísérletezgetni a kóddal. A teljes megértés érdekében ajánljuk, hogy az itt leírt dolgat próbáld is azonnal ki a gépedre már előzőekben telepített tesztkörnyezetben (ha nincs még feltelepítve az Ethereum fejlesztői tesztkörnyezeted olvasd vissza az ezzel kapcsolatos többi bejegyzésünket).

Láthattuk tehát, hogy a metódusok és események segítségével az okosszerződések hogyan kommunikálhatnak a külvilággal. A közeljövőben olyan szolgáltatásokat válthatnak le ezen automatizmusok, mint amilyen az AirBnb vagy az Uber. A következő részekben meg fogjuk mutatni, hogy hogyan lehet pénzt (Ethert) fogadni és utalni okos szerződésekkel, majd készítünk saját tokeneket is, amelyek például a mostanában oly divatos ICO-k alapjai (amivel korunk kirpto-startupjai percek alatt szednek össze több millió dolláros befektetéseket). Tartsatok velünk…

Kövess minket!

A cikksorozat további részeiben ezekkel az okos szerződésekkel fogunk közelebbről megismerkedni, és megtanuljuk azt is, hogy hogyan készíthetünk ilyeneket mi magunk is.

Hogy mindez tényleg felfogható lehessen a cikksorozatot ketten fogjuk írni. A programozói részekért jómagam Laszlo Fazekas(fejlesztő) felelek majd, azért pedig, hogy tényleg minden érthető legyen Gabriel Varaljay(marketing) “játssza majd a naivat” (tesz fel kérdéseket, magyarázza újra a feldolgozott anyagot).

Épp ezért érdemes feliratkoznod ERRE a medium csatornára, de követheted az ENVIENTA Magyarországot Twitteren, vagy akár csatlakozhatsz a tematikus Facebook csoportunkhoz is.