„CryptoKitties“ tyrinėjimas. 1 dalis. Duomenų gavimas

Šaltinis: https://www.cryptokitties.co/kitty/101

Jei skaitote tai, tikriausiai girdėjote apie žaidimą, kuris pastaruosius keletą mėnesių patraukė visų dėmesį „Ethereum“ tinkle: „CryptoKitties“!

Trumpai tariant, žaidimą sudaro virtualių kačių rinkimas. Katės yra sukurtos žaidimo žaidėjų, kurie gali užauginti dvi kates, kad būtų sukurta nauja. Kiekviena katė turi savo genetinę seką, kuri lemia jų fizinius požymius. Jų genomas priklauso nuo tėvų genų ir pliusų. Be veisimo, „Axiom Zen“, už žaidimą atsakinga įmonė, gali sukurti iki 50 000 kačių, turinčių iš anksto apibrėžtų savybių. Yra kačių pirkimo ir pardavimo rinka, taip pat kačių veisimo tikslais „išsinuomoti“. Daugiau apie žaidimą galite perskaityti čia.

„Block Science“ yra technologijų tyrimų ir analizės įmonė, kurios specializacija yra decentralizuotų ekonominių sistemų projektavimas ir vertinimas. „CryptoKitties“ ekonomikos aspektų analizė atrodė kaip puiki proga patobulinti mūsų duomenų gavimo įrankius, tuo pačiu metu pasitelkiant kai kuriuos realaus pasaulio duomenis iš tiesioginės (ir gyvos!) Decentralizuotos programos.

Šis tinklaraščio įrašas buvo padalytas į dvi dalis:

  • 1 dalis (šis įrašas) apima techninius aspektus, susijusius su duomenų gavimu ir transformavimu iš „Ethereum“ grandinės.
  • 2 dalyje pateikiama faktinė kai kurių žaidimų duomenų analizė.

Duomenų gavimas iš „Ethereum Blockchain“

Nors viskas, kas kada nors nutiko „Ethereum“ tinkle, yra įrašoma blokinėje grandinėje, tuos bitus paversti reikšmingais duomenimis ne visada yra paprasta. Paprasta išgauti sandorio duomenis, nurodant, kad tam tikroje bloko sąskaitoje A atsiuntė kažkokį eterį (ETH) į sąskaitą B ir nustatė tam tikrą operacijos, kurią reikia apdoroti, kainą. Tačiau kai dirbame su sutartimis siunčiamomis operacijomis, „blockchain“ duomenų dekodavimas yra panašus į ETL diegimą iš kelių fiksuoto pločio tekstinių failų, kurių formatai aprašomi tik juos sukūrusios programinės įrangos šaltinio kode.

Sandoriai, paskambinantys išmaniųjų sutarčių funkcijoms

Paimkite, pavyzdžiui, operaciją, išsiųstą į sutartį 0xb1690c08e213a35ed9bab7b318de14420fb57d8c, su tokiu duomenų lauko turiniu

0x454a2ab3000000000000000000000000000000000000000000000000000000000000000871

Ką tai daro?

Pirmoji duomenų lauko dalis (0x454a2ab3) nurodo funkciją išmaniojoje sutartyje, kurią vadina operacija. Tai yra pirmieji keturi funkcijos parašo maišos baitai, kurie yra apibūdinami kaip funkcijos pavadinimas, po kurio eina parametrų duomenų tipai.

keccak256 („ (, )“)

Likę baitai yra funkcijos parametrų vertės. Apie tai galite išsamiai perskaityti čia.

Netgi žinodami tuos 4 baitus, kaip mes galime pasakyti, kokia funkcija vadinama, ar kiek parametrų ji turi? Šiuo konkrečiu atveju mes žinome, kad sutartis 0xb1690c… yra „CryptoKitties“ aukciono išmanioji sutartis - kačių pirkimo ir pardavimo rinka. Kadangi jo pirminis kodas buvo paviešintas, mes žinome, kad jis turi funkciją, vadinamą kainos pasiūlymas

/// Pasiūlymai atvirame aukcione, užbaigiant aukcioną ir
/// perduodant NFT nuosavybės teises, jei tiekiama pakankamai eterio.
/// param _tokenID: prieigos rakto ID.
funkcijos kainos pasiūlymas („uint256 _tokenId“)

Jei apskaičiuotume kainos pasiūlymo funkcijos parašo maišos duomenis, pamatytume, kad pirmieji keturi baitai yra tiksliai tokie, kokie yra operacijos duomenyse.

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

Kadangi funkcija užima tik vieną argumentą, galime pasakyti, kad viskas, kas seka tuos pirmuosius keturis baitus operacijos duomenyse, yra tas parametras. Kitaip tariant, sandoris siūlo kainą dėl katės numerio 0x871ad (553389).

Išmaniosios sutartys, kurios registruoja informaciją

Išmaniosioms sutartims įprasta registruoti informaciją jų vykdymo metu. Žurnalus, įrašytus pagal sutartį, galima gauti paskambinus JSON RPC API eth_getlogs metodu. Kaip ir operacijose, kurios iškviečia sutarties funkcijas, mes turime žinoti sutarties šaltinį, kad iššifruotume šios API grąžintus duomenis. Pvz., Ką reiškia žurnalas su šiais duomenimis?

„blockNumber“: 0x51968f
Temos: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] duomenys: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Žurnalai registruojami, kai sutartis sukelia įvykį. Pirmasis temų masyvo elementas (kuris mūsų pavyzdyje turi tik vieną elementą) yra įvykio parašo maiša. „CryptoKitties“ atveju, žurnalai registruojami, kai katė pastoja ir, pavyzdžiui, kai gimsta katė.

/// Nėščiosios įvykis atleidžiamas, kai sėkmingai veisiasi dvi katės
/// ir matronai prasideda nėštumo laikmatis.
įvykis nėščia (adreso savininkas, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// Gimimo įvykis atleidžiamas, kai tik ateina naujas kačiukas
/// egzistavimas. Akivaizdu, kad tai yra bet koks katės sukūrimo laikas
/// naudojant giveBirth metodą, tačiau jis taip pat vadinamas kada
/// sukuriama nauja gen0 katė.
įvykis Gimimas (adreso savininkas, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genai);

Pažiūrėkite, kaip gimimo įvykio parašo maiša atitinka reikšmę žurnalo pavyzdyje

keccak256 („Gimimas (adresas, uint256, uint256, uint256, uint256)“) = 0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5

Kol kas mes žinome, kad bloke Nr. 51968F (5346959) gimė kriptovaliutos! Kitas mūsų dekodavimo proceso žingsnis yra duomenų lauko padalijimas pagal penkis gimimo įvykio parametrus. Pirmasis parametras yra „Ethereum“ adresas, kuris yra 160 bitų ilgio, tačiau užkoduotas 256 bitų (nuliai pridedami adreso kairėje). Kiti parametrai yra 256 bitų sveikieji skaičiai. Todėl duomenų laukas yra padalintas į 5 dalis, kiekvienoje iš jų yra 256 bitų (64 šešioliktainių ženklų).

savininkas: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
kittyId:
0000000000000000000000000000000000000000000000000000000000000009fac1
matronId:
0000000000000000000000000000000000000000000000000000000000000009f80e
sireId:
00000000000000000000000000000000000000000000000000000000000000089572
genai:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Pažiūrėkite, ką turėjau omenyje „įdiegti ETL iš kelių fiksuoto pločio tekstinių failų, kurių formatai aprašyti tik juos sukūrusios programinės įrangos šaltinio kode“? :-)

Pereikite prie 2 dalies, kur pasidalysime įdomiais faktais, su kuriais susidūrėme analizuodami „CryptoKitties“ žaidimo duomenis!

Ypatinga padėka „Block Science“ komandai už tyrimus, įžvalgas ir apžvalgą.