Nyomjunk saját pénzt, avagy az ERC20-as tokenek rejtelmei (1. rész) #ethereumtudas

Bizonyára feltűnt, hogy a szokásos ütemünkhöz képest pár nap csúszással jelent meg soron következő tananyag újabb része. Ennek oka, hogy nagy erőkkel dolgozunk saját ICO-nk előkészítésén, így a cikk írás kicsit háttérbe szorult. Ennek apropóján viszont úgy gondoltuk, hogy ha már úgyis a tokenek körül forog mostanában minden gondolatunk, miért is ne erről írnánk tananyagot. Szóval jöjjenek azok az ominózus ERC20-as tokenek.

No de mi az a token és mi köze a okos szerződésekhez?

Ha felhasználói oldalról közelítjük meg, a token amolyan saját pénz, ami valamilyen értéket képvisel. Például az Ether maga is token, amit ugye okos szerződések futtatására és tranzakciók fizetésére fordíthatunk. De token a FileCoin, amivel adattárolásért, vagy a NameCoin, amivel névbejegyzésekért fizethetünk. Igazából az összes coin token. A legtöbb alternatív blokklánc csak egyetlen coint képes kezelni, ami fixen bele van programozva. Az Ethereum esetén viszont az okos szerződéseknek hála, bárki létrehozhat új tokent (coint). Ezek a saját coinok (tokenek) az ICO-k főszereplői, amikor egy startup a befektetésért cserébe ilyen saját pénzt ad, amit aztán a befektetők adhatnak/vehetnek, mint a részvényeket.

Fejlesztői szempontból sokkal prózaibb a helyzet: egy token az Ethereum hálózaton egy sima okos szerződés (smart contract), ami rendelkezik egy nyilvántartással arról, hogy melyik etherum címhez hány token tartozik és pár szabványos metódussal, amivel ezeket mozgathatjuk egymás közt. Tehát az, hogy nekem van 10 ENVIENTA tokenem, valójában nem jelent mást, mint hogy az okos szerződésben az ethereum címem mellé egy 10-es szám van írva. Semmi többet. Tehát a token nem egy létező valami, amit ide vagy oda lehet rakni, egyszerűen egy szám egy nyilvántartásban. Elsőre kicsit furának tűnhet, hogy egy vacak szám egy táblázatban milyen rengeteg “valódi pénzt” érhet, de ha jobban belegondolunk, akkor az általunk birtokolt ether, bitcoin, vagy épp a bankban tartott pénzünk sem több mint egy vacak szám egy táblázatban. Ezeknek a számoknak a pontos kezelése nagyon nagyon lényeges, hisz adott esetben sok millió dollárt képviselhetnek. Itt látszik igazán, hogy mennyire megbízható adattároló a blokklánc és mennyire megbízható kódfuttatást biztosítanak az okos szerződések, hisz erre az adattárolóra és kód futtató rendszerre nyugodt szívvel bízhatjuk rá a dollármillióinkat.

Gabriel: Lehet a tokenekkel kelek-fekszem, de még mindig nem dolgoztam fel agyilag, hogy saját pénzt bocsátunk ki. Ez lesz az ENV. Zseniális!

Hogy néz ki egy ilyen token-t megvalósító okos szerződés, és mi a fene az az ERC20?

Ahogyan az előbbiekben említettük, a tokent egy okos szerződés valósítja meg. Amikor valamilyen műveletet végzünk a tokenjeinkkel (átutaljuk őket, tokent kapunk, vagy csak ránézünk az egyenlegünkre, stb.) akkor valójában ezzel az okos szerződéssel kommunikál a token kezelésére képes pénztárcánk (wallet). Ahhoz, hogy a pénztárca “szót értsen” a tokent megvalósító okos szerződéssel, “egy nyelvet kell beszélniük”. Ez a gyakorlatban azt jelenti, hogy minden tokent megvalósító okos szerződés esetén ugyanúgy kell hívni a mozgatásért, egyenleg lekérdezésért, stb. felelős funkciókat és az ezekkel kapcsolatos eseményeket. Ezeket az elnevezéseket rögzíti az ERC20-as token szabvány, amely így néz ki:

Lássuk sorban a funkciókat:

function totalSupply() constant returns (uint totalSupply);

Ez a metódus azt adja meg, hogy összesen hány darab létezik az adott tokenből.

function balanceOf(address _owner) constant returns (uint balance);

Ez a metódus megmondja, hogy a megadott Ethereum cím tulajdonosának hány darab tokenje van.

function transfer(address _to, uint _value) returns (bool success);

Ezzel a metódussal tudunk a megadott ethereum címre megadott mennyiségű tokent küldeni.

function approve(address _spender, uint _value) returns (bool success);

Ezzel a metódussal engedélyezhetjük a megadott ethereum cím tulajdonosának, hogy a megadott értékig tokent vonjon tőlünk le. Ez olyasmi, mint bankoknál a csoportos beszedési megbízás engedélyezése mondjuk a biztosító számára, hogy havonta levonja az életbiztosításunk díját.

function allowance(address _owner, address _spender) constant returns (uint remaining);

Ezzel a metódussal lehet lekérdezni, hogy a megadott ethereum cím tulajdonosának számlájáról a megadott másik cím tulajdonosa még mekkora összeget tud levonni.

function transferFrom(address _from, address _to, uint _value) returns (bool success);

Ezzel a metódussal indítható utalás az approve metódusban megadott egyenleg terhére. Tehát ezt kell hívnia pl. a biztosító társaságnak, hogy levonja a biztosítási díjat.

A végére maradt két esemény (az előző részben írtunk ezekről), amin keresztül az okos szerződés értesítheti a pénztárcát (walletet), hogy utalás (mi indítottuk), vagy levonás (másik fél indította a számára engedélyezett mennyiség terhére) történt: 
 
event Transfer(address indexed _from, address indexed _to, uint _value);
event Approval(address indexed _owner, address indexed _spender, uint _value);

Ezen kívül meg kell adnunk 3 publikus változó értékét, ami a token elnevezését, szimbólumát, és a kezelt tizedes jegyek számát tartalmazza. Vagyis azt, hogy az adott token hányfelé osztható (ez az érték általában 18).

string public constant name = “Token Name”;
string public constant symbol = “SYM”;
uint8 public constant decimals = 18;

Gabriel: Remélem most mindenkinek leesett, hogy amikor épp elégedetten túlvagyunk egy ICO token befektetésen, akkor miért is kell a manuálisan a MyEtherWalletben beírni az okosszerződés címét, a token nevét és a 18-as számot.

Ha tehát egy okos szerződés a fenti funkciókat és eseményeket megvalósítja, akkor funkcionálhat tokenként. E mellett szabadon adhatóak további metódusok az okos szerződéshez. Léteznek például smart tokenek, ahol az okos szerződéstől vásárolhatunk további tokeneket, vagy éppen eladhatunk neki etherért, vagy más valutáért cserébe (ezzel egyfajta primitív tőzsde funkciót megvalósítva). Ami a lényeg, hogy ilyen metódusokkal és eseményekkel mindenképp rendelkeznie kell a tokent megvalósító okos szerződésnek. Ha azt szeretnénk, hogy az arra alkalmas pénztárcában megjelenjenek az adott tokenek, meg kell adnunk a token contract ethereum címét. Ekkor a pénztárca felveszi a kapcsolatot az adott okos szerződéssel, és képes megjeleníteni a tokenjeinket, valamint indíthatunk utalásokat, stb.

A mai cikkbe ennyit gondoltam írni az ERC20-as tokenekről. A követező cikkünkben össze is rakunk egy ilyen tokent, tehát beváltjuk a címben tett ígéretünket, és saját pénzt fogunk nyomni. Tartsatok velünk… (és drukkoljatok, hogy összejöjjön az ICO-nk).

Gabriel: Azt hiszem mindenki nevében köszönetet kell mondamom Lacinak, mert zseniálisan magyaráz és én szinte nem tudok mit hozzátenni. Ha tetszett a mai írás nyomd meg a taps gombot. Laci megérdemli!

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.