CryptoKitties felfedezése - 1. rész: Adatok kinyerése

Forrás: https://www.cryptokitties.co/kitty/101

Ha ezt olvassa, valószínűleg hallott már a játékról, amely az elmúlt néhány hónapban mindenki figyelmét felhívta az Ethereum hálózatra: CryptoKitties!

Röviden: a játék virtuális macskák gyűjtéséből áll. A macskákat a játék játékosai készítik, akik két macskát tenyészthetnek, hogy újat hozzanak létre. Minden macskának megvan a saját genetikai szekvenciája, amely meghatározza fizikai tulajdonságaikat. Genomjuk a szüleik génjeinek függvénye, plusz némi véletlenszerűség. A tenyésztésen kívül akár 50 000 előre meghatározott tulajdonságokkal rendelkező macskát is létrehozhat az Axiom Zen, a játék mögött álló cég. Van egy piac macskák vételére és eladására, valamint egy másik macskák tenyésztési célú bérbeadására. A játékról itt olvashat bővebben.

A Block Science egy decentralizált gazdasági rendszerek tervezésére és értékelésére szakosodott technológiai kutató és elemző cég. A CryptoKitties gazdaság szempontjainak elemzése nagyszerű lehetőségnek tűnt az adatkitermelő eszközök fejlesztésében, miközben kezünkbe vett néhány valós adatot élő (és élénk!) Decentralizált alkalmazásból.

Ez a blogbejegyzés két részre oszlik:

  • Az 1. rész (ez a bejegyzés) az Ethereum blokkláncból származó adatok kinyerésével és átalakításával kapcsolatos technikai szempontokat tartalmazza.
  • A 2. rész néhány játék adatainak tényleges elemzését tartalmazza.

Adatok kinyerése az Ethereum blokkláncból

Annak ellenére, hogy minden, ami az Ethereum hálózaton történt, rögzítésre kerül a blokkláncon, ezeknek a biteknek az értelmes adatokká alakítása nem mindig egyszerű. Könnyű kivonni a tranzakciós adatokat, kijelentve, hogy egy adott blokkszámlában az A valamilyen étert (ETH) küldött a B számlához, és meghatározza egy bizonyos gázárat a feldolgozandó tranzakcióhoz. Amikor azonban a szerződésekhez küldött tranzakciókon dolgozunk, a blokklánc-adatok dekódolása egy ETL megvalósításához hasonlít több rögzített szélességű szövegfájlból, amelynek formátumait csak a létrehozó szoftver forráskódjában írják le.

Az intelligens szerződésekben funkciókat felhívó tranzakciók

Vegyük például a 0xb1690c08e213a35ed9bab7b318de14420fb57d8c szerződésre küldött tranzakciót, az alábbi tartalommal az adatmezőben

0x454a2ab300000000000000000000000000000000000000000000000000000000000871ad

Mit csinal?

Az adatmező első része (0x454a2ab3) az intelligens szerződés belső funkciójára utal, amelyet az ügylet hív. Ez a függvény aláírás kivonatolásának első négy bájtja, amelyet a függvény nevének és a paramétereinek adattípusai követnek.

keccak256 ( „ (, <...>, )”)

A fennmaradó bájt a függvény paramétereinek értéke. Részletesen itt olvashat.

Még ha megismertük a 4 bájtot, hogyan tudnánk megmondani, hogy melyik funkciót hívják, vagy hány paraméter rendelkezik? Ebben a konkrét esetben tudjuk, hogy a 0xb1690c szerződés a CryptoKitties aukciós intelligens szerződés - a macskák vételi és eladási piaca. És mivel a forráskódját nyilvánosságra hozták, tudjuk, hogy az ajánlat úgynevezett funkcióval rendelkezik

/// Nyílt aukcióra vonatkozó ajánlatok, az aukció befejezése és
/// az NFT tulajdonjogának átruházása, ha elég éter van.
/// param _tokenID: A token azonosítója, amelyen licitálni lehet.
függvény ajánlat (uint256 _tokenId)

Ha kiszámoljuk az ajánlatfüggvény-aláírás hash-ját, láthatjuk, hogy az első négy bájt pontosan azok, amelyek a tranzakciós adatokban vannak.

keccak256 (“bid (uint256)”) = 454a2ab3c602fd9…

Mivel a függvénynek csak egy érve van, elmondhatjuk, hogy a tranzakcióadatokban az első négy bájtot követő minden az a paraméter. Más szavakkal, a tranzakció a 0x871ad (553389) macskaszámra vonatkozik.

Intelligens szerződések, amelyek naplózási információkat tartalmaznak

Az intelligens szerződéseknél gyakori, hogy naplózza az információkat a végrehajtásuk során. A szerződés által rögzített naplók a JSON RPC API eth_getlogs módszer meghívásával szerezhetők be. Mint ahogy a tranzakciók esetében is hívják a szerződés funkcióit, ismernünk kell a szerződés forráskódját az ezen API által visszaadott adatok dekódolása érdekében. Például, mit jelent a következő adatokkal rendelkező napló?

blockNumber: 0x51968f
téma: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] adatok: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

A naplókat akkor veszik fel, amikor egy szerződés eseményt vált ki. A tématömb első eleme (amelynek csak egy elem van a példánkban) az esemény aláírása. A CryptoKitties esetében a naplókat rögzítik, amikor egy macska teherbe esik, és amikor például egy macska megszületett.

/// A várandós esemény akkor kerül ki, amikor két macska sikeresen tenyészt
/// és a terhesség-időzítő elkezdődik a hősnek.
esemény terhes (címtulajdonos, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// A születési esemény akkor kerül rúgásra, amikor új cica jön be
/// létezés. Ez nyilvánvalóan magában foglalja a macska létrehozásának idejét is
/// a giveBirth módszerrel, de akkor is hívják, amikor
/// létrejön egy új gen0 macska.
esemény születése (címtulajdonos, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 gének);

Nézze meg, hogy a születési esemény aláírása miként felel meg a példa naplójában szereplő értéknek

keccak256 („Születési idő (cím, uint256, uint256, uint256, uint256)”) = 0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5

Eddig tudjuk, hogy az 51968F (5346959) számú rejtjelző született! A dekódolási folyamatunk következő lépése az adatmező felosztása a születési esemény öt paramétere szerint. Az első paraméter egy Ethereum cím, amely 160 bit hosszú, de 256 bittel van kódolva (a cím bal oldalán nullák vannak hozzáadva). A többi paraméter 256 bites egész szám. Az adatmező tehát 5 részre oszlik, mindegyik 256 bites (64 hexadecimális karakter).

tulajdonos: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
kittyId:
000000000000000000000000000000000000000000000000000000000009fac1
matronId:
000000000000000000000000000000000000000000000000000000000009f80e
sireId:
0000000000000000000000000000000000000000000000000000000000089572
gének:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Lásd, mit értettem egy „ETL megvalósítása több rögzített szélességű szövegfájlból, amelyek formátumait csak a létrehozó szoftver forráskódja írja le” kifejezés alatt? :-)

Folytassa a 2. részre, ahol megosztunk néhány érdekes tényt, amelyekkel a CryptoKitties játék adatainak elemzése során találkoztunk!

Külön köszönet a Block Science csapatnak a kutatásért, betekintésért és áttekintésért.