Mi az a smart contract (okosszerződés)?
Az okosszerződés (vagy szintén használt angol nevén smart contract) egy, a blokkláncra publikált, önálló működésre nem képes programkód. Az okosszerződésben leírt utasításokat egy virtuális gép (Ethereum esetében az Ethereum Virtual Machine) futtatja, a futtatáshoz pedig interakcióra van szükség egy tárca vagy más okosszerződés részéről.
Ez az interakció kétféle lehet:
- tranzakció - a blokklánc állapotát megváltoztató művelet
- hívás - a blokklánc vagy a blokkláncon tárolt adat aktuális állapotát lekérdező, de minden mellékhatás nélküli művelet
Az "önálló működésre nem képes" alatt azt értjük, hogy a kód blokkláncra történő publikálásának ténye önmagában nem elég ahhoz, hogy lefusson a kód. Minden esetben szükség van egy hívó vagy tranzaktáló félre, aki végső soron a benne definiált műveletek virtuális gép általi futtatását kezdeményezi. Magán a programkódon belül lehetőség van lekérdezni ezt a felet, és akár ez alapján szétválasztani a működést.
Ezalól egyetlen kivétel van, az okosszerződés konstruktora, ami egy speciális függvény, direkt arra kitalálva, hogy tartalma a smart contract blokkláncra kerülésekor lefusson.
Az okosszerződések blokkláncba kerülésük (bányászás vagy validálás) után nyilvánosak és visszavonhatatlanok.
Mire használható egy okosszerződés?
A rövid válasz: mindenre, de tipikusan komplex blokklánc-műveletek automatizálására. Példák alkalmazási területekre:
- DeFi, azaz decentralized finance alkalmazások, például a Uniswap váltó belső működése okosszerződésekkel van megoldva
- Új kriptovaluta tokenek létrehozása az ERC20 szabvány szerint
- NFT-k létrehozása, azaz "mintelése"
- Cross-chain bridge-ek
- Arbitrázs műveletek atomizálása (azaz annak biztosítása, hogy a tranzaktáló fél által kezdeményezett több egyidejű token váltási kísérlet kizárólag együtt futhasson le)
- Blockchain játékok
- Egyéb decentralizált alkalmazások, pl.: sportfogadás és kaszinó, szállítmányozási láncok monitorozása privát láncokon, stb.
Ezek a leggyakrabban használt applikációk, emellett természetesen még számos felhasználási terület létezik.
Hogyan néz ki egy egyszerű smart contract?
Elöljáróban: Egy smart contract nem egyszerű. Általában Solidity vagy Rust nyelven íródik, sokszáz sort tartalmaz, és teli van tűzdelve emberi szemmel nehezen értelmezhető hexadecimális címekkel. Éppen ezért a lehető legegyszerűbb okosszerződést választottam példának:
pragma solidity ^0.4.8;
contract SimpleStorage {
uint x;
function set(uint newValue) {
x = newValue;
}
function get() returns (uint) {
return x;
}
}
Ez a program egy Solidity nyelven írt okosszerződés, amellyel a vele interaktáló fél nem túl izgalmas módon képes egy nemnegatív egész számot tárolni a blokkláncon (set függvény), és képes lekérdezni azt (get függvény).
Tranzakciós költségek a blokkláncon
A blokkláncon történt bármilyen változás (azaz tranzakció) drága számítási művelet. Bányászok és/vagy validátorok hardvererőforrásokat allokálnak annak érdekében, hogy a kód lefuthasson. Éppen ezért a tranzakcióknak anyagi költsége van. Ezt gas cost-nak hívják, és Ethereum blokkláncon ETH-ban (vagy kisebb egységeiben, Gwei, wei) mérik.
A tranzaktáló fél tehát saját tárcájában rendelkeznie kell bizonyos mennyiségű ETH-val hogy le tudja futtatni a tranzakciót (a fenti példában a set függvény hívása tranzakciónak minősül, hiszen a blokklánc állapotát megváltoztatja, odaír egy számot). Minden egyes elemi műveletnek megvan a költsége, melyet az EVM dokumentációjában megismerhetünk. Ezek az elemi műveletek az úgynevezett bájtkód műveletei, ami egy előfordított (leginkább Assembly-re hasonlító) gépi kód. Szintén a példánál maradva, az x = newValue;
sor szintén be fog fordulni EVM gépi kódra, az írási művelet OPCODE-ját az alábbi táblázatból kikeresve pedig azonosíthatjuk a művelet konkrét költségét. Az okosszerződésben lévő valamennyi művelet költsége természetesen összeadódik, és a végső gas cost fizetése a tranzaktáló félre terhelődik.
Amennyiben a tranzaktáló fél nem rendelkezik elég Etherrel (ETH) a tranzakció lebonyolításához, az nem kerül be a blokkláncba, érvénytelen lesz. Előfordulhat azonban, hogy ekkor is kell valamennyi költséget fizetni, tipikusan ha a program félig lefutott és már igénybe vett számítási kapacitást a hálózattól. Emellett fontos megjegyezni hogy a tranzakció tényleg köznapi értelemben vett tranzakció, azaz "fél lefutás" nincs, ilyen esetben minden elvégzett művelet visszavonódik. Nem kerül bele a blokkláncba.
Leendő blockchain fejlesztőknek
Konkrétumokat az Ethereum számítási költségeiről és az EVM működéséről itt találsz:
A legnépszerűbb smart contract programnyelv tanulását itt tudod elkezdeni:
A gyakorlat részéhez pedig az alábbi tutorialt javaslom, ami játékos formában visz végig egyszerűbb contractok (token, NFT) megírásáig:
A kriptó világ legfontosabb friss híreit válogatjuk, heti 1 levélben. A feliratkozás ingyenes.
https://partner.bybit.com/b/webharom