A történelem ismétli önmagát. Miközben a Bitcoin kapcsán már megnyugodni látszanak a kedélyek a skálázási vita kapcsán (nem… nem oldódott meg semmi, csak már kevésbé érdekel bárki is a vita, mindenki beletörődött, hogy ez van; ezzel kell élni)… szóval aközben most az Ethereum háza táján zajlik valami nagyon hasonló történet. Kisebb belső háború folyik éppen a bányászok és a core fejlesztők között, mely persze sok szempontból mondvacsinált, de mégis csak sok az áthallás:
- A minerek növelni akarják a blokkokat, ezáltal csökkentve a hálózat terhelését, ami implicit csökkentené a költségeket, de valójában csak a bányászok anyagi hasznát hajtja fel azáltal, hogy sokkal több tranzakció tud átmenni.
- A core fejlesztők (élükön Szilányi Péterrel) viszont több szempontból is kifakadnak, mivel a bővítés miatt tovább növekedik a full nodeok erőforrás igénye, ami szükségképpen a centralizáció felé vezet. Ráadásul a növelés lassítja a full nodeok feldolgozását, ami miatt növekedni fog az orphan blokkok aránya is.
Eléggé dejá vu szituáció…
A dolognak talán egyetlen szépséghibája, hogy míg Bitcoin esetén ebből a kérdésből valóban egy nagyon komoly belső polgárháború lett (BIP-148 aktiváció vs SegWit-2), addig ethereumon a minerek szépen zárt ajtók mögött megegyeztek és felcsavarták a blokkonkénti gaslimitet 10 millióról 12 millióra.
Hogy ez mennyire egy látszat megoldás volt csak, azt mi sem bizonyítja jobban, mint hogy az átállás óta ugyanúgy tele vannak a nagyobb blokkok is, illetve az átlagos gasPrice továbbra is 25 és 40 gwei közül alakul szinte konstansan.
Persze ha a történetnek itt lenne vége, akkor nem írok róla külön bejegyzést. De a helyezet ennél kacifántosabb. Ahogy szokott lenni, Vitaliknak általában van egy jó ötlete, amivel a problémát meg lehet kerülni vagy újraértelmezni:
EIP-1559 – A megoldás(?)
Idén április 13-án terjesztette be Vitalik, néhány további fejlesztővel közösen a 1559-es sorszámú Ethereum fejlesztési kezdeményezését. Ennek a célja alapjaiban újragondolni a teljes fee market modellt.
Jelenleg az Ether tranzakciók díja teljesen szabadáras és aukción dől el, hogy mely tranzakciók kerülnek blokkba és melyek maradnak a várakozási sorban. Bárki bármekkora feevel (gasPrice) be tud rakni bármilyen tranzakciót, annak reményében, hogy az előbb-utóbb blokkba kerül. A legtöbb tárca/kliens/node a szokásos költség saccolási metódust használja, aminek lényege, hogy az előző blokkokba került tranzakciók gasPrice értékét átlagolják és súlyozzák, majd az így keletkező értékre még ráraknak egy kicsit ha a blokk tele volt. Ez a megközelítéssel egyrészt az a baj, hogy nagyon könnyen az egekbe tud repülni a gasPrice, másrészt a minerek profitmaximalizálása miatt akár előfordulhat, hogy hibás becslések jönnek ki. Ennek negatív hatását valószínűleg már sokan megtapasztalták, amikor megpróbáltak “olcsón” elküldeni egy tranzakciót leterheltebb időszakban.
Mit is jelent pontosan ez a profitmaximalizálás miatt keletkező becslési hiba? A probléma alapja az, hogy egyszerűen a jelen idő alapján akarunk egy jövőbeli eseményre saccolni. Ez azt eredményezi, hogy amikor éppen hírtelen nagyon sok tranzakció tódul be a hálózatra, akkor alábecsülésre kerülnek a tranzakciós díjak, amikor viszont csökken a hálózat terhelése, akkor viszont a fee-k még nagyon sokáig magasan maradnak és csak lassan csökkennek. Előbbi probléma azt eredményezi, hogy nagyon sok tranzakció egyszerűen nem tud blokkba kerülni és beszorul a mempoolba hosszú időre. Utóbbi pedig azt, hogy gyakran 2-3x többet fizetnek egy-egy tranzakcióért, mint amennyit valóban kéne, hogy bekerüljön az a következő blokkba… ami explicit eredményezi, hogy a következő blokkba kerülő tranzakciók is sokkal drágábbak lesznek, mint ami indokolt lenne.
A EIP-1559 kezdeményezés a problémát a következőképpen hivatott orvosolni: bevezetésre kerül három újabb protokoll paraméter, ezek a: BASEFEE, GASPREMIUM és FEECAP.
Ezek közül a BASEFEE egy a hálózat által kiszámolt és nem módosítható érték. Alap értéke az 1 gwei, ami akkor növekszik, ha az előző blokk tele volt és akkor csökken, ha nem volt tele.
Minden tranzakció küldésénél két paramétert lehet majd megadni: GASPREMIUM (kvázi a miner borravalója), illet a FEECAP, ami a maximum gwei-ben mért gasPrice, amit hajlandó a küldő kifizetni. Logikusan a GASPREMIUM értékének valahol 0 és “nem-túl-sok” között kéne lennie, míg a FEECAP-ot tudjuk úgy értelmezni és számolni, mint ahogy korábban a gasPrice-t számoltuk
Ezt követően a matek már egyszerű. A tranzakció gasPrice értéke a BASEFEE+GASPREMIUM lesz, de nem haladhatja meg a FEECAP-et.
GASPRICE = min(BASEFEE+GASPREMIUM , FEECAP)
Mit jelent ez a gyakorlatban:
JELENLEG, ha az jön ki a gasPrice becslésnél, hogy a tranzakció várható költsége mondjuk 52 gwei kell hogy legyen és bekerül az adott tranzakció a blokkba, akkor a miner zsebre rakja az 52 gwei*txgas jutalmat, függetlenül attól, hogy egyébként mondjuk 38 gweivel is bele fért volna az adott blokkba.
EIP-1559 aktiválása után: Legyen mondjuk a BASEFEE 20 gwei és mondjuk ajánljunk fel a minereknek +10 gwei borravalót (GASPREMIUM), de limitáljuk ezt maximum 50 gwei FEECAP-en. Ebben az esetben ha a soron következő blokkba bekerül a tranzakció, akkor annak a díja garantáltan 30 gwei lesz. Viszont ha mégsem kerülne be, akkor sincs pánik, mert a következő blokkra már a protokoll fentebb húzza a BASEFEE-t pl 21 gwei-re és amennyiben az így keletkező 31 gwei (BASEFEE+GASPREMIUM) ajánlatommal már beleférek a következő blokkba, akkor tutira benne is leszek, ráadásul tutira 31 gwei gasPrice tranzakciós költséggel… annak ellenére, hogy egyébként ez a tranzakció nekem akár 50 gwei-t is megért volna (FEECAP).
És akkor jöjjön a csavar
Az előző pontban bemutatott EIP-1559-es metódus alapvetően egyszerű és nagyszerű, de közismert, hogy egy ilyen modellnek, bizony meg kell állnia a helyét az olyan eltérő anyagi motivációkkal rendelkező komplex rendszerben is, mint az Ethereum. Hiszen jól látható, hogy a BASEFEE-t igazából könnyedén lehet manipulálni, ha folyamatosan be vannak tömve a blokkok és máris dől a lóvé a minerekhez.
Erre Vitalik és barátainak megoldása végtelenül egyszerű:
A BASEFEE minden esetben elégetésre kerül, tehát azt NEM írhatják jóvá maguknál a minerek jutalomként.
Ergo a minerek kizárólag a GASPREMIUM-ot tudják jóváírni bevételként. Ez – a fenti példánál maradva – azt jelenti, hogy bár az adott tranzakció tényleges költsége akár lehet 31 gwei is amikor blokkba kerül, de a miner akkor is csak a GASPREMIUM értékét (10 gwei) írhatja jóvá magánál bevételként. Ezzel gyakorlatilag jelentősen letörve a minerek előnyét a becslések és eszkalációk miatt elszabaduló bányász költségek kapcsán.
Valóban megoldja a problémákat?
Bár az EIP-1559 által előterjesztett módosítás elegáns, egyszerű és jól kezeli a problémát, de sajnos nem tudja teljesen kizárni a manipuláció lehetőségét a bányászok oldaláról. Egyrészt a minerek tudják manipulálni a BASEFEE-t. Ehhez csak annyi kell, hogy folyamatosan olyan blokkokat készítsenek, amelyek nincsennek tele (tehát nem kerül elfogyasztásra a teljes 12 milliós blokkonkénti gas limit). Így:
- Egyrészt ki tudják kapcsolni a teljes BASEFEE modellt, ezáltal visszahozva a jelenlegihez hasonló aukciós fee modellt.
- Másrészt mivel ehhez a blokkok nem lesznek tele, így amikor éppen felgyűlnek a pending tranzakciók, akkor azok méginkább nem fognak beleférni a blokkba és méginkább elszállnak az tranzakciós költségek.
Ehhez persze az kell, hogy a nagyobb bányászok (cirka 60%+) megegyezzen ebben a stratégiában. Sajnos az elmúlt években a Bitcoin esetén már bebizonyosodott, hogy a nagyobb bányász poolok hajlamosak ilyen jellegű háttérmegegyezéseket kötni.
A EIP-1559 egyértelműen vízválasztó lehet az Ethereum jövője kapcsán. Vagy tényleg jól sül el és a bányászok önös anyagi érdeke lehetetlenné teszi a manipulációt… ha mégsem így lesz, akkor még a mostaninál is durvább vadnyugati időszak várható a tranzakciós költségek kapcsán.