A chia network pool protokol megvalósításáról


Hozzáadva: 2021. Július 02. Megtekintve: 516

A chia network kriptovaluta hálózat fejlesztői régóta ígérik a pool protokol megvalósítását. Erre azért van szükség, mert a kevés tárhellyel rendelkező felhasználók csak nagyon ritkán kapnak kifizetést a jelenlegi felállásban. A mai hálózati méret mellett 100-200TB kapacitás alatt nem nagyon van értelme belekezdeni a chia farmolásba hiszen a blokk hitelelsítéshez szükséges idő nagyon kitolódott. A pool protokol azonban hamarosan érkezik és a jelen bejegyzésben ennek részleteit fogjuk áttekinteni.


A pool protokol angol nyelvű leírását a GitHub-on a következő linken tudod megtekintetni: https://github.com/Chia-Network/pool-reference. Az alábbiakban ezen leírás magyar nyelvű fordítását közlöm.


A GitHub-on található forráskód egy egyszerű szervert valósít meg python nyelven és ez a szerver jelenti a Chia pool implementáció alapját. Amint teljes mértékben elkészül a kód még szükség lesz némi skálázhatósági és stabilitási probléma megoldására. A gyakran feltett kérdéseket és az azokra adott választ a következő linken lehet elérni: https://github.com/Chia-Network/chia-blockchain/wiki/Pooling-FAQ.


A jelen forráskódban számos dologot be lehet állítani. Ilyenek például a következők:


--> A pool elhagyásáig milyen hosszú időt kell várni


--> Hogyan történik a nehézség beállítása


--> Milyen díjakat számolnak fel, hogyan fizetik a blokklánc díjakat


--> Hogyan számolják a farmerek pontjait a kifizetések során (PPS, PPLNS, vagy más)


--> Hogyan és milyen gyakran kapnak a farmerek kifizetéseket (XCH, BTC, ETH vagy más valutában)


--> Milyen adatbázis van használva. Alapértelmezésben SQLite-ot használnak. A felhasználók használhatják a saját adatbázis implementációjukat. Ehhez az AbstractPoolStore-t kell implementálni és a pool_server.start_pool_server paramétert kell beállítani.


Vannak azonban olyan részek is, amiket nem lehet megváltoztatni. Ezeket a SPECIFICATION.md fájl tartalmazza és a legtöbb a hitelesítésre, a protokolra és az okos koinokat leíró singleton formátumokra vonatkozik.


A chia pool protokoll előnyös tulajdonságai


A chia pool protokol a biztonság és a decentralizáció jegyében fejlesztik. Nem támaszkodnak 3. féltől származó komponensekr, zárt forráskódú progromkra vagy olyan komponensekre, amelyekben meg kellene bízni.


--> A farmerek sosem tudnak lopni a pooltól dupla farmolással


--> Egy farmernek sosem lesz szüksége biztonsítékra ahhoz hogy csatlakozzon egy poolhoz. A singleton létrehozásához pár cent is elegendő.


--> A farmerek könnyedén és biztonságosan tudnak poolt váltani ha akarnak.


--> A farmer futtathat teljes csomópontot és ez növeli a decentralizációt.


--> A farmer bejelentkezhet egy másik számítógépen a pénztárcájába a 24 szó használatával és a poolhoz tartozó beállítások automatikusan alkalmazódnak. Nincs szükség egy központi szerverre.


Összesítő a pool protokolról


Amikor egy farmer nem poolon keresztül farmol, a teljes csomópontoktól (full node) 9 másodpercenként jeleket kap (signage point) és ezeket a jeleket elküldi az aratójának (harvester). Ezek a jelek tartalmazzák a sub_slot_iters adatot és a nehézséget. Ezeket az egész hálózatra jellemző paramétereket minden nap állítja a hálózat (4608 blokkonként).


A sub_slot_iters változó a VDF (verifiable delay function, ellenőrizhető késleltetésfüggvény) iterációk számát jelenti a hálózat leggyorsabb VDF-ja számára. Ezt a hálózat növeli, ha a leggyorsabb időúr (timelord) sebessége nő. A nehézség szintén változik az időurak sebességének változásával. A nehézség nő ha az időurak gyorsulnak mert a blokkok nagyobb frekvenciával jelennek meg a hálózatban. A nehézséget továbbá a hálózat összesített kapacitása is befolyásolja. Ez a két paraméter adja meg, hogy milyen nehéz egy blokkot megtalálni avagy milyen gyorsan tudunk proof-of-spacetime bizonyítást adni.


Mivel ma jelenleg megközelítőleg 18.75 másodperc kell ahhoz hogy a világban egy chia farmer megtaláljon egy blokkot nagyon kicsi a blokkok megtalálásának valószínűsége a jelenlegi nehézség és sub_slot_iters érték mellett. A pool protokol megvalósítása során a sub_slot_iters paramétert egy nagy konstans értékre állítják be. Ez 37600000000 és a nehézséget jelentősen lecsökkentik, így gyakrabban lehet majd hiteles blokkokat találni.


A farmerek egy vagy több pool-al kommunikálnak HTTPS protokolon keresztül és saját nehézséget állítanak be maguknak, minden egyes pool-ra külön. Így pedig az aratónak leküldik a pool-ra állított nehézséget és a sub_slot_iters paramétereket. Ezáltal a kis farmerek is gyakrabban találnak majd hiteles blokkokat, akár 10 percenként is. Ezeket a megoldásokat azonban nem fogják elküldeni a hálózat teljes csomópontjai számára hogy azokkal evolválják a blokkláncot. Ezeket csak a pool-nak küldik el. Ebből következően a teljes csomópontoknak nem kell látni minden farmer minden egyes megoldását és a hálózat több millió farmert is tud majd kezelni, ha feltesszük hogy a pool-ok rendesen skálázódnak. Mivel sok farmer csatlakozik egy pool-hoz, elegendő ha egy megtalál egy blokkot és ekkor az egész pool kap kifizetést, természetesen a beszolgáltatott tárhely arányában.


A pool feladata tehát, hogy rögzítse hogy a farmerek milyen töredék megoldásokat küldtek be nekik és ezeket kell súlyozni a nehézséggel. Bizonyos időközönként, mondjuk 3 naponta a pool kifizetéseket eszközöl a farmereknek annak alapján, hogy azok hogy töredék megoldást küldtek be nekik. A farmerek akiknek nagyobb a tárhelye több pénzt kapnak és itt lineáris a kapcsolat.


A farmerek a plotfájlok kialakítása során nem a pool_public_key-t használják, hanem egy puzzle hash-nek nevezett paramétert. Erre a szoftver a p2_singleton_puzzle_hash-ként hivatkozik, vagy másnéven ez a pool_contract_address. Ezek az értékek beleíródnak a plotfájlba és nincs lehetőség a megváltoztatásukra, mert a plot_id-ban ezek hash értéke tárolódik. A pool szerződés címe egy chialisp-ben megvalósított szerződés címe, amelyet singleton-nak hívnak. A farmereknek ilyen singleton-okat kell létrehozni a blokkláncon és ez fogja tartalmazni a pool-ra vonatkozó információt, avagy hogy a farmer mely pool-hoz csatlakozik. Egy plotfájl létrehozása során a singleton címe lesz felhasználva így a plotfájl örökre hozzá van kötve a singleton-hoz. Amikor egy farmer hiteles blokkot talál, a pool-nak járó jutalom, 1.75 chia a singleton címére utalódik, és amikor a kiutalják a jutalmat az egyenesen a pool címére megy.


A farmernek lehetősége van továbbá kifizetési utasítások megadására is, így a pool tudni fogja hova kell küldeni az időközönként megjelenő jutalmakat.


Töredék megoldások fogadása


A töredék megoldások olyan bizonyítások, amelyek egyéb más információval és vannak kiegészítve, tartalmazzák a farmer azonosításához szükséges adatokat és kielégítenik a minimális nehézségi követelményeket. A töredék megoldások szükségszerűen hiteles bizonyítások kell hogy legyenek egy jelzési pontban (signage point) és a blokklánc által kijelölt időablakban (28 másodperc) kell őket beküldeni.


A pool szerver feladata a töredék megoldások fogadása a felhasználótól, azok helyességének ellenőrzése az adott jelzési pontban és végezetül azok egy várakozási sorhoz való hozzáadását is a pool szerver végzi. Egy néhány perc elteltével a pool szerver kiveszi a töredék megoldást a sorból, ellenőrzi, hogy a hozzá tartozó jelzési pont még mindig szerepel-e a blokkláncban és ha mindent rendben talál, akkor hitelesenek minősíti a töredék megoldást és pontot ad a farmernek.


A jutalmak begyűjtése


A chia pool feladata a blokklánc folyamatos ellenőrzése és az azon pool jutalmak (1.75 chia) keresése, amelyek a farmerei p2_singleton_puzzle_hashes címére mennek. Ezek a jutalmak be vannak fagyasztva és csak a singleton-al együt lehet őket elkölteni. A hálózat bármely felhasználója el tudja költeni a singleton-t és a p2_singleton_puzzle_hash-hez tartozó koint, mindaddig amíg az blokk jutalmat tartalmaz és a protokolban meghatározott feltételek kielégültek. Ezen feltételek között van például az, hogy a singleton-nak pontosan egy gyereket kell szülnie, megegyző indító ID-val (launcher id) és hogy a coinbase által kijelölt pénzek a target_puzzle_hash-re kerülnek átutalásra.


A chia farmolásból származó jutalmak számítása


Bizonyos időközönként, mondjuk napi egyszer a chia pool végre hajtja a create_payment_loop-ban található kódrészletet. Ez először összeadja az összes megerősített befolyó egyenleget, amelyek egy bizonyos számú hitelesítésen átestek.


Ezek után, a pool a teljes összeget leosztja a pool-hoz csatlakozott felhasználók pontjaival és így kapja meg a mojo_per_point változó értékét (ebből még le kell vonni a pool díját és a blokklánc tranzakciós díjait). Ekkor létre kell hozni egy új koint minden egyes pool-hoz csatlakozott felhasználó részére (illetve a pool-nak is) és a kifizetések hozzáadásra kerülnek a pending_payments listához. Figyelembe kell venni azt is, hogy mivel a blokkok mérete véges, a tranzakció során korlátozni kell a tranzakicók számát. A protokol-ban létezik egy max_additions_per_transaction, amely segítségével ezt lehet állítani. Miután a kifizetéseket hozzáadták a listához a pool-hoz csatlakozott felhasználók pontjai lenullázódnak. Ezt a megvalósítást testre lehet szabni.


A jutalom felosztásának arányáról


Vegyük figyelembe, hogy a coinbase jutalom a chia network esetében 2 koin-ra bomlik. A farmer koinjára és a pool koinjára. A farmernek járó koin (egy nyolcad) a puzzle hash címre utalódik és ez a farmer privát kulcsával kerül aláírásra, míg a pool hét nyolcad részt kap. A felhasználót terhelő blokklánc tranzakciós díjak már szerepelnek a farmernek kiutalásra kerülő jutalom részesedésben. Az 1/8-ad 7/8/-ados felosztást a chia network fejlesztői azért vezetik be, hogy az olyan jellegű támadásoktól védjék a rendszeret, amelynek során egy pool megpróbálja megsemmisíteni egy másikat úgy, hogy töredék megoldásokat farmol, azonban nem küldi be a kibányászott blokkokat (selfish mining, lásd: Miért alapvetően rossz a Bitcoin?).


Nehézség


A nehézség állításával a pool szerver képes szabályozni hogy hány töredék megoldás szeretne kapni a farmerektől. A nehézséget külön be lehet állítani minden egyes farmerre. Egy épeszű beállítás lehet a 300 töredék megoldás per nap. Ezzel biztosítva van a folytonos kommunikáció és az alacsony szórás. Ha például a nehézség 1-re van állítva, akkor k=32-es plotok esetében megközelítőleg 10 töredék megoldás kerül elküldésre egy nap alatt. A protokol első verziója minimálisan ezt a beállítást követeli meg, azonban a pool-nak lehetősége van ennek növelésére ha emelni szeretné a hatékonyságot. Amikor a pool meg szeretné állapítani, hogy a beküldött töredék megoldás elég jó minőségű-e és a farmer kaphat-e pontot, akkor a sub_slot_iters=37600000000 beállítást kell használni. Abban az esetben, ha a farmer olyan bizonyítást küld el a pool-nak, amely nem elégíti ki a nehézségi feltételt, a pool-nak válaszolnia kell a helyes current_difficulty értékkel.


Pontok számítása


X nehézségi érték mellett, egy töredék megoldás beküldéséért X pontot kell adni, ebből következik, hogy a pontok lineárisan skálázódnak a nehézséggel. Mondjuk 100TiB tárhely egy nap körülbelül 10.000 pontot kell hogy termeljen, attól függetlenül, hogy a nehézség értéke 100-e vagy 200. Nem szabad számítani annak, hogy milyen nehézséget állítanak be a farmernak, addig amíg az konzisztens módon küldi be a töredék megoldásokat. A protokol leírása nem követeli meg, hogy a farmereket a pontokkal egyenesen arányos mértékben fizessék ki, de a kifizetési részleteket egyértelműen közölni kell a farmerekkel, a pontoknak elfogadhatóaknak kell lenni és az összegyűjtött pontokat jelezi kell.


A nehézség beállítása


Ez egy egyszerű algoritmus a nehézség beállítására, amelyet a pool használhat, de lehetőség van ennek megváltoztatására is. A farmer elküldheti a saját ajánlott nehézségi paraméterét (suggested_difficulty) és a pool eldöntheti hogy változtat-e ezen. Csak a legújabb authentication_public_key-t szabad a nehézség és a kifizetési adatok beállítása során elfogadni. A kezdeti referencia kliens és a pool nem használja a suggested_difficulty paramétert.


Egy adott indító ID-hez (launcher ID) legalább egy hiteles töredék megoldást meg kell szerezni


Ha eltelt több mint 3 óra, osszuk el a nehézséget 5-el


Ha több mint 45 perc telt el, de kevesebb mint 6 óra, akkor 1.5-el osszuk a nehézséget


Ha pedig kevesebb mint 45 perc telt el, akkor


Kevesebb mint 300 töredék megoldást kaptunk, ne változzon a nehézség


Máskülönben szorozzuk a nehézséget (24 * 3600 / ( a 300 töredék megérkezéséhez szükséges idő))


6 óra elegendő az olyan esetek kezelésére, amikor egy farmer kapacitása jelentősen leesik. A 45 perc hasonlóan működik, a kevésbé szélsőséges esetekben. Végezetül pedig a 45 percnél rövidebb ág hivatott kezelni az olyan felhasználókat, amelyek tárhelye fokozatosan nő vagy egy picit csökken. Így a napi 300 töredék megoldás van megcélozva, de ezt lehet állítani teljesítmény és felhasználói kívánalmak függvényében.


Kifizetések egy chia pool-ból


Figyeljük meg, hogy a kifizetésekhez szükséges adatok elküldésre kerülnek a töredék megoldásokkal együtt. A felhasználó módjában áll a kifizetések célállomásának megválasztása és ennek nem is kell feltétlenül chia pénztárca címnek lennie. A pool csak és kizárólag a legújabb hitelesítési kulccsal és launcher_id-val szabad hogy frissítse a kifizetési információkat a hiteles töredék megoldások fogadásakor.


Chia pool telepítése és futtatása


Ha valaki chia pool-t szeretne futtatni, akkor a következőket egy éles chia blokklánc kliens futtatása mellett kell végrehajtania.


Először töltsük le a már jól ismert chia-blockchain klienst és telepítsük fel. A következőekben töltsük le a chia pool kódot a Github-ról: https://github.com/Chia-Network/pool-reference.


git clone https://github.com/Chia-Network/pool-reference

Ha a teszthálózathoz szeretnél csatlakozni, akkor használd a következő parancsot: export CHIA_ROOT=~/.chia/testnet9. Itt be tudsz állítani más teszthálózatot is. Majd futtasd a chia configure -t true parancsot. Itt használhatod közvetlenül a pools.testnet9 ágat, bár ezt a jövőben el fogják távolítani a fejlesztők.


Hozz létre három kulcsot. Egyet a blokkláncról érkező blokk jutalmak fogadására, egyet a pool díjak fogadására és egyet pedig a teszt felhasználód részére.


Változtas meg a wallet_fingerprint és wallet_id beállításokat a config.yaml fájlban. Itt használd az első kulcshoz tartozó címeket. Ezeket a chia wallet show paranccsal tudod előszedni.


Add ki a chia keys show minden egyes létrehozott címhez és config.yaml fájl default_target_address és pool_fee_address paramétereit állítsd be ezek függvényében.


Változtasd meg a pool_url paramétert a config.yaml fájlban, úgy hogy az a külső IP címed vagy hostneved felé mutasson. Ez pontosan azon cím kell hogy legyen, amelyet a felhasználók fognak beírni saját farmjaikon és https://-el kell hogy kezdődjön.


Indítsd el a chia csomópontot a chia start farmer parancs segítségével és jelentkezz be egy másik pénztárcába (nem abba a kettőbe, amiről eddig szó volt). Itt most erre farmer kulcsként fogok hivatkozni. Szinkronizálj egy pénztárcát a teszthálózaton ehhez a farmer kulcshoz. Ekkor bejelentkezhetsz a többi tárcába is és elkezdheted a szinkronizációt.


Hozz létre egy virtuális környezetet, ami különbözik a chia blokkláncétól és indítsd el a chia pool szervert a következő parancsok kiadásával:


cd pool-reference

python3 -m venv ./venv

source ./venv/bin/activate

pip install ../chia-blockchain/

sudo CHIA_ROOT="/your/home/dir/.chia/testnet9" ./venv/bin/python -m pool


Ha probléma nélkül elindult, akkor a következő kimenetet kell látnod:


INFO:root:Logging in: {'fingerprint': 2164248527, 'success': True} INFO:root:Obtaining balance: {'confirmed_wallet_balance': 0, 'max_send_amount': 0, 'pending_change': 0, 'pending_coin_removal_count': 0, 'spendable_balance': 0, 'unconfirmed_wallet_balance': 0, 'unspent_coin_count': 0, 'wallet_id': 1}

Hozz létre egy pool nft-t a farmer kulcsos pénztárcából a következő parancs segítségével: chia plotnft create -s pool -u https://127.0.0.1:80. A hoszt és port adatok megadása során használd a saját adataidat. Okézd le és várd meg amíg hitelesítik a tranzakciót. Figyelj rá, hogy az URL-ben ne legyen hiba!


Ekkor használd a chia plotnft show hogy megbizonyosodj arról, hogy a plot nft létrejött. Ezek után elkezdhetsz plotolni ezen plotnft-re. Ezt a -c kapcsoló segítségével állíthatod be, amikor a chia plots create paranccsal plotolsz. A -c kapcsolót a P2 singleton címre kell állítani és ezt a chia plotnft show paranccsal tudod előszedni. Érdemes k=25-el kezdeni és leellenőrizni, hogy a töredék megoldások beküldésre kerülnek-e a farmer felől a pool szerver felé. Ha a pool szerver rendesen működik, akkor a következőt kell látnod:


INFO:root:Returning {'new_difficulty': 1963211364}, time: 0.017535686492919922 singleton: 0x1f8dab79a614a82f9834c8f395f5fe195ae020807169b71a10218b9788a7a573


Szerző: LB



Figyelem: A bejegyzésben található információk tartalmazhatnak hibát. A szerző az abból eredő károkért nem vállal felelősséget!



Hozzászólások (0)


További hírek