Preskúmanie CryptoKitties - Časť 1: Extrakcia dát

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

Ak toto čítate, pravdepodobne ste už počuli o hre, ktorá v posledných mesiacoch upútala pozornosť všetkých na sieti Ethereum: CryptoKitties!

Stručne povedané, hra pozostáva zo zhromažďovania virtuálnych mačiek. Mačky sú tvorené hráčmi hry, ktorí môžu chovať dve mačky, aby vytvorili novú. Každá mačka má svoju vlastnú genetickú sekvenciu, ktorá určuje ich fyzikálne vlastnosti. Ich genóm je funkciou génov ich rodičov plus určitá náhodnosť. Okrem chovu môže spoločnosť Axiom Zen, spoločnosť za hrou, vytvoriť až 50 000 mačiek s preddefinovanými charakteristikami. Existuje trh na nákup a predaj mačiek a ďalší na „prenájom“ mačiek na chovné účely. Viac informácií o hre si môžete prečítať tu.

Block Science je spoločnosť zaoberajúca sa technologickým výskumom a analýzou, ktorá sa špecializuje na navrhovanie a hodnotenie decentralizovaných ekonomických systémov. Analýza aspektov ekonomiky CryptoKitties sa javila ako veľká príležitosť na vylepšenie našich nástrojov na extrakciu údajov a zároveň získanie rúk z niektorých údajov zo skutočného sveta zo živej (a živej!) Decentralizovanej aplikácie.

Tento blogový príspevok bol rozdelený na dve časti:

  • Časť 1 (tento príspevok) sa týka technických aspektov týkajúcich sa získavania a transformácie údajov z blockchainu Ethereum.
  • Časť 2 obsahuje aktuálnu analýzu niektorých herných údajov.

Extrakcia dát z Ethereum Blockchain

Aj keď je všetko, čo sa kedy stalo v sieti Ethereum, zaznamenané na blockchainu, premena týchto bitov na zmysluplné údaje nie je vždy jednoduchá. Je jednoduché extrahovať údaje o transakcii, pričom sa uvádza, že v danom blokovom účte A poslal nejaký éter (ETH) na účet B a stanovil určitú cenu plynu pre túto transakciu, ktorá sa má spracovať. Keď však pracujeme na transakciách zasielaných na zmluvy, dekódovanie údajov blockchainu je podobné implementácii ETL z viacerých textových súborov s pevnou šírkou, ktorých formáty sú opísané iba v zdrojovom kóde softvéru, ktorý ich vytvoril.

Transakcie, ktoré volajú funkcie v inteligentných zmluvách

Zoberme si napríklad transakciu odoslanú na zmluvu 0xb1690c08e213a35ed9bab7b318de14420fb57d8c s nasledujúcim obsahom v dátovom poli.

0x454a2ab300000000000000000000000000000000000000000000000000000000000871ad

Čo to robí?

Prvá časť dátového poľa (0x454a2ab3) sa týka funkcie vo vnútri inteligentnej zmluvy, ktorá sa volá transakciou. Toto sú prvé štyri bajty hashu podpisu funkcie, ktorý je definovaný ako názov funkcie, za ktorou nasledujú dátové typy jej parametrov.

keccak256 ( " (, <...>, )")

Zvyšné bajty sú hodnoty funkčných parametrov. Podrobne si o tom môžete prečítať tu.

Aj keď poznáme tieto 4 bajty, ako zistíme, ktorá funkcia sa volá alebo koľko parametrov má? V tomto konkrétnom prípade vieme, že zmluva 0xb1690c… je inteligentnou zmluvou o aukcii CryptoKitties - trhom nákupu a predaja mačiek. A pretože jeho zdrojový kód bol zverejnený, vieme, že má funkciu nazývanú bid

/// Ponuky na otvorenú aukciu, dokončenie aukcie a
/// prevod vlastníctva NFT, ak je k dispozícii dostatok éteru.
/// param _tokenID: ID tokenu, ktorý sa má ponúknuť.
funkčná ponuka (uint256 _tokenId)

Ak vypočítame hash podpisu funkcie ponuky, môžeme vidieť, že prvé štyri bajty sú presne tie, ktoré sú obsiahnuté v transakčných údajoch.

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

A pretože funkcia má iba jeden argument, môžeme povedať, že všetko, čo nasleduje po týchto prvých štyroch bajtoch v údajoch o transakcii, je týmto parametrom. Inými slovami, transakcia je ponúkaná na malom čísle 0x871ad (553389).

Inteligentné zmluvy, ktoré zaznamenávajú informácie

Je bežné, že inteligentné zmluvy zaznamenávajú informácie počas ich vykonávania. Protokoly zaznamenané zmluvou je možné získať volaním metódy eth_getlogs API JSON RPC API. Rovnako ako v prípade transakcií, ktoré volajú na zmluvné funkcie, potrebujeme poznať zdrojový kód zmluvy, aby sme mohli dekódovať údaje vrátené týmto API. Čo napríklad znamená denník s nasledujúcimi údajmi?

blockNumber: 0x51968f
témy: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] Údaje: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Protokoly sa zaznamenávajú, keď zmluva vyvolá udalosť. Prvým prvkom poľa tém (ktorý má v našom príklade iba jeden prvok) je hash podpisu udalosti. V prípade CryptoKitties sa záznamy zaznamenávajú napríklad vtedy, keď mačka otehotnie a napríklad keď sa mačka narodí.

/ / / Tehotná udalosť je vyhodená, keď sa dve mačky úspešne množia
/// a tehotenský časovač začína pre matronku.
udalosť Tehotná (majiteľ adresy, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// Narodenie sa vyhodí vždy, keď príde nové mačiatko
/// existencia. To samozrejme zahŕňa vždy, keď je mačka vytvorená
/// prostredníctvom metódy giveBirth, ale nazýva sa tiež, keď
/// je vytvorená nová mačka gen0.
udalosť narodenia (majiteľ adresy, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 gény);

Pozrite sa, ako hash podpisu udalosti narodenia zodpovedá hodnote v denníku v našom príklade

keccak256 (“Narodenie (adresa, uint256, uint256, uint256, uint256)”) = 0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5

Doteraz vieme, že v bloku číslo 51968F (5346959) sa zrodila kryptokitta! Ďalším krokom v našom procese dekódovania je rozdelenie dátového poľa podľa piatich parametrov udalosti narodenia. Prvým parametrom je adresa Ethereum, ktorá je dlhá 160 bitov, ale je kódovaná 256 bitmi (naľavo od adresy sú pridané nuly). Ostatné parametre sú 256-bitové celé čísla. Dátové pole je preto rozdelené do 5 častí, každá s 256 bitmi (64 hexadecimálnych znakov).

majiteľ: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
kittyId:
000000000000000000000000000000000000000000000000000000000009fac1
matronId:
000000000000000000000000000000000000000000000000000000000009f80e
sireId:
0000000000000000000000000000000000000000000000000000000000089572
gény:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Čo znamená „implementácia ETL z viacerých textových súborov s pevnou šírkou, ktorých formáty sú opísané iba v zdrojovom kóde softvéru, ktorý ich vytvoril“? :-)

Prejdite na časť 2, kde sa budeme zdieľať niektoré zaujímavé skutočnosti, s ktorými sme sa stretli pri analýze herných údajov CryptoKitties!

Osobitné poďakovanie tímu Block Science za výskum, informácie a prehľady.