CryptoKitties'i uurimine - 1. osa: andmete ekstraheerimine

Allikas: https://www.cryptokitties.co/kitty/101

Kui loete seda, olete ilmselt kuulnud mängust, mis on viimase paari kuu jooksul kõigi tähelepanu juhtinud Ethereumi võrgus: CryptoKitties!

Lühidalt öeldes koosneb mäng virtuaalsete kasside kogumisest. Kassid loovad mängu mängijad, kes saavad uue kassi saamiseks aretada kaks kassi. Igal kassil on oma geneetiline järjestus, mis määrab nende füüsilised omadused. Nende genoom on vanemate geenide funktsioon pluss teatav juhuslikkus. Lisaks aretusele saab mängu taga tegutsev ettevõte Axiom Zen luua kuni 50 000 etteantud omadustega kassi. Seal on turg kasside ostmiseks ja müümiseks ning veel üks turg kasside rentimiseks. Mängu kohta saate rohkem lugeda siit.

Block Science on detsentraliseeritud majandussüsteemide kavandamisele ja hindamisele spetsialiseerunud tehnoloogiauuringute ja -analüüsi ettevõte. CryptoKitties majanduse aspektide analüüsimine tundus olevat suurepärane võimalus täiustada meie andmete ekstraheerimise tööriistu, saades samal ajal oma käed reaalainete andmete jaoks elavas (ja elavas!) Detsentraliseeritud rakenduses.

See ajaveebi postitus on jagatud kaheks osaks:

  • 1. osa (see postitus) hõlmab tehnilisi aspekte, mis on seotud andmete ekstraheerimise ja teisendamisega Ethereumi plokiahelast.
  • 2. osa sisaldab mängude andmete tegelikku analüüsi.

Andmete kaevandamine Ethereumi plokiahelast

Ehkki kõik, mis kunagi Ethereumi võrgus juhtus, salvestatakse plokiahelas, pole nende bittide muutmine tähenduslikeks andmeteks alati lihtne. Lihtne on hankida tehingute andmeid, väites, et antud plokkkonto A saatis kontole B mingi eetri (ETH) ja määras selle tehingu jaoks teatud gaasihinna. Kui töötame aga lepingutele saadetud tehingutega, on plokiahela andmete dekodeerimine ETL-i rakendamine mitmest fikseeritud laiusega tekstifailist, mille vorminguid kirjeldatakse ainult neid loonud tarkvara lähtekoodis.

Nutikate lepingute funktsioone kutsuvad tehingud

Võtke näiteks tehing, mis saadeti lepingule 0xb1690c08e213a35ed9bab7b318de14420fb57d8c ja mille andmeväljal on järgmine sisu

0x454a2ab3000000000000000000000000000000000000000000000000000000000000000871adad

Mida see teeb?

Andmevälja esimene osa (0x454a2ab3) osutab nutilepingus sisalduvale funktsioonile, mida tehing kutsub. Need on funktsiooni allkirja räsi esimesed neli baiti, mis on määratletud kui funktsiooni nimi, millele järgnevad selle parameetrite andmetüübid.

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

Ülejäänud baitid on funktsiooni parameetrite väärtused. Selle kohta saate üksikasjalikult lugeda siit.

Isegi kui teame neid 4 baiti, kuidas me saame öelda, millist funktsiooni nimetatakse või mitu parameetrit sellel on? Sel konkreetsel juhul teame, et leping 0xb1690c… on CryptoKitties oksjoni nutileping - kasside ostmise ja müümise turg. Ja kuna selle lähtekood on avalikustatud, teame, et sellel on funktsioon nimega pakkumine

/// Pakkumised avatud oksjonil, oksjoni lõpetamine ja
/// NFT omandiõiguse üleandmine, kui tarnitakse piisavalt eetrit.
/// param _tokenID: žetooni ID, mille alusel pakkumist teha.
funktsiooni pakkumine (uint256 _tokenId)

Kui arvutame pakkumisfunktsiooni allkirja räsi, näeme, et neli esimest baiti vastavad täpselt tehinguandmetele.

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

Ja kuna funktsioon võtab ainult ühe argumendi, võime öelda, et kõik, mis järgneb neile esimesele neljale baitile tehinguandmetes, on see parameeter. Teisisõnu tehakse tehingu pakkumine kassi numbrile 0x871ad (553389).

Nutikad lepingud, mis logivad teavet

Nutikate lepingute puhul on tavaline, et nad logivad teavet nende täitmise ajal. Lepinguga salvestatud logisid saab hankida, helistades JSON RPC API eth_getlogs meetodile. Nagu tehingute puhul, mis kutsuvad lepingulisi funktsioone, peame selle API tagastatud andmete dekodeerimiseks teadma lepingu lähtekoodi. Mida tähendab näiteks järgmiste andmetega logi?

blockNumber: 0x51968f
teemasid: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] andmed: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Logid registreeritakse siis, kui leping käivitab sündmuse. Teemade massiivi esimene element (millel meie näites on ainult üks element) on sündmuse allkirja räsi. CryptoKitties'i puhul registreeritakse logid kassi rasestumise ja näiteks kassi sündimise ajal.

/// Rase sündmus vallandatakse, kui kaks kassi on edukalt siginud
/// ja raseduse taimer algab matroonil.
sündmus rase (aadressi omanik, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// Sünnisündmus vallandatakse alati, kui uus kassipoeg tuleb
/// olemasolu. See hõlmab ilmselgelt kassi loomise aega
/// abil giveBirthi meetod, kuid seda nimetatakse ka siis, kui
/// luuakse uus gen0 kass.
sündmuse sünd (aadressi omanik, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 geenid);

Vaadake, kuidas sündiündmuse allkirja räsi vastab meie näites sisalduva logi väärtusele

keccak256 („Sünd (aadress, uint256, uint256, uint256, uint256)”) = 0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5

Siiani teame, et plokis number 51968F (5346959) sündis krüptokitty! Järgmine samm meie dekodeerimisprotsessis on andmevälja jagamine sündi viie parameetri järgi. Esimene parameeter on Ethereumi aadress, mis on 160 bitti pikk, kuid on kodeeritud 256 bitti (aadressid vasakule lisatakse nulli). Muud parameetrid on 256-bitised täisarvud. Seetõttu on andmeväli jagatud viieks osaks, millest igaüks koosneb 256-bitisest (64 kuueteistkümnendsümbolist).

omanik: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
kittyId:
00000000000000000000000000000000000000000000000000000000000000009fac1
matronId:
00000000000000000000000000000000000000000000000000000000000000009f80e
sireId:
000000000000000000000000000000000000000000000000000000000000000089572
geenid:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Vaadake, mida mõtlesin „ETL-i rakendamisel mitmest fikseeritud laiusega tekstifailist, mille vormingud on kirjeldatud ainult neid loonud tarkvara lähtekoodis“? :-)

Liikuge edasi 2. osasse, kus jagame huvitavaid fakte, mida CryptoKitties mängu andmete analüüsimisel leidsime!

Eriline tänu Block Science meeskonnale uurimistöö, ülevaate ja ülevaate eest.