Flashloan: a végtelenbe és tovább!

A flashloan alapú, illetve a smart contractokba csomagolt komplexebb DeFi ügyletek az elmúlt hónapokban kétségtelenül komoly szeletet hasítottak ki az ethereum hálózat teljesítőképességéből. Mára az az – egyébként teljesen normális – állapot alakult ki, hogy az Ethereumot elkezdték arra használni, amire az lényegében való. Míg fél évvel ezelőttig a hálózatot javarészt csak az azon futtatott scamek, mlm-en és ponzik… illetve az USDT tranzakciók tették ki (ez utóbbi vajon melyik kategóriába tartozik az előző három közül?), addigra most jó látni, hogy a top gas burnerek listáján jelentős helyet képvisel már az Uniswap, de már az új DeFi megoldások is ott vannak, úgy mint: Curve, Aave vagy éppen a Balancer.

Korábban a flashloanok kapcsán már született egy írásom a médiumon, abban a cikkben inkább ennek a negatív oldalát szedtem csak össze, viszont a flashloan és akár a flashloan nélküli smart contractba csomagolt komplex pénzügyi műveletek azóta is igen népszerűk. Most gondoltam bemutatok néhány beszédesebb példát (sikereseket… kevésbé sikereseket), hátha kedvet tudok vele csinálni néhány olvasónak ahhoz, hogy szunnyadó kreativitását ne csak a random trader botok konfigurálásában élje ki… hanem belépjen a decentralizált arbitrázs piacra is komoly szereplőként.

15.1 ETH -> 17.2 ETH egy szempillantás alatt

tx: 0xd22def255e811e4094f…

A felhasználó úgy csinált 15 ETH-ból 17.2-őt, hogy egyetlen tranzakción belül előbb elcserélte a 15 ETH-t 49,6 YFL-re a Uniswapen, majd ebből vett a Balanceren aLINK-et, amit withdrawolt az Aave-n, ebből lett neki 445 LINK tokene, melyet eladva a Uniswap-en visszakapott 17.2 ETH-t.

Ugye milyen jól hangzik? Na akkor nézzük, hogy mik is ezek a dolgok pontosan:

  • Uniswap és Balancer: Két különböző decentralizált exchange (dex), mindkettő nagy forgalmú és nagy likviditású, tehát potenciális eszköze az ilyen jellegű arbitrázsnak.
  • Aave: onchain lending platform (DeFi), amin un. kamat hordozó tokeneket lehet létrehozni likviditás biztosítással, mely kamat hordozó tokenek szabadon tradelhetők. A kamat hordozó tokénekről egyébként az előző cikkemben tudsz részletesebben olvasni. Itt a konkrét esetben a contract aLINK-et vásárolt, ami a ChainLink Aave platformon tokenizált (kölcsönadott) verziója.

Ezek tudatában már nem annyira nagy kaland átlátni, hogy mi is történt a contractban. Lényegében az Uniswap ETH->YFL és a Balancer YFL->aLINK árfolyama között volt egy komolyabb arbitrázs ablak, amit bezárva tudott 15 ETH-ból 17.2-őt csinálni a delikvens.

Hogy tud ennyi tranzakció végrehajtódni egyszerre egy contracton belül?

Az Ethereum gyakorlatilag egy hatalmas állapotgép, ahol az összes full node ismeri az összes address és contract aktuális állapotát. Mivel ezek változásai futásidő alatt értékelődnek ki, mely futásidő gyakorlatilag a bányász EVM-jében történik meg, így nem tud ütközés, összefutás, race condition vagy bármilyen egyéb probléma kialakulni, hiszen mindig csak egy aktuális utolsó block és ennek megfelelő aktuális állapottér létezik csak.

Pont ez adja meg arra a lehetőséget, hogy egyetlen contractban képes légy egy adott értéket akár többször is megmozgatni különböző címeken. Az előző pont kapcsán például felmerülhet, hogy mégis hogyan került a megvásárolt 49 YFL token az uniswapról a balancerre? Nos a válasz roppant egyszerű: át lett utalva>

Example transfer from uniswap to balancer

Tehát van arra lehetőség, hogy egyetlen tranzakción belül adjunk-vegyünk (cseréljünk) kriptoeszközöket, majd azokat átmozgassuk egy másik platformra, ahol még ugyanazon tranzakción belül ott is végrehajtsunk műveleteket, melyek eredményét tovább tudjuk mozgatni egy harmadik-negyedik-huszadik platformra.

Ennek határt, igazából csak a gasLimit szab, illetve az, hogy mennyi pénzt vagyunk hajlandók erre elkölteni.

Az ilyen contractok ugyan nem olcsók, viszont a sikerességük garantálható, hiszen a contract pontosan tudja az utolsó lépésben, hogy mennyi is lett a hozam és amennyiben az veszteségbe fordulna… akkor egyszerűen reverteli (visszacsinálja) a teljes tranzakciót, mely annyit jelent, hogy valójában sehol semmi sem történt meg.

0 ETH -> ~2 ETH, flashloan kölcsönnel!

tx: 0xfffd08d6c6b1fb728…

Érdekességképpen beraktam egy ilyen példát is, itt pontosan ugyanaz történt, mint az előző 15->17 ETH-s esetben, csak éppen itt az arbitráláshoz szükséges alap likviditás is kölcsönkérésre került. Egészen pontosan a contract futtatója kölcsönkért 12.11 ETH-t a dYdX flashloan likviditási pooljából (ugye ennek a lényege, hogy bármennyit kölcsön kaphatsz, de a tranzakció végén vissza kell fizetned). Majd az így kapott 12.11 ETH-val végig csinálta ugyanazt YFL->Balancer->aLINK->Link->ETH arbitrálást, mint az előző példánál és a végén keletkező 13.8 ETH-ból törlesztette az eredeti 12.11 ETH kölcsönt.

Összességében persze itt a szerződés futtatója nettó veszteséggel szállt ki a történetből, hiszen ugyan keresett kb 1,7 ETH-t, de a contract futtatása neki 2.28 ETH-ba került.

3,2 ETH nyereség 5,4 ETH költséggel!

tx: 0x218d5a2c3ef49850ff…

Mutatnék egy roppantul egyszerű példát is, ahol mindösszesen csak annyi történt, hogy a Balancer ETH->BAL és BAL->ETH párjain belül alakult ki egy igen nagy spread. A delikvens így tudott csinálni egy lépésben 276 ETH-ból 284 ETH-t. Mindez azonban neki 5.4 ETH-ba került.

Miért is kerülnek ilyen sokba ezek a tranzakciók?

Az onchain műveletek sajnálatos mellékhatása, hogy hamarabb kell felfednünk azt, hogy milyen arbitrázs lehetőséget találtunk, mint hogy azt le is tudnánk fölözni. Amikor létrehozunk egy ilyen contractot és deployoljuk azt, akkor a contract előbb csak pending állapotba kerül (pont úgy mint bármilyen utalás), és csak akkor fog végrehajtódni, amikor az ténylegesen konfirmálódik (blokkba kerül).

Mivel nem lehet tudni, hogy egy blokk után pontosan mikor fog újabb keletkezni, így a contractot a lehető leggyorsabban be kell küldeni a hálózatra, hogy le ne csússzunk a lehetőségről.

Ezen arbitrázs lehetőségekre azonban egyre többen figyelnek egyre okosabb eszközökkel. Ezeket az eszközöket frontrunnereknek nevezzük, amik front running műveletet hajtanak végre. Ennek lényeg, hogy lemásolják az adott contractot, ha az valóban esélyesen tud nyerni, majd rálicitálnak az eredeti contractra gasPriceban így remélve, hogy az ő copycat contractjuk fog előbb lefutni és megnyerni a nagy nyereményt.

A rálicitálás persze rálicitálást generál, ami miatt egyszerűen előfordul, hogy akár a standard gasPrice több százszorosát is megadja a frontrunner vagy éppen az eredeti ötletgazda, hogy ő fölözhesse le a jutalmat. Így tud előfordulni, hogy egy cirka 8 ETH-s nyerségért adnak akár 5,4 ETH fee-t is.

Ezekkel a tranzakciókkal a bányászok kaszálják a legtöbbet.

Nézzünk egy komplexebbet

tx: 0x0a5a8905fb2bc1887b2e….

Kölcsönvételre került a dYdX-től 995 ezer DAI flash loanként. A Curve.fi-n ez swappelésre került (Compound swap USDC->DAI) USDC-re (a saját balanceán lévő 4900 DAI-val együtt, így lett belőle pontosan 1 millió DAI). A tranzakció pillanatában a Compound SWAP orderbook éppen likviditás hiányos volt, így a swap után 1.008.725 USDC-je lett. Ezt persze akár le is fölözhette volna, de ugye vissza kellett fizetnie a 995 ezer DAI kölcsönt, ezért ugyanígy visszaváltva (sUSD USDC->DAI swap) csinált 1.003.891 DAI-t, majd visszafizette a 995 ezer DAI kölcsönt a dYdX-en. A végén a tiszta profitja közel 3000 dollár DAI-ban.

Ebben az esetben a tranzakció azon nyerészkedett, hogy a Curve-ön keresztül elérhető Compound USDC->DAI swap és sUSD USDC->DAI swap között volt egy komolyabb arbitrázs ablak, amihez ráadásul még tetemes likviditás is társult mindkét oldalon.

Érdemes megnézni a owner ethereum címét, jól látható hogy kb. egy hónapja állt át erre a típusú arbitrálásra és igen szépen keres is belőle folyamatosan: 0x89097d3c37239889bEa4af4095c13c2CC903DCAf

Talán ezen néhány példa alapján is jól látható, hogy mi mindent lehet tenni egyetlen tranzakción belül, illetve, hogy miről is beszélünk olyankor, amikor a DeFi kapcsán egy teljesen új alapokra helyezett pénzügyi rendszerről beszélünk. Nagyon komoly verseny folyik az ilyen komplex arbitrázs ablakok bezárásáért, ahol gyakran a tényleges nyereség csak néhány centben mérhető, de szerencsés esetekben akár több ezer dolláros nyereség is összehozható.

Az előző cikkem kapcsán azt írtam, hogy a DeFi és a Yield Farming kifejezetten kockázatos és veszélyes, különösen ha olyan null kilométeres projektekbe ugrálunk be mint például a YAM. Nos, a yield farming kockázatai eltörpülnek az itt felsorolt DeFi arbitrázs farmoláshoz képest, hisz jól látható, hogy nagyon komoly verseny zajlik egy-egy pozícióért, ahol a veszteseknek ugyanúgy meg kell fizetni a tanulópénzt a transacion fee formájában.

Bookmark the permalink.

4 Comments

  1. Ha jol ertem: ezek az arbitrazsrobotok azert is hasznosak mert sokkal likvidebb lesz a piac altaluk. Ha lesznek cbdc es lesz eth2.0 akkor kialakulhat egy gyors olcso es hatekony piac?

  2. A bányászt mi akadályozza meg abban, hogy ne frontrunningoljon?

    Amúgy én azt hittem, hogy addig nem lehet hivatkozni egy állapotra, amíg az nincs kibányászva, szal az első példánál a uniswap-es eth-> yfi tranzakciót előbb ki kell bányászni, és csak utánna lehet elkölteni az yfi-t. De akkor elég ha a bányász EVM-jében változik meg a contract állapota, viszont ez nem okoz semmilyen inkonisztenciát? Pl: flashloan-nal eltolom az egyik tőzsdén a market price-t amire valamilyen price oracle reagál, aztán ezt kihasználom valahogy.

    Ha elég az EVM állapota, akkor nem lehetne a bonyolultabb tranzakciókat offline végrehajtani? Mondjuk kiválasztanak egy megbízható végrehajtót, aki lefuttatja mindig a contract tranzakcióit, majd az állapotot broadcastolja, és adott számú tranzakció után csak a végleges állapotot bányasztatja ki. Habár lehet ezek a POS sidechain-ek hasonlóan működnek, nem tudom 🙂

    • Nem tud inkonzisztencia keletkezni, hiszen minden miner a általa ismert lánc konzisztenciájából indul ki amikor összerakja a soron következő blokkját, mely blokk összerakásakor sorban dolgozza fel a saját rendezési elve (fee szerint csökkentő + kanonikus order) szerint. Tehát amikor feldolgoz egy függő tranzakciót, akkor az nemcsak, hogy az előző blokk állapottere alapján értékelődik ki, de a készülő blokkba már berakott korábbi tranzakciók által módosított állapottérnek megfelelően is.

    • Itt lenne egy érdekes esettanulmány, meg kicsit talán ijesztő is.
      A végén szó esik a jövőről is és ők is bányászokhoz lyukadnak ki, ahogy Te is felvetetted ezt.

      “Today, the frontrunners are just bots. Tomorrow, it will be miners.
      Miners today leave money on the table by not acting on these opportunities. In the future, they will reorder and submit transactions in their mempools for their benefit. Even worse, they could reorg blocks mined by other miners, in an attempt to steal MEV which was not claimed by them, resulting in chain instability.”

      https://medium.com/@danrobinson/ethereum-is-a-dark-forest-ecc5f0505dff

Leave a Reply

Your email address will not be published. Required fields are marked *