Nem akar ez menni a bZx-nek…

Ha esetleg nem mondana sokat a bZx neve, azon nincs mit csinálkozni, hiszen egy olyan Defi margin/lending szolgáltatóról beszélünk, ami még a nyár elején égette el sikeresen azzal a saját reputációját, hogy a flashloanok megjelenésekor egy smart contract hiba miatt több tíz ezer Etherrel károsította meg az ügyfeleit.

Egy normális világban egy ekkora fiaskó után az ilyen projekteket szokás lehúzni… de ez nyilván nem így zajlik a DeFi univerzumban. Ezt számos példa bizonyítja, lásd: YAM, Sushi vagy éppen a bZx.

Avatott szemek az alábbi kis kód diff kapcsán már egyből a fejükhöz csapnak:

A támadási trükk mindösszesen annyi volt a bZx iETH tokenjét kezelő smartcontractban, hogy amennyiben ugyanarról a címről ugyanarra a címre küldtél (_from == _to), akkor egyszerűen duplikálódott az iETH tokened anélkül, hogy ténylegesen megjelent volna mögötte az adott mennyiségű valódi ETH fedezet.

Az ügy azért igazán kellemetlen, mert a sokadik incidens után sem érezte fontosnak a bZx, hogy auditáltassa a contractját, helyette inkább élesben teszteltette az ügyfelekkel, mire valakinek feltűnt a bug és jól ki is használta:

https://twitter.com/bZxHQ/status/1305189177730891776

A bejelentést követően a DuneAnalytics csapata végzett egy post-mortem elemzést, ahol kitúrták, hogy az iETH contractban 4,7 ezer ETH-t loptak ezzel a módszerrel el összesen 9 különálló tranzakcióban.

Mondanám, hogy így utólag biztos belátja a bZx, hogy csak olcsóbb lett volna auditáltatni a kódot, de végső soron most sem a saját pénzüket herdálták el és az előző két fiaskó után sem érezték, hogy csak kéne auditáltatniuk magukat.

Ui: Akit nem hagy nyugodni, hogy mi volt a hiba a smart contractban:

  • Kiolvasta a küldő (_from) és a fogad (_to) address egyenlegét.
  • Kivonta az elküldött mennyiséget a _from egyenlegéből, majd hozzáadta a küldött mennyiséget a _to egyenlegéhez.

AHELYETT HOGY:

  • Kiolvassa a _from-ból az egyenleget.
  • Levonja belőle az elküldendő token mennyiséget
  • EZEK UTÁN olvassa ki a _to-ból az egyenleget (ezzel lehetővé téve, hogy amennyiben _from == _to, akkor frissüljön az egyenleg)
  • Hozzáadja a _to egyenlegéhez a küldött mennyiséget.

Apróság…

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.

Folytatás…