Istraživanje CryptoKitties - Dio 1: Vađenje podataka

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

Ako ovo čitate, vjerojatno ste čuli za igru ​​koja je posljednjih nekoliko mjeseci privukla svačiju pažnju na mreži Ethereum: CryptoKitties!

Ukratko, igra se sastoji od prikupljanja virtualnih mačaka. Mačke stvaraju igrači koji mogu uzgajati dvije mačke kako bi stvorili novu. Svaka mačka ima svoj genetski slijed, koji određuje njihove fizičke osobine. Njihov genom je funkcija gena njihovih roditelja plus nešto slučajnosti. Uz uzgoj, Axiom Zen, kompanija koja stoji iza igre, može stvoriti i do 50 000 mačaka s unaprijed definiranim karakteristikama. Postoji tržište za kupnju i prodaju mačaka i još jedno za "iznajmljivanje" mačaka za uzgoj. Više o igri možete pročitati ovdje.

Block Science je tvrtka za tehnološka istraživanja i analitiku specijalizirana za dizajn i procjenu decentraliziranih ekonomskih sustava. Analiza aspekata ekonomije CryptoKitties činila se kao sjajna prilika za poboljšanje naših alata za vađenje podataka, istodobno dobivanje ruku na neke stvarne podatke iz stvarne (i živahne!) Decentralizirane aplikacije.

Ovaj je blog podijeljen u dva dijela:

  • Prvi dio (ovaj post) pokriva tehničke aspekte povezane s vađenjem i pretvaranjem podataka iz Ethereum blockchaina.
  • Drugi dio sadrži stvarnu analizu nekih podataka o igrama.

Izdvajanje podataka iz Ethereum Blockchaina

Iako je sve što se ikad dogodilo na mreži Ethereum zabilježeno na blockchainu, pretvaranje tih bitova u smislene podatke nije uvijek jednostavno. Jednostavno je izdvojiti podatke o transakcijama iz kojih se navodi da je s određenog blok računa A poslao neki eter (ETH) na račun B i odredio određenu cijenu plina za tu transakciju koja će biti obrađena. Međutim, kada radimo na transakcijama poslanim ugovorima, dekodiranje podataka blockchaina slično je implementaciji ETL-a iz više tekstualnih datoteka fiksne širine, čiji su formati opisani samo u izvornom kodu softvera koji ih je stvorio.

Transakcije koje pozivaju funkcije u pametnim ugovorima

Uzmimo za primjer transakciju poslanu na ugovor 0xb1690c08e213a35ed9bab7b318de14420fb57d8c sa sljedećim sadržajem u polju podataka

0x454a2ab300000000000000000000000000000000000000000000000000000000000871ad

Što to radi?

Prvi dio podatkovnog polja (0x454a2ab3) odnosi se na funkciju unutar pametnog ugovora koju poziva transakcija. To su prva četiri bajta hash-a funkcijskog potpisa, koji je definiran kao naziv funkcije, a slijede vrste podataka njegovih parametara.

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

Preostali bajti su vrijednosti parametara funkcije. O tome možete detaljno pročitati ovdje.

Čak i znajući ta 4 bajta, kako možemo odrediti koja se funkcija poziva ili koliko parametara ima? U ovom konkretnom slučaju, znamo da je ugovor 0xb1690c… pametni ugovor za aukcije CryptoKitties - tržište kupovine i prodaje mačaka. Budući da je njegov izvorni kod javno objavljen, znamo da ima funkciju koja se zove licitacija

/// Licitira na otvorenoj aukciji, dovršavajući aukciju i
/// prijenos vlasništva nad NFT-om ako je isporučeno dovoljno Ether-a.
/// param _tokenID: ID tokena za nadmetanje.
funkcionalna ponuda (uint256 _tokenId)

Ako izračunamo hash potpisa ponude funkcije, možemo vidjeti da su prva četiri bajta upravo ona koja su prisutna u podacima o transakciji.

keccak256 ("ponuda (uint256)") = 454a2ab3c602fd9…

A budući da funkcija uzima samo jedan argument, možemo reći da je sve što slijedi ta prva četiri bajta u podacima transakcije taj parametar. Drugim riječima, transakcija je nadmetala mačka broj 0x871ad (553389).

Pametni ugovori koji bilježe podatke

Uobičajeni su pametni ugovori zapisivanje podataka tijekom njihovog izvršavanja. Dnevnici snimljeni ugovorom mogu se dobiti pozivanjem JSON RPC API eth_getlogs metode. Kao što je slučaj s transakcijama koje nazivaju ugovorne funkcije, moramo znati izvorni kod ugovora kako bismo dekodirali podatke koje vraća ovaj API. Na primjer, što znači zapisnik sa sljedećim podacima?

blok broj: 0x51968f
tema: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] Podaci: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Zapisi se bilježe kad ugovor pokrene događaj. Prvi element polja tema (koji u našem primjeru ima samo jedan element) je hash potpisa događaja. U slučaju CryptoKitties-a, dnevnici se bilježe kada mačka zatrudni i, primjerice, kada se rodi mačka.

/// Trudni događaj pokreće se kad se dvije mačke uspješno uzgajaju
/// i tajmer trudnoće počinje za matronu.
događaj Trudni (vlasnik adrese, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// Rođenje se otvara kad god uđe novo mače
/// postojanje. To očigledno uključuje i svaki put kada se mačka stvori
/// putem metode GiveBirth, ali se također naziva kada
/// stvorena je nova gen0 mačka.
događaj Rođenje (vlasnik adrese, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 geni);

Pogledajte kako hash potpisa rođenja događaja odgovara vrijednosti u zapisniku u našem primjeru

keccak256 ("Rođenje (adresa, uint256, uint256, uint256, uint256)") = 0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5

Zasad znamo da se na bloku broj 51968F (5346959) rodila kriptovaluta! Sljedeći je korak u našem postupku dekodiranja podijeljenje podatkovnog polja prema pet parametara događaja Rođenja. Prvi parametar je Ethereum adresa koja je dugačka 160 bita, ali je kodirana s 256 bita (nula su dodana s lijeve strane adrese). Ostali su parametri 256-bitni cijeli brojevi. Podatkovno polje je stoga podijeljeno u 5 dijelova, svaki s 256-bitnim (64 heksadecimalna znakova).

vlasnik: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
kittyId:
000000000000000000000000000000000000000000000000000000000009fac1
matronId:
000000000000000000000000000000000000000000000000000000000009f80e
sireId:
0000000000000000000000000000000000000000000000000000000000089572
geni:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Vidite što sam mislio pod "implementacijom ETL-a iz tekstualnih datoteka višestruke širine čiji su formati opisani samo u izvornom kodu softvera koji ih je stvorio"? :-)

Pređite na drugi dio gdje ćemo podijeliti neke zanimljive činjenice na koje smo naišli dok analiziramo podatke CryptoKitties igara!

Posebna zahvala timu Block Science na istraživanju, uvidima i pregledima.