Solidity és DApp-ok (avagy ugrás a mélyvízbe) #ethereumtudas
Solidity és DApp-ok (avagy ugrás a mélyvízbe) #ethereumtudas
Az előző cikkünkben bemutattuk, hogy hogyan telepíthetjük az okos szerződések fejlesztéséhez szükséges eszközöket: a testrpc-t és az embark-ot. A magyarázattal viszont adósak maradtunk, hogy mégis mik ezek az eszközök. Ebben a fejezetben kicsit megismerkedünk a testrpc-vel és az embark-al, és belenézünk az embark által generált demo projekt forráskódjába (igen, végre lesznek kódok is).
TestRPC
Ahogyan az alapozó cikkekben már írtunk róla, az Ethereum blokkláncot csomópontok egyenrangú hálózata alkotja. Ahhoz, hogy kapcsolódhassunk ehhez a hálózathoz, telepítenünk kell egy Ethereum klienst. Mivel az Ethereum protokoll teljesen nyílt, ezért többféle kliens létezik. Ezek közül a legelterjedtebb az Ethereum alapítvány által fejlesztett hivatalos kliens, a geth. Ha egy ilyen Ethereum klienst telepítünk a gépünkre és elindítjuk, a kliens más csomópontokhoz csatlakozik, így mi is másokkal egyenrangú pontjává válunk a hálózatnak. Mivel a geth egy parancssoros program, nem rendelkezik felhasználói felülettel, e helyett egy JSON-RPC nevű programozói interfészen (API-n) keresztül lehet vele kommunikálni. A TestRPC egy olyan Ethereum kliens, ami nem kapcsolódik más csomópontokhoz, a hálózatot csak emulálja, de JSON-RPC-n keresztül ugyanúgy lehet vele kommunikálni mint egy valódi Ethereum klienssel. Amikor elindítjuk, láthatjuk, hogy a TestRPC virtuális hálózatán létrejött 10 Ethereum cím a hozzá tartozó privát kulcsokkal együtt (ez az a sok krix-krax amit kiír), valamint hogy a localhost 8545-ös portján figyel a JSON-RPC szerver. A létrehozott virtuális Ethereum címekhez jó adag virtuális Ether-t is létrehoz a rendszer, így ezek használatával kedvünkre tesztelhetjük okos szerződéseinket úgy, hogy az semmibe nem kerül nekünk. (Az előző cikkekben ugye szó volt róla, hogy az okos szerződések létrehozása és futtatása is Ether-be kerül.)
Gabriel: Összefoglalva a TestRPC azért felel, hogy a fejlesztésünk mindent úgy érzékeljen, hogy minden már egy decentralizált környezetben fut. Ezért kapunk “kátékpénzt” azaz virtuális Ethert, 10 Ethereum címet és privát kulcsokat (private keys). Utóbbiakat fontosságát majd később megértjük. A lényeg, hogy a TestRPC fontos eleme a programozói játszóterünknek.
Embark és DApp-ok
Az embark egy komplexebb eszköz, ami mindent tartalmaz ahhoz, hogy okos szerződéseket és dapp-okat fejlesszünk. Mielőtt azonban rátérnénk, tisztáznunk kell, hogy mik azok a dapp-ok (decentralizált alkalmazások). Az előbbiekben említettük, hogy az Ethereum kliens csupán egy JSON-RPC interfésszel rendelkezik, de nem tartozik hozzá felhasználói felület. Ilyen felhasználói felületet HTML és JavaScript segítségével hozhatunk létre. Ezek tulajdonképpen sima weblapok. Az Ethereum szeret úgy tekinteni magára, mint egyfajta új generációs Internetre, ami messze túlmutat a virtuális valutákon és a blokkláncon. Erre az új Internetre web3-ként úgy hivatkoznak, mint a ma létező (web 2.0) rendszer következő generációjára. Ezen új rendszerben az Ethereum hálózaton futó okos szerződések töltik be a backend (kb. szerver oldali logika) szerepét, míg a frontend-et (kliens oldali logika) a dapp-ok jelentik. A dapp-ok tehát pontosan olyan weblapok, mint az összes többi, csak ezek egy központi szerver helyett az Ethereum hálózathoz kapcsolódnak. Mivel a jelenlegi böngészők nem támogatják az Ethereumot (a web3-at, ha az ő terminológiájukat használjuk), ezért ezeknek a dapp-oknak a használatához vagy különleges böngészőre (pl. Mist) vagy valamilyen böngésző kiegészítőre (pl. MetaMask) van szükség. Szerencsére az embark áthidalja nekünk a problémát egy lokális szerver futtatásával, így nekünk a fejlesztéshez nem kell telepítenünk majd sem új böngészőt, sem kiegészítőt.
Gabriel: Az embark tehát egy olyan ügyes kis eszköz, amely segít nekünk abban, hogy a klasszikus centralizált internetből megszokott böngésző felületet tudjuk használni. Azt kell megértünk, hogy mi egy számunkra ismert internetet ismerünk és használunk, miközben már születik a következő. Olyan mintha mi csak 2 dimenzióban látnánk, de már fejleszteni szeretnénk egy 3 dimenziós környezetben. Kell valami ami a mi 2 dimenziós agyunk számára szimulálja és felfoghatóvá teszi a 3D-s képet. Így van ez a decentralizált alkalmazásokkal is amelyeket még el kell fogadtatni a mostani böngészőinkkel (miközben azok még nem készek rá, mert centralizált működésre vannak kialakítva). Nos, ezt a feladatot oldja meg az embark.
Fejlesztés Embark-al
Az előző cikkünkben az embark demo paranccsal létrehoztunk egy demo projektet, ami az embark_demo könyvtárban található. Nézzünk kicsit itt körbe! Ami innen most nekünk érdekes, az az app könyvtár. Itt található a dapp és az okos szerződés. Ránézésre olyan az egész mint egy sima weblap. Van itt egy index.html, képek, css, némi javascript, és egy contracts könyvtár. Ez utóbbi a kakukktojás, ő tartalmazza az okos szerződést. Nézzünk is bele gyorsan: találunk itt egy simple_storage.sol fájlt. A .sol kiterjesztés a Solidity-re utal, ami az Ethereum okos szerződésekhez ajánlott hivatalos programozási nyelve. Azért írtam így, mert az előző cikkekben már volt szó róla, hogy az Ethereum blokklánc bájtkód formában tárolja az okos szerződéseket és létezik több fordító is ami ilyen bájtkódot képes előállítani. Ezek közül messze legelterjedtebb a JavaScript szerű Solidity, így a továbbiakban mi is erre koncentrálunk.
Gabriel: Nyugalom itt már én is kezdem elveszíteni a fonalat, de senki sem sürget, ha nem érted olvasd el újra a mondatokat. Segítek. A telepítéssel létrehoztunk egy embark_demo könyvtárat, melyet érdemes most az elején tüzetesebben megvizsgálni. Csak egy megjegyzés még: OSX-en nálam az említett könyvtár és fájlok az app alkönyvtárban vannak.
index.html, képek, css — ezeket a fájlokat ismerjük a “mi világunkból”
contracts könyvtár — itt vannak vagy lesznek az okosszerződések
simple_storage.sol — a .sol a Solidity tehát az Ethereum programozási nyelve
Nézzük hát a kódot:
Az első sor (pragma …) a fordítóak szól. Jelzi, hogy a kód 0.4.7-es Solidity verzióra készült.
A következő sortól (contract …) jön maga az okos szerződés. Aki kicsit járatosabb a programozásban, annak feltűnhet a hasonlóság az objektum osztályok definíciójával. Nos, egy smart contract végül is felfogható egy objektum példánynak, ami az Ethereum hálózatban létezik és vannak mezői meg metódusai. Aki nem annyira járatos az objektum orientált programozásban, az tekintse úgy, hogy egy okos szerződésben vannak kis rekeszek vagy tárolók (őket hívják amúgy mezőknek) és nyújt bizonyos szolgáltatásokat (ők a metódusok).
Gabriel: A legtöbb objektum orientált programozásban a kód nagy része ilyen rekeszeket tartalmaz, amelyek különböző dolgokra használhatók. Némely rekesz csak szöveget tud tárolni, míg mások csak számokat, stb. A lényeg, hogy ezektől most ne ijedjünk meg, mert amikor már egy konkrét programot fogunk írni és azon megyünk át, minden világossá fog válni. Tehát csak semmi pánik!
A következő (uint public storedData) sor pont egy ilyen tárolót definiál. A tároló neve storedData és egy pozitív egész számot (uint típus) lehet bele rakni. Ennek a smart contraktnak más tárolója (mezője) nincs.
Eztán jönnek a szolgáltatások (metódusok) amik a function kezdetű részekben vannak leírva. Az első metódus (a továbbiakban inkább így hívnám) neve megegyezik a smart contract nevével. Ez egy speciális metódus, ami a smart contract létrehozásakor (és csak akkor) fut le (objektum orientált programozásban konstruktornak hívják az ilyet). Van neki egy pozitív egész szám típusú (uint), initialValue nevű paramétere, és ennek az értékét írja be a storedData mezőbe. Ez arra jó, hogy mikor a smart contractot létrehozzuk, megadhassunk valami kezdeti értéket a storedData tárolónak (mezőnek).
Gabriel: A rekeszeken túl most a metódusokra kell figyelnünk, ezek különböző funkciókért felelnek. A fenti program esetében megmondják, hogy melyik rekeszbe mi kerülhet. Az uint-t azt jelenti, hogy oda abban a rekeszben csak egész szám mehet.
Amikor egy ilyen tárolóba értéket írunk be, az érték beíródik a blokkláncba. Mivel ugye a blokkláncban nem értékek, hanem tranzakciók vannak, épp ezért ha pontosak akarunk lenni, ilyenkor valójában nem egy szám íródik be a blokkláncba, hanem az, hogy a storedData változó értéke mire változott. Ha később megváltoztatjuk a storedData értékét, akkor egy új tranzakció íródik be a blokkláncba. Ez az egész a smart contract szempontjából teljesen transzparens, tehát nekünk csak azzal kell foglalkoznunk, hogy vannak tárolóink, amibe értékeket írunk.
Amiért mégis fontosnak tartottam kiemelni a fentieket, az az, hogy lássuk a dolog belső működését. Lássuk azt, amit már a a bevezetőben is írtunk, hogy a blokklánc nem felejt. Ha bármilyen értéket írunk a belső változóba, az a blokkláncban ottmarad, hiába változtatjuk meg később, mindig vissza fog lehet keresni, hogy mi volt az eredeti érték.
Gabriel: Ismét egy újabb részlet abból a világból, amely számunkra még nem annyira ismerős: nem lehet csalni, átírni számokat, meghamisítani számlákat, eltüntetni pénzeket… A blokklánc minden változásról bejegyzést készít és letárolja azt akár több millió számítógépen. Hogy mi a biztonság? Az, hogy lehetetlen több millió embert bevonni egy bűncselekménybe és eltüntetni ezeket a nyomokat. Ilyen szempontból épp a centralizált bankredszer az, ami sérülékenyebb. Érdekes az emberi agy, a megszokás, hogy mégis nem tudjuk elengedni a régit (ami félelmetesebb) és befogadni az újat (amely biztonságosabb).
A következő metódus a set, ami a paramétereként kapott pozitív egész számot (uint) beírja a tárolóba. Ezt a metódust már bármelyik Ethereum felhasználó meghívhatja, így bárki megváltoztathatja a smart contractban tárolt értéket. Van ennek egy párja is, a get metódus, ami pedig a tárolt értéket olvassa ki. Ezzel a metódussal tehát bármelyik Ethereum felhasználó elérheti a blokkláncban tárolt legutoljára beírt számot. Ez a smart contract ennyit tud. Van egy belső változója, amit bárki beállíthat illetve kiolvashat.
Gabriel: A set angol jelentése “beállít”, a get pedig a “megkap” vagy “kinyer”. Egyszerű, hiszen könnyen megjegyezhető, hogy a set-et értéket írunk be egy “rekeszbe”, míg a get-el ki tudjuk olvasni azt belőle. Képzeljük ezt el a gyakorlatban: a Coinbase alkalmazással ETH-t veszünk. A Coinbase jóváírja nekünk ezt a tranzakciót és átírja a set paramétert az adott ETH értékre (ez átíródik a blokkláncban és letárolódik sok ezer gépen). Ezután ha elindítjuk az alkalmazást a mobilunkon, hiszen látni szeretnénk mennyi ETH-nk van, az alkalmazás kiolvassa egy get metódussal az értéket és megmutatja az összeget.
Ha elindítjuk egy terminálban a testrpc-t, és egy másik terminálban az embark_demo könyvtárban kiadjuk az embark build parancsot, a rendszer le is fordítja a sol fájlokat és fel is tölti azokat a blokkláncba. Ez most ugyebár a testrpc-nek köszönhetően a virtuális teszt hálózat, de ugyanígy tudunk majd szerződést publikálni az igazi Ethereum hálózatra is. A különbség, csak annyi, hogy akkor Ethereum kliensként a testrpc helyett a geth-et (vagy más alternatív klienst) kellene futtatnunk. Ennyi az egész, és pont ezért szeretjük az Embark-ot. Ugye nem bonyolult?
Gabriel: Annyira nem, de azért kell egy kis idő mire megemészti az ember ezt az egészet. Szerintem van akinek a két Terminal ablak és a plusz böngésző is elég sokkolólag hat, de idővel engem is beleértve megszokjuk majd.
A következő részben ránézünk kicsit a dapp-ra, hogy lássuk hogyan is készíthetünk (vizuálisan is jobban feldolgozható) felhasználói felületet az okos szerződésünkhöz.
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.