CryptoKitties-laitteiden tutkiminen - Osa 1: Tietojen poiminta

Lähde: https://www.cryptokitties.co/kitty/101

Jos luet tätä, olet todennäköisesti kuullut pelistä, joka on kiinnittänyt kaikkien huomion Ethereum-verkossa viime kuukausina: CryptoKitties!

Lyhyesti sanottuna, peli koostuu virtuaalisten kissojen keräämisestä. Pelin pelaajat ovat luoneet kissat, jotka voivat kasvattaa kahta kissaa uuden tuottamaan. Jokaisella kissalla on oma geneettinen sekvenssi, joka määrittelee heidän fyysiset ominaisuutensa. Heidän genominsa on vanhempiensa geenien funktio plus joitain satunnaisuuksia. Jalostamisen lisäksi Axiom Zen, pelin takana oleva yritys, voi luoda jopa 50 000 kissaa, joilla on ennalta määritetyt ominaisuudet. On olemassa markkinoita kissojen ostamiselle ja myymiselle, ja toinen markkinoille kissojen “vuokraamiseksi” jalostustarkoituksiin. Voit lukea lisää pelistä täältä.

Block Science on hajautettujen talousjärjestelmien suunnitteluun ja arviointiin erikoistunut teknologiatutkimus- ja analytiikkayritys. CryptoKitties-talouden näkökohtien analysointi näytti loistavalta tilaisuudesta parantaa tiedonkeruutyökalujamme samalla saada käsiimme joitain reaalimaailman tietoja elävästä (ja vilkkaasta!) Hajautetusta sovelluksesta.

Tämä blogiviesti on jaettu kahteen osaan:

  • Osa 1 (tämä viesti) kattaa tekniset näkökohdat, jotka liittyvät datan purkamiseen ja muuntamiseen Ethereumin lohkoketjusta.
  • Osa 2 sisältää joidenkin pelitietojen todellisen analyysin.

Tietojen purkaminen Ethereum-lohkoketjusta

Vaikka kaikki, mitä koskaan on tapahtunut Ethereum-verkossa, tallennetaan lohkoketjuun, näiden bittien muuttaminen merkitykselliseksi tiedoksi ei ole aina suoraviivaista. Tapahtumadatan purkaminen on helppoa sanomalla, että tietyssä lohkotilissä A lähetti jonkin eetterin (ETH) tilille B ja asetti tietyn kaasun hinnan käsiteltävälle tapahtumalle. Kun työskentelemme sopimuksiin lähetettyjen tapahtumien kanssa, lohkoketjutietojen dekoodaaminen on kuitenkin samanlainen ETL: n toteuttamiseen useista kiinteän leveyden tekstitiedostoista, joiden muodot on kuvattu vain niitä luoneen ohjelmiston lähdekoodissa.

Tapahtumat, jotka vaativat toimintoja älykkäissä sopimuksissa

Otetaan esimerkiksi sopimukselle 0xb1690c08e213a35ed9bab7b318de14420fb57d8c lähetetty tapahtuma, jolla on seuraava tietokentän sisältö

0x454a2ab300000000000000000000000000000000000000000000000000000000000871ad

Mitä se tekee?

Tietokentän ensimmäinen osa (0x454a2ab3) viittaa älykkäässä sopimuksessa olevaan toimintoon, jota transaktio kutsuu. Nämä ovat ensimmäiset neljä tavua funktiosignaalin hajautuksessa, joka määritetään funktion nimellä ja sen parametrien tietotyypeillä.

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

Loput tavut ovat funktioparametrien arvoja. Voit lukea siitä yksityiskohtaisesti täältä.

Vaikka tiedämme nämä 4 tavua, kuinka voimme kertoa mitä funktiota kutsutaan tai kuinka monta parametria sillä on? Tässä erityistapauksessa tiedämme, että sopimus 0xb1690c… on CryptoKitties-huutokaupan älykäs sopimus - kissojen osto- ja myyntimarkkinat. Ja koska sen lähdekoodi on julkistettu, tiedämme, että sillä on toiminto nimeltään tarjous

/// Tarjoukset avoimeen huutokauppaan, huutokaupan loppuun saattaminen ja
/// NFT: n omistusoikeuden siirtäminen, jos eetteriä on riittävästi.
/// param _tokenID: Tunnuksen tunnus, johon hintatarjous tehdään.
toimintotarjous (uint256 _tokenId)

Jos laskemme tarjousfunktiosignaalin hash, voimme nähdä, että neljä ensimmäistä tavua ovat täsmälleen ne, jotka ovat tapahtumadatassa.

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

Ja koska funktio ottaa vain yhden argumentin, voimme kertoa, että kaikki tapahtumatietojen näiden neljän ensimmäisen tavun jälkeen on kyseinen parametri. Toisin sanoen kauppa tarjoaa tarjouksia kissanumerolle 0x871ad (553389).

Älykkäät sopimukset, jotka kirjaavat tiedot

Älykkäillä sopimuksilla on tavallista lokitietoa niiden toteuttamisen aikana. Sopimuksen mukaiset lokit voidaan saada soittamalla JSON RPC API eth_getlogs -menetelmään. Kuten tapauksissa, joissa soitetaan sopimustoimintoja, meidän on tiedettävä sopimuksen lähdekoodi tämän sovellusliittymän palauttamien tietojen dekoodaamiseksi. Mitä esimerkiksi seuraavien tietojen loki tarkoittaa?

blockNumber: 0x51968f
aiheet: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] tiedot: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Lokit kirjataan, kun sopimus laukaisee tapahtuman. Aihematriisin ensimmäinen elementti (jolla on vain yksi elementti esimerkissämme) on tapahtuman allekirjoituksen hajautus. CryptoKitties: n tapauksessa lokit kirjataan, kun kissa tulee raskaaksi ja kun esimerkiksi kissa syntyy.

/// Raskaustapahtuma vapautetaan, kun kaksi kissaa kasvattaa onnistuneesti
/// ja raskausajastin alkaa matronille.
tapahtuma raskaana (osoitteen omistaja, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// Syntymätapahtuma potkut, kun uusi kissanpentu tulee
/// olemassaolo. Tähän sisältyy selvästi milloin kissa luodaan
/// giveBirth-menetelmällä, mutta sitä kutsutaan myös kun
/// Uusi gen0-kissa luodaan.
tapahtuman syntymä (osoitteen omistaja, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 geenit);

Katso, kuinka syntymätapahtuman allekirjoituksen tiiviste vastaa esimerkissä olevan lokin arvoa

keccak256 (”Syntymä (osoite, uint256, uint256, uint256, uint256)”) = 0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5

Toistaiseksi tiedämme, että lohkossa numero 51968F (5346959) syntyi kryptokitty! Seuraava vaihe dekoodausprosessissamme on jakaa tietokenttä syntymätapahtuman viiden parametrin mukaan. Ensimmäinen parametri on Ethereum-osoite, joka on 160 bittiä pitkä, mutta koodataan 256 bitillä (nollat ​​lisätään osoitteen vasemmalle puolelle). Muut parametrit ovat 256-bittisiä kokonaislukuja. Tietokenttä on siten jaettu viiteen osaan, joista jokaisessa on 256-bittisiä (64 heksadesimaalimerkkiä).

omistaja: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
kittyId:
000000000000000000000000000000000000000000000000000000000009fac1
matronId:
000000000000000000000000000000000000000000000000000000000009f80e
sireId:
0000000000000000000000000000000000000000000000000000000000089572
geenit:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Katso, mitä tarkoitin ”ETL: n toteuttamisella useista kiinteän leveyden tekstitiedostoista, joiden muodot on kuvattu vain niitä luoneen ohjelmiston lähdekoodissa”? :-)

Siirry kohtaan 2, jossa jaamme mielenkiintoisia tosiasioita, jotka tapasimme analysoidessamme CryptoKitties-pelitietoja!

Erityiset kiitokset Block Science -tiimille tutkimuksesta, oivalluksista ja arvosteluista.